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