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