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: abstract class Control extends PresenterComponent implements IPartiallyRenderable
26: {
27:
28: private $template;
29:
30:
31: private $invalidSnippets = array();
32:
33:
34: public $snippetMode;
35:
36:
37:
38:
39:
40:
41:
42: 43: 44:
45: final public function getTemplate()
46: {
47: if ($this->template === NULL) {
48: $value = $this->createTemplate();
49: if (!$value instanceof Nette\Templating\ITemplate && $value !== NULL) {
50: $class2 = get_class($value); $class = get_class($this);
51: throw new Nette\UnexpectedValueException("Object returned by $class::createTemplate() must be instance of Nette\\Templating\\ITemplate, '$class2' given.");
52: }
53: $this->template = $value;
54: }
55: return $this->template;
56: }
57:
58:
59:
60: 61: 62:
63: protected function createTemplate($class = NULL)
64: {
65: $template = $class ? new $class : new Nette\Templating\FileTemplate;
66: $presenter = $this->getPresenter(FALSE);
67: $template->onPrepareFilters[] = callback($this, 'templatePrepareFilters');
68: $template->registerHelperLoader('Nette\Templating\DefaultHelpers::loader');
69:
70:
71: $template->control = $this;
72: $template->presenter = $presenter;
73: if ($presenter instanceof Presenter) {
74: $template->setCacheStorage($presenter->getContext()->templateCacheStorage);
75: $template->user = $presenter->getUser();
76: $template->netteHttpResponse = $presenter->getHttpResponse();
77: $template->netteCacheStorage = $presenter->getContext()->cacheStorage;
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->getParamId('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(new Nette\Latte\Engine);
104: }
105:
106:
107:
108: 109: 110: 111: 112:
113: public function getWidget($name)
114: {
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->getParamId('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: foreach ($this->getComponents() as $component) {
187: if ($component instanceof IRenderable && $component->isControlInvalid()) {
188:
189: return TRUE;
190: }
191: }
192: return FALSE;
193: }
194:
195: } else {
196: return isset($this->invalidSnippets[NULL]) || isset($this->invalidSnippets[$snippet]);
197: }
198: }
199:
200:
201:
202: 203: 204: 205: 206:
207: public function getSnippetId($name = NULL)
208: {
209:
210: return 'snippet-' . $this->getUniqueId() . '-' . $name;
211: }
212:
213: }
214: