1: <?php
2:
3: 4: 5: 6: 7: 8: 9: 10:
11:
12: namespace Nette\Application;
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:
35:
36:
37:
38:
39: 40: 41:
42: final public function getTemplate()
43: {
44: if ($this->template === NULL) {
45: $value = $this->createTemplate();
46: if (!$value instanceof Nette\Templates\ITemplate && $value !== NULL) {
47: $class = get_class($value);
48: throw new \UnexpectedValueException("Object returned by {$this->reflection->name}::createTemplate() must be instance of Nette\\Templates\\ITemplate, '$class' given.");
49: }
50: $this->template = $value;
51: }
52: return $this->template;
53: }
54:
55:
56:
57: 58: 59:
60: protected function createTemplate()
61: {
62: $template = new Nette\Templates\FileTemplate;
63: $presenter = $this->getPresenter(FALSE);
64: $template->onPrepareFilters[] = callback($this, 'templatePrepareFilters');
65:
66: 67: $template->control = $this;
68: $template->presenter = $presenter;
69: $template->user = Nette\Environment::getUser();
70: $template->baseUri = rtrim(Nette\Environment::getVariable('baseUri', NULL), '/');
71: $template->basePath = preg_replace('#https?://[^/]+#A', '', $template->baseUri);
72:
73: 74: if ($presenter !== NULL && $presenter->hasFlashSession()) {
75: $id = $this->getParamId('flash');
76: $template->flashes = $presenter->getFlashSession()->$id;
77: }
78: if (!isset($template->flashes) || !is_array($template->flashes)) {
79: $template->flashes = array();
80: }
81:
82: 83: $template->registerHelper('escape', 'Nette\Templates\TemplateHelpers::escapeHtml');
84: $template->registerHelper('escapeUrl', 'rawurlencode');
85: $template->registerHelper('stripTags', 'strip_tags');
86: $template->registerHelper('nl2br', 'nl2br');
87: $template->registerHelper('substr', 'iconv_substr');
88: $template->registerHelper('repeat', 'str_repeat');
89: $template->registerHelper('replaceRE', 'Nette\String::replace');
90: $template->registerHelper('implode', 'implode');
91: $template->registerHelper('number', 'number_format');
92: $template->registerHelperLoader('Nette\Templates\TemplateHelpers::loader');
93:
94: return $template;
95: }
96:
97:
98:
99: 100: 101: 102: 103:
104: public function templatePrepareFilters($template)
105: {
106: 107: $template->registerFilter(new Nette\Templates\LatteFilter);
108: }
109:
110:
111:
112: 113: 114: 115: 116:
117: public function getWidget($name)
118: {
119: return $this->getComponent($name);
120: }
121:
122:
123:
124: 125: 126: 127: 128: 129:
130: public function flashMessage($message, $type = 'info')
131: {
132: $id = $this->getParamId('flash');
133: $messages = $this->getPresenter()->getFlashSession()->$id;
134: $messages[] = $flash = (object) array(
135: 'message' => $message,
136: 'type' => $type,
137: );
138: $this->getTemplate()->flashes = $messages;
139: $this->getPresenter()->getFlashSession()->$id = $messages;
140: return $flash;
141: }
142:
143:
144:
145:
146:
147:
148:
149: 150: 151: 152: 153:
154: public function invalidateControl($snippet = NULL)
155: {
156: $this->invalidSnippets[$snippet] = TRUE;
157: }
158:
159:
160:
161: 162: 163: 164: 165:
166: public function validateControl($snippet = NULL)
167: {
168: if ($snippet === NULL) {
169: $this->invalidSnippets = array();
170:
171: } else {
172: unset($this->invalidSnippets[$snippet]);
173: }
174: }
175:
176:
177:
178: 179: 180: 181: 182:
183: public function isControlInvalid($snippet = NULL)
184: {
185: if ($snippet === NULL) {
186: if (count($this->invalidSnippets) > 0) {
187: return TRUE;
188:
189: } else {
190: foreach ($this->getComponents() as $component) {
191: if ($component instanceof IRenderable && $component->isControlInvalid()) {
192: 193: return TRUE;
194: }
195: }
196: return FALSE;
197: }
198:
199: } else {
200: return isset($this->invalidSnippets[NULL]) || isset($this->invalidSnippets[$snippet]);
201: }
202: }
203:
204:
205:
206: 207: 208: 209: 210:
211: public function getSnippetId($name = NULL)
212: {
213: 214: return 'snippet-' . $this->getUniqueId() . '-' . $name;
215: }
216:
217: }
218: