1: <?php
2:
3: 4: 5: 6: 7: 8: 9: 10:
11:
12: namespace NetteModule;
13:
14: use Nette,
15: Nette\Application,
16: Nette\Application\Responses,
17: Nette\Http;
18:
19:
20: 21: 22: 23: 24: 25: 26:
27: class MicroPresenter extends Nette\Object implements Application\IPresenter
28: {
29:
30: private $context;
31:
32:
33: private $request;
34:
35:
36: public function __construct(Nette\DI\Container $context)
37: {
38: $this->context = $context;
39: }
40:
41:
42: 43: 44: 45:
46: final public function getContext()
47: {
48: return $this->context;
49: }
50:
51:
52: 53: 54:
55: public function run(Application\Request $request)
56: {
57: $this->request = $request;
58:
59: $httpRequest = $this->context->getByType('Nette\Http\IRequest');
60: if (!$httpRequest->isAjax() && ($request->isMethod('get') || $request->isMethod('head'))) {
61: $refUrl = clone $httpRequest->getUrl();
62: $url = $this->context->getService('router')->constructUrl($request, $refUrl->setPath($refUrl->getScriptPath()));
63: if ($url !== NULL && !$httpRequest->getUrl()->isEqual($url)) {
64: return new Responses\RedirectResponse($url, Http\IResponse::S301_MOVED_PERMANENTLY);
65: }
66: }
67:
68: $params = $request->getParameters();
69: if (!isset($params['callback'])) {
70: throw new Application\BadRequestException("Parameter callback is missing.");
71: }
72: $params['presenter'] = $this;
73: $callback = new Nette\Callback($params['callback']);
74: $response = $callback->invokeArgs(Application\UI\PresenterComponentReflection::combineArgs($callback->toReflection(), $params));
75:
76: if (is_string($response)) {
77: $response = array($response, array());
78: }
79: if (is_array($response)) {
80: if ($response[0] instanceof \SplFileInfo) {
81: $response = $this->createTemplate('Nette\Templating\FileTemplate')
82: ->setParameters($response[1])->setFile($response[0]);
83: } else {
84: $response = $this->createTemplate('Nette\Templating\Template')
85: ->setParameters($response[1])->setSource($response[0]);
86: }
87: }
88: if ($response instanceof Nette\Templating\ITemplate) {
89: return new Responses\TextResponse($response);
90: } else {
91: return $response;
92: }
93: }
94:
95:
96: 97: 98: 99: 100: 101:
102: public function createTemplate($class = NULL, $latteFactory = NULL)
103: {
104: $template = $class ? new $class : new Nette\Templating\FileTemplate;
105:
106: $template->setParameters($this->request->getParameters());
107: $template->presenter = $this;
108: $template->context = $context = $this->context;
109: $url = $context->getByType('Nette\Http\IRequest')->getUrl();
110: $template->baseUrl = rtrim($url->getBaseUrl(), '/');
111: $template->basePath = rtrim($url->getBasePath(), '/');
112:
113: $template->registerHelperLoader('Nette\Templating\Helpers::loader');
114: $template->setCacheStorage($context->getService('nette.templateCacheStorage'));
115: $template->onPrepareFilters[] = function($template) use ($latteFactory) {
116: $template->registerFilter($latteFactory ? $latteFactory() : new Nette\Latte\Engine);
117: };
118: return $template;
119: }
120:
121:
122: 123: 124: 125: 126: 127:
128: public function redirectUrl($url, $code = Http\IResponse::S302_FOUND)
129: {
130: return new Responses\RedirectResponse($url, $code);
131: }
132:
133:
134: 135: 136: 137: 138: 139: 140:
141: public function error($message = NULL, $code = Http\IResponse::S404_NOT_FOUND)
142: {
143: throw new Application\BadRequestException($message, $code);
144: }
145:
146:
147: 148: 149:
150: public function getRequest()
151: {
152: return $this->request;
153: }
154:
155: }
156: