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