1: <?php
2:
3: 4: 5: 6:
7:
8: namespace NetteModule;
9:
10: use Nette;
11: use Nette\Application;
12: use Nette\Application\Responses;
13: use Nette\Http;
14: use Latte;
15:
16:
17: 18: 19:
20: class MicroPresenter extends Nette\Object implements Application\IPresenter
21: {
22:
23: private $context;
24:
25:
26: private $httpRequest;
27:
28:
29: private $router;
30:
31:
32: private $request;
33:
34:
35: public function __construct(Nette\DI\Container $context = NULL, Http\IRequest $httpRequest = NULL, Application\IRouter $router = NULL)
36: {
37: $this->context = $context;
38: $this->httpRequest = $httpRequest;
39: $this->router = $router;
40: }
41:
42:
43: 44: 45: 46:
47: public function getContext()
48: {
49: return $this->context;
50: }
51:
52:
53: 54: 55:
56: public function run(Application\Request $request)
57: {
58: $this->request = $request;
59:
60: if ($this->httpRequest && $this->router && !$this->httpRequest->isAjax() && ($request->isMethod('get') || $request->isMethod('head'))) {
61: $refUrl = clone $this->httpRequest->getUrl();
62: $url = $this->router->constructUrl($request, $refUrl->setPath($refUrl->getScriptPath()));
63: if ($url !== NULL && !$this->httpRequest->getUrl()->isEqual($url)) {
64: return new Responses\RedirectResponse($url, Http\IResponse::S301_MOVED_PERMANENTLY);
65: }
66: }
67:
68: $params = $request->getParameters();
69: if (!isset($params['callback'])) {
70: throw new Application\BadRequestException('Parameter callback is missing.');
71: }
72: $params['presenter'] = $this;
73: $callback = $params['callback'];
74: $reflection = Nette\Utils\Callback::toReflection(Nette\Utils\Callback::check($callback));
75: $params = Application\UI\PresenterComponentReflection::combineArgs($reflection, $params);
76:
77: if ($this->context) {
78: foreach ($reflection->getParameters() as $param) {
79: if ($param->getClassName()) {
80: unset($params[$param->getPosition()]);
81: }
82: }
83:
84: $params = Nette\DI\Helpers::autowireArguments($reflection, $params, $this->context);
85: $params['presenter'] = $this;
86: }
87:
88: $response = call_user_func_array($callback, $params);
89:
90: if (is_string($response)) {
91: $response = array($response, array());
92: }
93: if (is_array($response)) {
94: list($templateSource, $templateParams) = $response;
95: $response = $this->createTemplate()->setParameters($templateParams);
96: if (!$templateSource instanceof \SplFileInfo) {
97: $response->getLatte()->setLoader(new Latte\Loaders\StringLoader);
98: }
99: $response->setFile($templateSource);
100: }
101: if ($response instanceof Application\UI\ITemplate) {
102: return new Responses\TextResponse($response);
103: } else {
104: return $response;
105: }
106: }
107:
108:
109: 110: 111: 112: 113: 114:
115: public function createTemplate($class = NULL, $latteFactory = NULL)
116: {
117: $latte = $latteFactory ? $latteFactory() : $this->getContext()->getByType('Nette\Bridges\ApplicationLatte\ILatteFactory')->create();
118: $template = $class ? new $class : new Nette\Bridges\ApplicationLatte\Template($latte);
119:
120: $template->setParameters($this->request->getParameters());
121: $template->presenter = $this;
122: $template->context = $this->context;
123: if ($this->httpRequest) {
124: $url = $this->httpRequest->getUrl();
125: $template->baseUrl = rtrim($url->getBaseUrl(), '/');
126: $template->basePath = rtrim($url->getBasePath(), '/');
127: }
128: return $template;
129: }
130:
131:
132: 133: 134: 135: 136: 137:
138: public function redirectUrl($url, $code = Http\IResponse::S302_FOUND)
139: {
140: return new Responses\RedirectResponse($url, $code);
141: }
142:
143:
144: 145: 146: 147: 148: 149: 150:
151: public function error($message = NULL, $code = Http\IResponse::S404_NOT_FOUND)
152: {
153: throw new Application\BadRequestException($message, $code);
154: }
155:
156:
157: 158: 159:
160: public function getRequest()
161: {
162: return $this->request;
163: }
164:
165: }
166: