1: | <?php |
2: | /** |
3: | * Smarty Internal Plugin Smarty Template Base |
4: | * This file contains the basic shared methods for template handling |
5: | * |
6: | * @package Smarty |
7: | * @subpackage Template |
8: | * @author Uwe Tews |
9: | */ |
10: | |
11: | /** |
12: | * Class with shared smarty/template methods |
13: | * |
14: | * @package Smarty |
15: | * @subpackage Template |
16: | * |
17: | * @property int $_objType |
18: | * |
19: | * The following methods will be dynamically loaded by the extension handler when they are called. |
20: | * They are located in a corresponding Smarty_Internal_Method_xxxx class |
21: | * |
22: | * @method Smarty_Internal_TemplateBase addAutoloadFilters(mixed $filters, string $type = null) |
23: | * @method Smarty_Internal_TemplateBase addDefaultModifiers(mixed $modifiers) |
24: | * @method Smarty_Internal_TemplateBase addLiterals(mixed $literals) |
25: | * @method Smarty_Internal_TemplateBase createData(Smarty_Internal_Data $parent = null, string $name = null) |
26: | * @method array getAutoloadFilters(string $type = null) |
27: | * @method string getDebugTemplate() |
28: | * @method array getDefaultModifier() |
29: | * @method array getLiterals() |
30: | * @method array getTags(mixed $template = null) |
31: | * @method object getRegisteredObject(string $object_name) |
32: | * @method Smarty_Internal_TemplateBase registerCacheResource(string $name, Smarty_CacheResource $resource_handler) |
33: | * @method Smarty_Internal_TemplateBase registerClass(string $class_name, string $class_impl) |
34: | * @method Smarty_Internal_TemplateBase registerDefaultConfigHandler(callback $callback) |
35: | * @method Smarty_Internal_TemplateBase registerDefaultPluginHandler(callback $callback) |
36: | * @method Smarty_Internal_TemplateBase registerDefaultTemplateHandler(callback $callback) |
37: | * @method Smarty_Internal_TemplateBase registerResource(string $name, mixed $resource_handler) |
38: | * @method Smarty_Internal_TemplateBase setAutoloadFilters(mixed $filters, string $type = null) |
39: | * @method Smarty_Internal_TemplateBase setDebugTemplate(string $tpl_name) |
40: | * @method Smarty_Internal_TemplateBase setDefaultModifiers(mixed $modifiers) |
41: | * @method Smarty_Internal_TemplateBase setLiterals(mixed $literals) |
42: | * @method Smarty_Internal_TemplateBase unloadFilter(string $type, string $name) |
43: | * @method Smarty_Internal_TemplateBase unregisterCacheResource(string $name) |
44: | * @method Smarty_Internal_TemplateBase unregisterObject(string $object_name) |
45: | * @method Smarty_Internal_TemplateBase unregisterPlugin(string $type, string $name) |
46: | * @method Smarty_Internal_TemplateBase unregisterFilter(string $type, mixed $callback) |
47: | * @method Smarty_Internal_TemplateBase unregisterResource(string $name) |
48: | */ |
49: | abstract class Smarty_Internal_TemplateBase extends Smarty_Internal_Data |
50: | { |
51: | /** |
52: | * Set this if you want different sets of cache files for the same |
53: | * templates. |
54: | * |
55: | * @var string |
56: | */ |
57: | public $cache_id = null; |
58: | |
59: | /** |
60: | * Set this if you want different sets of compiled files for the same |
61: | * templates. |
62: | * |
63: | * @var string |
64: | */ |
65: | public $compile_id = null; |
66: | |
67: | /** |
68: | * caching enabled |
69: | * |
70: | * @var int |
71: | */ |
72: | public $caching = Smarty::CACHING_OFF; |
73: | |
74: | /** |
75: | * check template for modifications? |
76: | * |
77: | * @var int |
78: | */ |
79: | public $compile_check = Smarty::COMPILECHECK_ON; |
80: | |
81: | /** |
82: | * cache lifetime in seconds |
83: | * |
84: | * @var integer |
85: | */ |
86: | public $cache_lifetime = 3600; |
87: | |
88: | /** |
89: | * Array of source information for known template functions |
90: | * |
91: | * @var array |
92: | */ |
93: | public $tplFunctions = array(); |
94: | |
95: | /** |
96: | * universal cache |
97: | * |
98: | * @var array() |
99: | */ |
100: | public $_cache = array(); |
101: | |
102: | /** |
103: | * fetches a rendered Smarty template |
104: | * |
105: | * @param string $template the resource handle of the template file or template object |
106: | * @param mixed $cache_id cache id to be used with this template |
107: | * @param mixed $compile_id compile id to be used with this template |
108: | * @param object $parent next higher level of Smarty variables |
109: | * |
110: | * @throws Exception |
111: | * @throws SmartyException |
112: | * @return string rendered template output |
113: | */ |
114: | public function fetch($template = null, $cache_id = null, $compile_id = null, $parent = null) |
115: | { |
116: | $result = $this->_execute($template, $cache_id, $compile_id, $parent, 0); |
117: | return $result === null ? ob_get_clean() : $result; |
118: | } |
119: | |
120: | /** |
121: | * displays a Smarty template |
122: | * |
123: | * @param string $template the resource handle of the template file or template object |
124: | * @param mixed $cache_id cache id to be used with this template |
125: | * @param mixed $compile_id compile id to be used with this template |
126: | * @param object $parent next higher level of Smarty variables |
127: | * |
128: | * @throws \Exception |
129: | * @throws \SmartyException |
130: | */ |
131: | public function display($template = null, $cache_id = null, $compile_id = null, $parent = null) |
132: | { |
133: | // display template |
134: | $this->_execute($template, $cache_id, $compile_id, $parent, 1); |
135: | } |
136: | |
137: | /** |
138: | * test if cache is valid |
139: | * |
140: | * @api Smarty::isCached() |
141: | * @link http://www.smarty.net/docs/en/api.is.cached.tpl |
142: | * |
143: | * @param null|string|\Smarty_Internal_Template $template the resource handle of the template file or template |
144: | * object |
145: | * @param mixed $cache_id cache id to be used with this template |
146: | * @param mixed $compile_id compile id to be used with this template |
147: | * @param object $parent next higher level of Smarty variables |
148: | * |
149: | * @return bool cache status |
150: | * @throws \Exception |
151: | * @throws \SmartyException |
152: | */ |
153: | public function isCached($template = null, $cache_id = null, $compile_id = null, $parent = null) |
154: | { |
155: | return $this->_execute($template, $cache_id, $compile_id, $parent, 2); |
156: | } |
157: | |
158: | /** |
159: | * fetches a rendered Smarty template |
160: | * |
161: | * @param string $template the resource handle of the template file or template object |
162: | * @param mixed $cache_id cache id to be used with this template |
163: | * @param mixed $compile_id compile id to be used with this template |
164: | * @param object $parent next higher level of Smarty variables |
165: | * @param string $function function type 0 = fetch, 1 = display, 2 = isCache |
166: | * |
167: | * @return mixed |
168: | * @throws \Exception |
169: | * @throws \SmartyException |
170: | */ |
171: | private function _execute($template, $cache_id, $compile_id, $parent, $function) |
172: | { |
173: | $smarty = $this->_getSmartyObj(); |
174: | $saveVars = true; |
175: | if ($template === null) { |
176: | if (!$this->_isTplObj()) { |
177: | throw new SmartyException($function . '():Missing \'$template\' parameter'); |
178: | } else { |
179: | $template = $this; |
180: | } |
181: | } elseif (is_object($template)) { |
182: | /* @var Smarty_Internal_Template $template */ |
183: | if (!isset($template->_objType) || !$template->_isTplObj()) { |
184: | throw new SmartyException($function . '():Template object expected'); |
185: | } |
186: | } else { |
187: | // get template object |
188: | $saveVars = false; |
189: | $template = $smarty->createTemplate($template, $cache_id, $compile_id, $parent ? $parent : $this, false); |
190: | if ($this->_objType === 1) { |
191: | // set caching in template object |
192: | $template->caching = $this->caching; |
193: | } |
194: | } |
195: | // make sure we have integer values |
196: | $template->caching = (int)$template->caching; |
197: | // fetch template content |
198: | $level = ob_get_level(); |
199: | try { |
200: | $_smarty_old_error_level = |
201: | isset($smarty->error_reporting) ? error_reporting($smarty->error_reporting) : null; |
202: | if ($this->_objType === 2) { |
203: | /* @var Smarty_Internal_Template $this */ |
204: | $template->tplFunctions = $this->tplFunctions; |
205: | $template->inheritance = $this->inheritance; |
206: | } |
207: | /* @var Smarty_Internal_Template $parent */ |
208: | if (isset($parent->_objType) && ($parent->_objType === 2) && !empty($parent->tplFunctions)) { |
209: | $template->tplFunctions = array_merge($parent->tplFunctions, $template->tplFunctions); |
210: | } |
211: | if ($function === 2) { |
212: | if ($template->caching) { |
213: | // return cache status of template |
214: | if (!isset($template->cached)) { |
215: | $template->loadCached(); |
216: | } |
217: | $result = $template->cached->isCached($template); |
218: | Smarty_Internal_Template::$isCacheTplObj[ $template->_getTemplateId() ] = $template; |
219: | } else { |
220: | return false; |
221: | } |
222: | } else { |
223: | if ($saveVars) { |
224: | $savedTplVars = $template->tpl_vars; |
225: | $savedConfigVars = $template->config_vars; |
226: | } |
227: | ob_start(); |
228: | $template->_mergeVars(); |
229: | if (!empty(Smarty::$global_tpl_vars)) { |
230: | $template->tpl_vars = array_merge(Smarty::$global_tpl_vars, $template->tpl_vars); |
231: | } |
232: | $result = $template->render(false, $function); |
233: | $template->_cleanUp(); |
234: | if ($saveVars) { |
235: | $template->tpl_vars = $savedTplVars; |
236: | $template->config_vars = $savedConfigVars; |
237: | } else { |
238: | if (!$function && !isset(Smarty_Internal_Template::$tplObjCache[ $template->templateId ])) { |
239: | $template->parent = null; |
240: | $template->tpl_vars = $template->config_vars = array(); |
241: | Smarty_Internal_Template::$tplObjCache[ $template->templateId ] = $template; |
242: | } |
243: | } |
244: | } |
245: | if (isset($_smarty_old_error_level)) { |
246: | error_reporting($_smarty_old_error_level); |
247: | } |
248: | return $result; |
249: | } catch (Exception $e) { // PHP 5.x specific |
250: | while (ob_get_level() > $level) { |
251: | ob_end_clean(); |
252: | } |
253: | if (isset($_smarty_old_error_level)) { |
254: | error_reporting($_smarty_old_error_level); |
255: | } |
256: | throw $e; |
257: | } catch (Throwable $e) { // For PHP ^7.0 this can also catch Errors |
258: | while (ob_get_level() > $level) { |
259: | ob_end_clean(); |
260: | } |
261: | if (isset($_smarty_old_error_level)) { |
262: | error_reporting($_smarty_old_error_level); |
263: | } |
264: | throw $e; |
265: | } |
266: | } |
267: | |
268: | /** |
269: | * Registers plugin to be used in templates |
270: | * |
271: | * @api Smarty::registerPlugin() |
272: | * @link http://www.smarty.net/docs/en/api.register.plugin.tpl |
273: | * |
274: | * @param string $type plugin type |
275: | * @param string $name name of template tag |
276: | * @param callable $callback PHP callback to register |
277: | * @param bool $cacheable if true (default) this function is cache able |
278: | * @param mixed $cache_attr caching attributes if any |
279: | * |
280: | * @return \Smarty|\Smarty_Internal_Template |
281: | * @throws \SmartyException |
282: | */ |
283: | public function registerPlugin($type, $name, $callback, $cacheable = true, $cache_attr = null) |
284: | { |
285: | return $this->ext->registerPlugin->registerPlugin($this, $type, $name, $callback, $cacheable, $cache_attr); |
286: | } |
287: | |
288: | /** |
289: | * load a filter of specified type and name |
290: | * |
291: | * @api Smarty::loadFilter() |
292: | * @link http://www.smarty.net/docs/en/api.load.filter.tpl |
293: | * |
294: | * @param string $type filter type |
295: | * @param string $name filter name |
296: | * |
297: | * @return bool |
298: | * @throws \SmartyException |
299: | */ |
300: | public function loadFilter($type, $name) |
301: | { |
302: | return $this->ext->loadFilter->loadFilter($this, $type, $name); |
303: | } |
304: | |
305: | /** |
306: | * Registers a filter function |
307: | * |
308: | * @api Smarty::registerFilter() |
309: | * @link http://www.smarty.net/docs/en/api.register.filter.tpl |
310: | * |
311: | * @param string $type filter type |
312: | * @param callable $callback |
313: | * @param string|null $name optional filter name |
314: | * |
315: | * @return \Smarty|\Smarty_Internal_Template |
316: | * @throws \SmartyException |
317: | */ |
318: | public function registerFilter($type, $callback, $name = null) |
319: | { |
320: | return $this->ext->registerFilter->registerFilter($this, $type, $callback, $name); |
321: | } |
322: | |
323: | /** |
324: | * Registers object to be used in templates |
325: | * |
326: | * @api Smarty::registerObject() |
327: | * @link http://www.smarty.net/docs/en/api.register.object.tpl |
328: | * |
329: | * @param string $object_name |
330: | * @param object $object the referenced PHP object to register |
331: | * @param array $allowed_methods_properties list of allowed methods (empty = all) |
332: | * @param bool $format smarty argument format, else traditional |
333: | * @param array $block_methods list of block-methods |
334: | * |
335: | * @return \Smarty|\Smarty_Internal_Template |
336: | * @throws \SmartyException |
337: | */ |
338: | public function registerObject( |
339: | $object_name, |
340: | $object, |
341: | $allowed_methods_properties = array(), |
342: | $format = true, |
343: | $block_methods = array() |
344: | ) { |
345: | return $this->ext->registerObject->registerObject( |
346: | $this, |
347: | $object_name, |
348: | $object, |
349: | $allowed_methods_properties, |
350: | $format, |
351: | $block_methods |
352: | ); |
353: | } |
354: | |
355: | /** |
356: | * @param int $compile_check |
357: | */ |
358: | public function setCompileCheck($compile_check) |
359: | { |
360: | $this->compile_check = (int)$compile_check; |
361: | } |
362: | |
363: | /** |
364: | * @param int $caching |
365: | */ |
366: | public function setCaching($caching) |
367: | { |
368: | $this->caching = (int)$caching; |
369: | } |
370: | |
371: | /** |
372: | * @param int $cache_lifetime |
373: | */ |
374: | public function setCacheLifetime($cache_lifetime) |
375: | { |
376: | $this->cache_lifetime = $cache_lifetime; |
377: | } |
378: | |
379: | /** |
380: | * @param string $compile_id |
381: | */ |
382: | public function setCompileId($compile_id) |
383: | { |
384: | $this->compile_id = $compile_id; |
385: | } |
386: | |
387: | /** |
388: | * @param string $cache_id |
389: | */ |
390: | public function setCacheId($cache_id) |
391: | { |
392: | $this->cache_id = $cache_id; |
393: | } |
394: | } |
395: |