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