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