1: <?php
2:
3: 4: 5: 6: 7: 8: 9: 10: 11:
12:
13:
14:
15: 16: 17: 18: 19: 20: 21: 22:
23: abstract class NControl extends NPresenterComponent implements IPartiallyRenderable
24: {
25:
26: private $template;
27:
28:
29: private $invalidSnippets = array();
30:
31:
32: public $snippetMode;
33:
34:
35:
36:
37:
38:
39:
40: 41: 42:
43: final public function getTemplate()
44: {
45: if ($this->template === NULL) {
46: $value = $this->createTemplate();
47: if (!$value instanceof ITemplate && $value !== NULL) {
48: $class2 = get_class($value); $class = get_class($this);
49: throw new UnexpectedValueException("Object returned by $class::createTemplate() must be instance of ITemplate, '$class2' given.");
50: }
51: $this->template = $value;
52: }
53: return $this->template;
54: }
55:
56:
57:
58: 59: 60:
61: protected function createTemplate($class = NULL)
62: {
63: $template = $class ? new $class : new NFileTemplate;
64: $presenter = $this->getPresenter(FALSE);
65: $template->onPrepareFilters[] = callback($this, 'templatePrepareFilters');
66: $template->registerHelperLoader('NTemplateHelpers::loader');
67:
68:
69: $template->control = $this;
70: $template->presenter = $presenter;
71: if ($presenter instanceof NPresenter) {
72: $template->setCacheStorage($presenter->getContext()->templateCacheStorage);
73: $template->user = $presenter->getUser();
74: $template->netteHttpResponse = $presenter->getHttpResponse();
75: $template->netteCacheStorage = $presenter->getContext()->cacheStorage;
76: $template->baseUri = $template->baseUrl = rtrim($presenter->getHttpRequest()->getUrl()->getBaseUrl(), '/');
77: $template->basePath = preg_replace('#https?://[^/]+#A', '', $template->baseUrl);
78:
79:
80: if ($presenter->hasFlashSession()) {
81: $id = $this->getParamId('flash');
82: $template->flashes = $presenter->getFlashSession()->$id;
83: }
84: }
85: if (!isset($template->flashes) || !is_array($template->flashes)) {
86: $template->flashes = array();
87: }
88:
89: return $template;
90: }
91:
92:
93:
94: 95: 96: 97: 98:
99: public function templatePrepareFilters($template)
100: {
101: $template->registerFilter(new NLatteFilter);
102: }
103:
104:
105:
106: 107: 108: 109: 110:
111: public function getWidget($name)
112: {
113: return $this->getComponent($name);
114: }
115:
116:
117:
118: 119: 120: 121: 122: 123:
124: public function flashMessage($message, $type = 'info')
125: {
126: $id = $this->getParamId('flash');
127: $messages = $this->getPresenter()->getFlashSession()->$id;
128: $messages[] = $flash = (object) array(
129: 'message' => $message,
130: 'type' => $type,
131: );
132: $this->getTemplate()->flashes = $messages;
133: $this->getPresenter()->getFlashSession()->$id = $messages;
134: return $flash;
135: }
136:
137:
138:
139:
140:
141:
142:
143: 144: 145: 146: 147:
148: public function invalidateControl($snippet = NULL)
149: {
150: $this->invalidSnippets[$snippet] = TRUE;
151: }
152:
153:
154:
155: 156: 157: 158: 159:
160: public function validateControl($snippet = NULL)
161: {
162: if ($snippet === NULL) {
163: $this->invalidSnippets = array();
164:
165: } else {
166: unset($this->invalidSnippets[$snippet]);
167: }
168: }
169:
170:
171:
172: 173: 174: 175: 176:
177: public function isControlInvalid($snippet = NULL)
178: {
179: if ($snippet === NULL) {
180: if (count($this->invalidSnippets) > 0) {
181: return TRUE;
182:
183: } else {
184: foreach ($this->getComponents() as $component) {
185: if ($component instanceof IRenderable && $component->isControlInvalid()) {
186:
187: return TRUE;
188: }
189: }
190: return FALSE;
191: }
192:
193: } else {
194: return isset($this->invalidSnippets[NULL]) || isset($this->invalidSnippets[$snippet]);
195: }
196: }
197:
198:
199:
200: 201: 202: 203: 204:
205: public function getSnippetId($name = NULL)
206: {
207:
208: return 'snippet-' . $this->getUniqueId() . '-' . $name;
209: }
210:
211: }
212: