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