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