1: <?php
2:
3: 4: 5: 6: 7:
8:
9:
10:
11: 12: 13: 14: 15: 16: 17: 18:
19: class Nette_MicroPresenter extends NObject implements IPresenter
20: {
21:
22: private $context;
23:
24:
25: private $request;
26:
27:
28: public function __construct(NDIContainer $context)
29: {
30: $this->context = $context;
31: }
32:
33:
34: 35: 36: 37:
38: public function getContext()
39: {
40: return $this->context;
41: }
42:
43:
44: 45: 46:
47: public function run(NPresenterRequest $request)
48: {
49: $this->request = $request;
50:
51: $httpRequest = $this->context->getByType('IHttpRequest');
52: if (!$httpRequest->isAjax() && ($request->isMethod('get') || $request->isMethod('head'))) {
53: $refUrl = clone $httpRequest->getUrl();
54: $url = $this->context->getService('router')->constructUrl($request, $refUrl->setPath($refUrl->getScriptPath()));
55: if ($url !== NULL && !$httpRequest->getUrl()->isEqual($url)) {
56: return new NRedirectResponse($url, IHttpResponse::S301_MOVED_PERMANENTLY);
57: }
58: }
59:
60: $params = $request->getParameters();
61: $callback = isset($params['callback']) ? $params['callback'] : null;
62: if (!$callback instanceof Closure) {
63: throw new NBadRequestException('Parameter callback is not a valid closure.');
64: }
65: $params['presenter'] = $this;
66: $callback = new NCallback($callback);
67: $response = $callback->invokeArgs(NPresenterComponentReflection::combineArgs($callback->toReflection(), $params));
68:
69: if (is_string($response)) {
70: $response = array($response, array());
71: }
72: if (is_array($response)) {
73: if ($response[0] instanceof SplFileInfo) {
74: $response = $this->createTemplate('NFileTemplate')
75: ->setParameters($response[1])->setFile($response[0]);
76: } else {
77: $response = $this->createTemplate('NTemplate')
78: ->setParameters($response[1])->setSource($response[0]);
79: }
80: }
81: if ($response instanceof ITemplate) {
82: return new NTextResponse($response);
83: } else {
84: return $response;
85: }
86: }
87:
88:
89: 90: 91: 92: 93: 94:
95: public function createTemplate($class = NULL, $latteFactory = NULL)
96: {
97: $template = $class ? new $class : new NFileTemplate;
98:
99: $template->setParameters($this->request->getParameters());
100: $template->presenter = $this;
101: $template->context = $context = $this->context;
102: $url = $context->getByType('IHttpRequest')->getUrl();
103: $template->baseUrl = rtrim($url->getBaseUrl(), '/');
104: $template->basePath = rtrim($url->getBasePath(), '/');
105:
106: $template->registerHelperLoader('NTemplateHelpers::loader');
107: $template->setCacheStorage($context->getService('nette.templateCacheStorage'));
108: $template->onPrepareFilters[] = create_function('ITemplate $template', 'extract($GLOBALS[0]['.array_push($GLOBALS[0], array('latteFactory'=>$latteFactory)).'-1], EXTR_REFS);
109: $template->registerFilter($latteFactory ? $latteFactory() : new NLatteFilter);
110: ');
111: return $template;
112: }
113:
114:
115: 116: 117: 118: 119: 120:
121: public function redirectUrl($url, $code = IHttpResponse::S302_FOUND)
122: {
123: return new NRedirectResponse($url, $code);
124: }
125:
126:
127: 128: 129: 130: 131: 132: 133:
134: public function error($message = NULL, $code = IHttpResponse::S404_NOT_FOUND)
135: {
136: throw new NBadRequestException($message, $code);
137: }
138:
139:
140: 141: 142:
143: public function getRequest()
144: {
145: return $this->request;
146: }
147:
148: }
149: