123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203 |
- <?php
-
- /**
- * Sub Template Runtime Methods render, setupSubTemplate
- *
- * @package Smarty
- * @subpackage PluginsInternal
- * @author Uwe Tews
- *
- **/
- class Smarty_Internal_Runtime_SubTemplate
- {
-
- /**
- * Subtemplate template object cache
- *
- * @var Smarty_Internal_Template[]
- */
- public $tplObjects = array();
-
- /**
- * Subtemplate call count
- *
- * @var int[]
- */
- public $subTplInfo = array();
-
- /**
- * Runtime function to render subtemplate
- *
- * @param \Smarty_Internal_Template $parent
- * @param string $template template name
- * @param mixed $cache_id cache id
- * @param mixed $compile_id compile id
- * @param integer $caching cache mode
- * @param integer $cache_lifetime life time of cache data
- * @param array $data passed parameter template variables
- * @param int $scope scope in which {include} should execute
- * @param bool $forceTplCache cache template object
- * @param string $uid file dependency uid
- * @param string $content_func function name
- *
- */
- public function render(Smarty_Internal_Template $parent, $template, $cache_id, $compile_id, $caching,
- $cache_lifetime, $data, $scope, $forceTplCache, $uid = null, $content_func = null)
- {
- // if there are cached template objects calculate $templateID
- $_templateId =
- !empty($this->tplObjects) ? $parent->smarty->_getTemplateId($template, $cache_id, $compile_id, $caching) :
- null;
- // already in template cache?
- /* @var Smarty_Internal_Template $tpl */
- if (isset($_templateId) && isset($this->tplObjects[$_templateId])) {
- // clone cached template object because of possible recursive call
- $tpl = clone $this->tplObjects[$_templateId];
- $tpl->parent = $parent;
- // if $caching mode changed the compiled resource is invalid
- if ((bool) $tpl->caching !== (bool) $caching) {
- unset($tpl->compiled);
- }
- // get variables from calling scope
- $tpl->tpl_vars = $parent->tpl_vars;
- $tpl->config_vars = $parent->config_vars;
- // get template functions
- $tpl->tpl_function = $parent->tpl_function;
- // copy inheritance object?
- if (isset($parent->ext->_inheritance)) {
- $tpl->ext->_inheritance = $parent->ext->_inheritance;
- } else {
- unset($tpl->ext->_inheritance);
- }
- } else {
- $tpl = clone $parent;
- $tpl->parent = $parent;
- if (!isset($tpl->templateId) || $tpl->templateId !== $_templateId) {
- $tpl->templateId = $_templateId;
- $tpl->template_resource = $template;
- $tpl->cache_id = $cache_id;
- $tpl->compile_id = $compile_id;
- if (isset($uid)) {
- // for inline templates we can get all resource information from file dependency
- if (isset($tpl->compiled->file_dependency[$uid])) {
- list($filepath, $timestamp, $resource) = $tpl->compiled->file_dependency[$uid];
- $tpl->source =
- new Smarty_Template_Source(isset($tpl->smarty->_cache['resource_handlers'][$resource]) ?
- $tpl->smarty->_cache['resource_handlers'][$resource] :
- Smarty_Resource::load($tpl->smarty, $resource), $tpl->smarty,
- $filepath, $resource, $filepath);
- $tpl->source->filepath = $filepath;
- $tpl->source->timestamp = $timestamp;
- $tpl->source->exists = true;
- $tpl->source->uid = $uid;
- } else {
- $tpl->source = null;
- }
- } else {
- $tpl->source = null;
- }
- if (!isset($tpl->source)) {
- $tpl->source = Smarty_Template_Source::load($tpl);
- unset($tpl->compiled);
- }
- unset($tpl->cached);
- }
- }
- $tpl->caching = $caching;
- $tpl->cache_lifetime = $cache_lifetime;
- if ($caching == 9999) {
- $tpl->cached = $parent->cached;
- }
- // set template scope
- $tpl->scope = $scope;
- $scopePtr = false;
- if ($scope & ~Smarty::SCOPE_BUBBLE_UP) {
- if ($scope == Smarty::SCOPE_GLOBAL) {
- $tpl->tpl_vars = Smarty::$global_tpl_vars;
- $tpl->config_vars = $tpl->smarty->config_vars;
- $scopePtr = true;
- } else {
- if ($scope == Smarty::SCOPE_PARENT) {
- $scopePtr = $parent;
- } elseif ($scope == Smarty::SCOPE_SMARTY) {
- $scopePtr = $tpl->smarty;
- } else {
- $scopePtr = $tpl;
- while (isset($scopePtr->parent)) {
- if ($scopePtr->parent->_objType != 2 && $scope & Smarty::SCOPE_TPL_ROOT) {
- break;
- }
- $scopePtr = $scopePtr->parent;
- }
- }
- $tpl->tpl_vars = $scopePtr->tpl_vars;
- $tpl->config_vars = $scopePtr->config_vars;
- }
- }
-
- if (!isset($this->tplObjects[$tpl->_getTemplateId()]) && !$tpl->source->handler->recompiled) {
- // if template is called multiple times set flag to to cache template objects
- $forceTplCache = $forceTplCache ||
- (isset($this->subTplInfo[$tpl->template_resource]) && $this->subTplInfo[$tpl->template_resource] > 1);
- // check if template object should be cached
- if ($tpl->parent->_objType == 2 && isset($this->tplObjects[$tpl->parent->templateId]) ||
- ($forceTplCache && $tpl->smarty->resource_cache_mode & Smarty::RESOURCE_CACHE_AUTOMATIC) ||
- ($tpl->smarty->resource_cache_mode & Smarty::RESOURCE_CACHE_ON)
- ) {
- $this->tplObjects[$tpl->_getTemplateId()] = $tpl;
- }
- }
-
- if (!empty($data)) {
- // set up variable values
- foreach ($data as $_key => $_val) {
- $tpl->tpl_vars[$_key] = new Smarty_Variable($_val);
- }
- }
- if (isset($uid)) {
- if ($parent->smarty->debugging) {
- $parent->smarty->_debug->start_template($tpl);
- $parent->smarty->_debug->start_render($tpl);
- }
- $tpl->compiled->getRenderedTemplateCode($tpl, $content_func);
- if ($parent->smarty->debugging) {
- $parent->smarty->_debug->end_template($tpl);
- $parent->smarty->_debug->end_render($tpl);
- }
- if ($tpl->caching == 9999 && $tpl->compiled->has_nocache_code) {
- $parent->cached->hashes[$tpl->compiled->nocache_hash] = true;
- }
- } else {
- if (isset($tpl->compiled)) {
- $tpl->compiled->render($tpl);
- } else {
- $tpl->render();
- }
- }
- if ($scopePtr) {
- if ($scope == Smarty::SCOPE_GLOBAL) {
- Smarty::$global_tpl_vars = $tpl->tpl_vars;
- $tpl->smarty->config_vars = $tpl->config_vars;
- } else {
- $scopePtr->tpl_vars = $tpl->tpl_vars;
- $scopePtr->config_vars = $tpl->config_vars;
- }
- }
- }
-
- /**
- * Get called subtemplates from compiled template and save call count
- *
- * @param \Smarty_Internal_Template $tpl
- */
- public function registerSubTemplates(Smarty_Internal_Template $tpl)
- {
- foreach ($tpl->compiled->includes as $name => $count) {
- if (isset($this->subTplInfo[$name])) {
- $this->subTplInfo[$name] += $count;
- } else {
- $this->subTplInfo[$name] = $count;
- }
- }
- }
- }
|