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: class MicroPresenter extends Nette\Object implements Application\IPresenter
27: {
28:
29: private $context;
30:
31:
32: private $request;
33:
34:
35:
36: 37: 38: 39:
40: public function run(Application\Request $request)
41: {
42: $this->request = $request;
43:
44: $httpRequest = $this->context->httpRequest;
45: if (!$httpRequest->isAjax() && ($request->isMethod('get') || $request->isMethod('head'))) {
46: $refUrl = clone $httpRequest->getUrl();
47: $url = $this->context->router->constructUrl($request, $refUrl->setPath($refUrl->getScriptPath()));
48: if ($url !== NULL && !$httpRequest->getUrl()->isEqual($url)) {
49: return new Responses\RedirectResponse($url, Http\IResponse::S301_MOVED_PERMANENTLY);
50: }
51: }
52:
53: $params = $request->getParams();
54: if (!isset($params['callback'])) {
55: return;
56: }
57: $params['presenter'] = $this;
58: $response = callback($params['callback'])->invokeNamedArgs($params);
59:
60: if (is_string($response)) {
61: $response = array($response, array());
62: }
63: if (is_array($response)) {
64: if ($response instanceof \SplFileInfo) {
65: $response = $this->createTemplate('Nette\Templating\FileTemplate')
66: ->setParams($response[1])->setFile($response[0]);
67: } else {
68: $response = $this->createTemplate('Nette\Templating\Template')
69: ->setParams($response[1])->setSource($response[0]);
70: }
71: }
72: if ($response instanceof Nette\Templating\ITemplate) {
73: return new Responses\TextResponse($response);
74: } else {
75: return $response;
76: }
77: }
78:
79:
80:
81: 82: 83: 84: 85: 86:
87: public function createTemplate($class = NULL, $latteFactory = NULL)
88: {
89: $template = $class ? new $class : new Nette\Templating\FileTemplate;
90:
91: $template->setParams($this->request->getParams());
92: $template->presenter = $this;
93: $template->context = $context = $this->context;
94: $url = $context->httpRequest->getUrl();
95: $template->baseUrl = rtrim($url->getBaseUrl(), '/');
96: $template->basePath = rtrim($url->getBasePath(), '/');
97:
98: $template->registerHelperLoader('Nette\Templating\DefaultHelpers::loader');
99: $template->setCacheStorage($context->templateCacheStorage);
100: $template->onPrepareFilters[] = function($template) use ($latteFactory, $context) {
101: $template->registerFilter($latteFactory ? $latteFactory() : new Nette\Latte\Engine);
102: };
103: return $template;
104: }
105:
106:
107:
108: 109: 110: 111: 112: 113:
114: public function redirectUrl($url, $code = Http\IResponse::S302_FOUND)
115: {
116: return new Responses\RedirectResponse($url, $code);
117: }
118:
119:
120:
121: 122: 123: 124: 125: 126: 127:
128: public function error($code, $message = NULL)
129: {
130: throw new Application\BadRequestException($message, $code);
131: }
132:
133:
134:
135: 136: 137:
138: public function getRequest()
139: {
140: return $this->request;
141: }
142:
143:
144:
145:
146:
147:
148:
149: 150: 151: 152:
153: public function setContext(Nette\DI\IContainer $context)
154: {
155: $this->context = $context;
156: return $this;
157: }
158:
159:
160:
161: 162: 163: 164:
165: final public function getContext()
166: {
167: return $this->context;
168: }
169:
170: }
171: