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