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