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