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:
63: protected function createTemplate($class = NULL)
64: {
65: $template = $class ? new $class : new NFileTemplate;
66: $presenter = $this->getPresenter(FALSE);
67: $template->onPrepareFilters[] = callback($this, 'templatePrepareFilters');
68: $template->registerHelperLoader('NTemplateHelpers::loader');
69:
70:
71: $template->control = $template->_control = $this;
72: $template->presenter = $template->_presenter = $presenter;
73: if ($presenter instanceof NPresenter) {
74: $template->setCacheStorage($presenter->getContext()->nette->templateCacheStorage);
75: $template->user = $presenter->getUser();
76: $template->netteHttpResponse = $presenter->getHttpResponse();
77: $template->netteCacheStorage = $presenter->getContext()->getByType('ICacheStorage');
78: $template->baseUri = $template->baseUrl = rtrim($presenter->getHttpRequest()->getUrl()->getBaseUrl(), '/');
79: $template->basePath = preg_replace('#https?://[^/]+#A', '', $template->baseUrl);
80:
81:
82: if ($presenter->hasFlashSession()) {
83: $id = $this->getParameterId('flash');
84: $template->flashes = $presenter->getFlashSession()->$id;
85: }
86: }
87: if (!isset($template->flashes) || !is_array($template->flashes)) {
88: $template->flashes = array();
89: }
90:
91: return $template;
92: }
93:
94:
95:
96: 97: 98: 99: 100:
101: public function templatePrepareFilters($template)
102: {
103: $template->registerFilter($this->getPresenter()->getContext()->nette->createLatte());
104: }
105:
106:
107:
108: 109: 110: 111: 112:
113: public function getWidget($name)
114: {
115: trigger_error(__METHOD__ . '() is deprecated, use getComponent() instead.', E_USER_WARNING);
116: return $this->getComponent($name);
117: }
118:
119:
120:
121: 122: 123: 124: 125: 126:
127: public function flashMessage($message, $type = 'info')
128: {
129: $id = $this->getParameterId('flash');
130: $messages = $this->getPresenter()->getFlashSession()->$id;
131: $messages[] = $flash = (object) array(
132: 'message' => $message,
133: 'type' => $type,
134: );
135: $this->getTemplate()->flashes = $messages;
136: $this->getPresenter()->getFlashSession()->$id = $messages;
137: return $flash;
138: }
139:
140:
141:
142:
143:
144:
145:
146: 147: 148: 149: 150:
151: public function invalidateControl($snippet = NULL)
152: {
153: $this->invalidSnippets[$snippet] = TRUE;
154: }
155:
156:
157:
158: 159: 160: 161: 162:
163: public function validateControl($snippet = NULL)
164: {
165: if ($snippet === NULL) {
166: $this->invalidSnippets = array();
167:
168: } else {
169: unset($this->invalidSnippets[$snippet]);
170: }
171: }
172:
173:
174:
175: 176: 177: 178: 179:
180: public function isControlInvalid($snippet = NULL)
181: {
182: if ($snippet === NULL) {
183: if (count($this->invalidSnippets) > 0) {
184: return TRUE;
185:
186: } else {
187: $queue = array($this);
188: do {
189: foreach (array_shift($queue)->getComponents() as $component) {
190: if ($component instanceof IRenderable) {
191: if ($component->isControlInvalid()) {
192:
193: return TRUE;
194: }
195:
196: } elseif ($component instanceof IComponentContainer) {
197: $queue[] = $component;
198: }
199: }
200: } while ($queue);
201:
202: return FALSE;
203: }
204:
205: } else {
206: return isset($this->invalidSnippets[NULL]) || isset($this->invalidSnippets[$snippet]);
207: }
208: }
209:
210:
211:
212: 213: 214: 215: 216:
217: public function getSnippetId($name = NULL)
218: {
219:
220: return 'snippet-' . $this->getUniqueId() . '-' . $name;
221: }
222:
223: }
224: