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