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