/** * Template code runtime function to set up an inline subtemplate * * @param string $template the resource handle of the template file * @param mixed $cache_id cache id to be used with this template * @param mixed $compile_id compile id to be used with this template * @param integer $caching cache mode * @param integer $cache_lifetime life time of cache data * @param array $data passed parameter template variables * @param int $parent_scope scope in which {include} should execute * @param string $hash nocache hash code * @param string $content_func name of content function * * @returns object template content */ public function getInlineSubTemplate($template, $cache_id, $compile_id, $caching, $cache_lifetime, $data, $parent_scope, $hash, $content_func) { $tpl = $this->setupSubTemplate($template, $cache_id, $compile_id, $caching, $cache_lifetime, $data, $parent_scope); $tpl->properties['nocache_hash'] = $hash; if (!isset($this->smarty->template_objects[$tpl->templateId])) { $this->smarty->template_objects[$tpl->templateId] = $tpl; } if ($this->smarty->debugging) { Smarty_Internal_Debug::start_template($tpl); Smarty_Internal_Debug::start_render($tpl); } $tpl->properties['unifunc'] = $content_func; $output = $tpl->getRenderedTemplateCode(); if ($this->smarty->debugging) { Smarty_Internal_Debug::end_template($tpl); Smarty_Internal_Debug::end_render($tpl); } if (!empty($tpl->properties['file_dependency'])) { $this->properties['file_dependency'] = array_merge($this->properties['file_dependency'], $tpl->properties['file_dependency']); } $this->properties['tpl_function'] = $tpl->properties['tpl_function']; return str_replace($tpl->properties['nocache_hash'], $this->properties['nocache_hash'], $output); }
/** * render template * * @param bool $display true: display, false: fetch * @param bool $isSubTemplate * @param bool $runOutputFilter * @param null|\Smarty_Internal_Context $_contextObjIn optional buffer object * * @return string * @throws \SmartyException */ public function render($display = false, $isSubTemplate = false, $runOutputFilter = true, Smarty_Internal_Context $_contextObjIn = null) { $level = ob_get_level(); try { if (!isset($this->source)) { $this->source = Smarty_Template_Source::load($this); } // checks if template exists if (!$this->source->exists) { if ($this->parent instanceof Smarty_Internal_Template) { $parent_resource = " in '{$this->parent->template_resource}'"; } else { $parent_resource = ''; } throw new SmartyException("Unable to load template {$this->source->type} '{$this->source->name}'{$parent_resource}"); } if ($this->smarty->debugging) { Smarty_Internal_Debug::start_template($this); } $this->context = $_contextObjIn === null ? new Smarty_Internal_Context() : $_contextObjIn; // merge all variable scopes into template if (!$isSubTemplate) { $savedErrorLevel = isset($this->smarty->error_reporting) ? error_reporting($this->smarty->error_reporting) : null; // save local variables $savedTplVars = $this->tpl_vars; $savedConfigVars = $this->config_vars; $ptr_array = array($this); $ptr = $this; while (isset($ptr->parent)) { $ptr_array[] = $ptr = $ptr->parent; } $ptr_array = array_reverse($ptr_array); $parent_ptr = reset($ptr_array); $tpl_vars = $parent_ptr->tpl_vars; $config_vars = $parent_ptr->config_vars; while ($parent_ptr = next($ptr_array)) { if (!empty($parent_ptr->tpl_vars)) { $tpl_vars = array_merge($tpl_vars, $parent_ptr->tpl_vars); } if (!empty($parent_ptr->config_vars)) { $config_vars = array_merge($config_vars, $parent_ptr->config_vars); } } if (!empty(Smarty::$global_tpl_vars)) { $tpl_vars = array_merge(Smarty::$global_tpl_vars, $tpl_vars); } $this->tpl_vars = $tpl_vars; $this->config_vars = $config_vars; } else { $savedTplVars = null; $savedConfigVars = null; $savedErrorLevel = null; } // dummy local smarty variable if (!isset($this->tpl_vars['smarty'])) { $this->tpl_vars['smarty'] = new Smarty_Variable(); } // disable caching for evaluated code if ($this->source->recompiled) { $this->caching = false; } $_caching = $this->caching == Smarty::CACHING_LIFETIME_CURRENT || $this->caching == Smarty::CACHING_LIFETIME_SAVED; // read from cache or render if ($_caching && !isset($this->cached)) { $this->cached = Smarty_Template_Cached::load($this); } if (!$_caching || !$this->cached->valid) { // render template (not loaded and not in cache) if ($this->smarty->debugging) { Smarty_Internal_Debug::start_render($this, null); } if (isset($this->cached)) { $_savedContext = $this->context; $this->context = new Smarty_Internal_Context(true); } if (!$this->source->uncompiled) { // render compiled code if (!isset($this->compiled)) { $this->compiled = Smarty_Template_Compiled::load($this); } $this->compiled->render($this); } else { $this->source->renderUncompiled($this); } if ($this->smarty->debugging) { Smarty_Internal_Debug::end_render($this, null); } // write to cache when necessary if ($_caching && !$this->source->recompiled) { if ($this->smarty->debugging) { Smarty_Internal_Debug::start_cache($this); } // write cache file content if ($runOutputFilter && !$this->context->hasNocacheCode && (isset($this->smarty->autoload_filters['output']) || isset($this->smarty->registered_filters['output']))) { $this->cached->writeCachedContent($this, $this->context, Smarty_Internal_Filter_Handler::runFilter('output', $this->context->getContent(), $this)); } else { $this->cached->writeCachedContent($this, $this->context); } $this->context = $_savedContext; $compile_check = $this->smarty->compile_check; $this->smarty->compile_check = false; if (!$this->cached->processed) { $this->cached->process($this); } $this->smarty->compile_check = $compile_check; $this->cached->compiledTplObj->getRenderedTemplateCode($this); if ($this->smarty->debugging) { Smarty_Internal_Debug::end_cache($this); } } } else { if ($this->smarty->debugging) { Smarty_Internal_Debug::start_cache($this); } $this->cached->render($this); if ($this->smarty->debugging) { Smarty_Internal_Debug::end_cache($this); } } if ($runOutputFilter && (!$this->caching || $this->context->hasNocacheCode || $this->source->recompiled) && (isset($this->smarty->autoload_filters['output']) || isset($this->smarty->registered_filters['output']))) { $this->context->flushBuffer(); $this->context->content = Smarty_Internal_Filter_Handler::runFilter('output', $this->context->content, $this); } // display or fetch if ($display) { $this->context->endBuffer(); if ($this->caching && $this->smarty->cache_modified_check) { $this->cached->cacheModifiedCheck($this, $this->context->content); } else { echo $this->context->content; } $this->context = null; } if ($this->smarty->debugging) { Smarty_Internal_Debug::end_template($this); } if ($display) { // debug output if ($this->smarty->debugging) { Smarty_Internal_Debug::display_debug($this, true); } } if (!$isSubTemplate) { // restore local variables $this->tpl_vars = $savedTplVars; $this->config_vars = $savedConfigVars; if (isset($savedErrorLevel)) { error_reporting($savedErrorLevel); } } } catch (Exception $e) { while (ob_get_level() > $level) { ob_end_clean(); } throw $e; } if (!$display && $_contextObjIn === null) { // return fetched content $this->context->endBuffer(); $output = $this->context->content; $this->context = null; return $output; } $this->context = null; return ''; }
/** * Template code runtime function to set up an inline subtemplate * * @param string $template the resource handle of the template file * @param mixed $cache_id cache id to be used with this template * @param mixed $compile_id compile id to be used with this template * @param integer $caching cache mode * @param integer $cache_lifetime life time of cache data * @param array $data passed parameter template variables * @param $_scope * @param $parent * @param string $content_func name of content function * * @param bool $newBuffer * * @return object template content */ public function getInlineSubTemplate($template, $cache_id, $compile_id, $caching, $cache_lifetime, $data, $_scope, $parent, $params, $newBuffer = false) { $tpl = $parent->smarty->setupTemplate($template, $cache_id, $compile_id, $caching, $cache_lifetime, $data, $_scope, $parent); $tpl->context = $newBuffer ? new Smarty_Internal_Context() : $parent->context; if ($tpl->smarty->debugging) { Smarty_Internal_Debug::start_template($tpl); Smarty_Internal_Debug::start_render($tpl); } $this->getRenderedTemplateCode($tpl, $params['func']); if ($tpl->smarty->debugging) { Smarty_Internal_Debug::end_template($tpl); Smarty_Internal_Debug::end_render($tpl); } if ($newBuffer) { $output = $tpl->context->getContent(); $tpl->context = null; return $output; } $tpl->context = null; return ''; }
/** * render template * @param bool $merge_tpl_vars if true parent template variables merged in to local scope * @param bool $no_output_filter if true do not run output filter * @param bool $display true: display, false: fetch null: subtemplate * @throws Exception * @throws SmartyException * @return string rendered template output */ public function render($merge_tpl_vars = FALSE, $no_output_filter = TRUE, $display = NULL) { $parentIsTpl = $this->parent instanceof Smarty_Internal_Template; if ($this->smarty->debugging) { Smarty_Internal_Debug::start_template($this, $display); } $save_tpl_vars = NULL; $save_config_vars = NULL; // merge all variable scopes into template if ($merge_tpl_vars) { // save local variables $save_tpl_vars = $this->tpl_vars; $save_config_vars = $this->config_vars; $ptr_array = [$this]; $ptr = $this; while (isset($ptr->parent)) { $ptr_array[] = $ptr = $ptr->parent; } $ptr_array = array_reverse($ptr_array); $parent_ptr = reset($ptr_array); $tpl_vars = $parent_ptr->tpl_vars; $config_vars = $parent_ptr->config_vars; while ($parent_ptr = next($ptr_array)) { if (!empty($parent_ptr->tpl_vars)) { $tpl_vars = array_merge($tpl_vars, $parent_ptr->tpl_vars); } if (!empty($parent_ptr->config_vars)) { $config_vars = array_merge($config_vars, $parent_ptr->config_vars); } } if (!empty(Smarty::$global_tpl_vars)) { $tpl_vars = array_merge(Smarty::$global_tpl_vars, $tpl_vars); } $this->tpl_vars = $tpl_vars; $this->config_vars = $config_vars; } // dummy local smarty variable if (!isset($this->tpl_vars['smarty'])) { $this->tpl_vars['smarty'] = new Smarty_Variable(); } $_smarty_old_error_level = isset($this->smarty->error_reporting) ? error_reporting($this->smarty->error_reporting) : NULL; // check URL debugging control if (!$this->smarty->debugging && $this->smarty->debugging_ctrl == 'URL') { Smarty_Internal_Debug::debugUrl($this); } if (!isset($this->source)) { $this->loadSource(); } // checks if template exists if (!$this->source->exists) { if ($parentIsTpl) { $parent_resource = " in '{$this->parent->template_resource}'"; } else { $parent_resource = ''; } throw new SmartyException("Unable to load template {$this->source->type} '{$this->source->name}'{$parent_resource}"); } // disable caching for evaluated code if ($this->source->recompiled) { $this->caching = FALSE; } // read from cache or render $isCacheTpl = $this->caching == Smarty::CACHING_LIFETIME_CURRENT || $this->caching == Smarty::CACHING_LIFETIME_SAVED; if ($isCacheTpl) { if (!isset($this->cached)) { $this->loadCached(); } $this->cached->isCached($this); } if (!$isCacheTpl || !$this->cached->valid) { if ($isCacheTpl) { $this->properties['tpl_function'] = []; } // render template (not loaded and not in cache) if ($this->smarty->debugging) { Smarty_Internal_Debug::start_render($this); } if (!$this->source->uncompiled) { // render compiled code if (!isset($this->compiled)) { $this->loadCompiled(); } $content = $this->compiled->render($this); } else { $content = $this->source->renderUncompiled($this); } if (!$this->source->recompiled && empty($this->properties['file_dependency'][$this->source->uid])) { $this->properties['file_dependency'][$this->source->uid] = [$this->source->filepath, $this->source->timestamp, $this->source->type]; } if ($parentIsTpl) { $this->parent->properties['file_dependency'] = array_merge($this->parent->properties['file_dependency'], $this->properties['file_dependency']); //$this->parent->properties['tpl_function'] = array_merge($this->parent->properties['tpl_function'], $this->properties['tpl_function']); } if ($this->smarty->debugging) { Smarty_Internal_Debug::end_render($this); } // write to cache when necessary if (!$this->source->recompiled && $isCacheTpl) { if ($this->smarty->debugging) { Smarty_Internal_Debug::start_cache($this); } $this->cached->updateCache($this, $content, $no_output_filter); $compile_check = $this->smarty->compile_check; $this->smarty->compile_check = FALSE; if ($parentIsTpl) { $this->properties['tpl_function'] = $this->parent->properties['tpl_function']; } if (!$this->cached->processed) { $this->cached->process($this); } $this->smarty->compile_check = $compile_check; $content = $this->getRenderedTemplateCode(); if ($this->smarty->debugging) { Smarty_Internal_Debug::end_cache($this); } } else { if (!empty($this->properties['nocache_hash']) && !empty($this->parent->properties['nocache_hash'])) { // replace nocache_hash $content = str_replace("{$this->properties['nocache_hash']}", $this->parent->properties['nocache_hash'], $content); $this->parent->has_nocache_code = $this->parent->has_nocache_code || $this->has_nocache_code; } } } else { if ($this->smarty->debugging) { Smarty_Internal_Debug::start_cache($this); } $content = $this->cached->render($this); if ($this->smarty->debugging) { Smarty_Internal_Debug::end_cache($this); } } if ((!$this->caching || $this->has_nocache_code || $this->source->recompiled) && !$no_output_filter && (isset($this->smarty->autoload_filters['output']) || isset($this->smarty->registered_filters['output']))) { $content = Smarty_Internal_Filter_Handler::runFilter('output', $content, $this); } if (isset($_smarty_old_error_level)) { error_reporting($_smarty_old_error_level); } // display or fetch if ($display) { if ($this->caching && $this->smarty->cache_modified_check) { $this->cached->cacheModifiedCheck($this, $content); } else { echo $content; } if ($this->smarty->debugging) { Smarty_Internal_Debug::end_template($this); } // debug output if ($this->smarty->debugging) { Smarty_Internal_Debug::display_debug($this, TRUE); } if ($merge_tpl_vars) { // restore local variables $this->tpl_vars = $save_tpl_vars; $this->config_vars = $save_config_vars; } return ''; } else { if ($merge_tpl_vars) { // restore local variables $this->tpl_vars = $save_tpl_vars; $this->config_vars = $save_config_vars; } if ($this->smarty->debugging) { Smarty_Internal_Debug::end_template($this); } if ($this->smarty->debugging == 2 and $display === FALSE) { if ($this->smarty->debugging) { Smarty_Internal_Debug::display_debug($this, TRUE); } } if ($parentIsTpl) { $this->parent->properties['tpl_function'] = array_merge($this->parent->properties['tpl_function'], $this->properties['tpl_function']); foreach ($this->required_plugins as $code => $tmp1) { foreach ($tmp1 as $name => $tmp) { foreach ($tmp as $type => $data) { $this->parent->required_plugins[$code][$name][$type] = $data; } } } } // return cache content return $content; } }