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(NDIContainer $context)
34: {
35: $this->context = $context;
36: }
37:
38:
39:
40: 41: 42: 43:
44: final public function getContext()
45: {
46: return $this->context;
47: }
48:
49:
50:
51: 52: 53: 54:
55: public function run(NPresenterRequest $request)
56: {
57: $this->request = $request;
58:
59: $httpRequest = $this->context->getByType('IHttpRequest');
60: if (!$httpRequest->isAjax() && ($request->isMethod('get') || $request->isMethod('head'))) {
61: $refUrl = clone $httpRequest->getUrl();
62: $url = $this->context->router->constructUrl($request, $refUrl->setPath($refUrl->getScriptPath()));
63: if ($url !== NULL && !$httpRequest->getUrl()->isEqual($url)) {
64: return new NRedirectResponse($url, IHttpResponse::S301_MOVED_PERMANENTLY);
65: }
66: }
67:
68: $params = $request->getParameters();
69: if (!isset($params['callback'])) {
70: return;
71: }
72: $params['presenter'] = $this;
73: $callback = callback($params['callback']);
74: $response = $callback->invokeArgs(NPresenterComponentReflection::combineArgs($callback->toReflection(), $params));
75:
76: if (is_string($response)) {
77: $response = array($response, array());
78: }
79: if (is_array($response)) {
80: if ($response[0] instanceof SplFileInfo) {
81: $response = $this->createTemplate('NFileTemplate')
82: ->setParameters($response[1])->setFile($response[0]);
83: } else {
84: $response = $this->createTemplate('NTemplate')
85: ->setParameters($response[1])->setSource($response[0]);
86: }
87: }
88: if ($response instanceof ITemplate) {
89: return new NTextResponse($response);
90: } else {
91: return $response;
92: }
93: }
94:
95:
96:
97: 98: 99: 100: 101: 102:
103: public function createTemplate($class = NULL, $latteFactory = NULL)
104: {
105: $template = $class ? new $class : new NFileTemplate;
106:
107: $template->setParameters($this->request->getParameters());
108: $template->presenter = $this;
109: $template->context = $context = $this->context;
110: $url = $context->getByType('IHttpRequest')->getUrl();
111: $template->baseUrl = rtrim($url->getBaseUrl(), '/');
112: $template->basePath = rtrim($url->getBasePath(), '/');
113:
114: $template->registerHelperLoader('NTemplateHelpers::loader');
115: $template->setCacheStorage($context->nette->templateCacheStorage);
116: $template->onPrepareFilters[] = create_function('$template', 'extract(NCFix::$vars['.NCFix::uses(array('latteFactory'=>$latteFactory,'context'=> $context)).'], EXTR_REFS);
117: $template->registerFilter($latteFactory ? $latteFactory() : new NLatteFilter);
118: ');
119: return $template;
120: }
121:
122:
123:
124: 125: 126: 127: 128: 129:
130: public function redirectUrl($url, $code = IHttpResponse::S302_FOUND)
131: {
132: return new NRedirectResponse($url, $code);
133: }
134:
135:
136:
137: 138: 139: 140: 141: 142: 143:
144: public function error($message = NULL, $code = IHttpResponse::S404_NOT_FOUND)
145: {
146: throw new NBadRequestException($message, $code);
147: }
148:
149:
150:
151: 152: 153:
154: public function getRequest()
155: {
156: return $this->request;
157: }
158:
159: }
160: