/** * populate Source Object with meta data from Resource * * @param Smarty_Template_Source $source source object * @param Smarty_Internal_Template $_template template object * * @return void */ public function populate(Smarty_Template_Source $source, Smarty_Internal_Template $_template = null) { $uid = ''; $sources = array(); $exists = true; foreach ($_template->smarty->getTemplateDir() as $key => $directory) { try { $s = Smarty_Resource::source(null, $source->smarty, '[' . $key . ']' . $source->name); if (!$s->exists) { continue; } $sources[$s->uid] = $s; $uid .= $s->filepath; } catch (SmartyException $e) { } } if (!$sources) { $source->exists = false; $source->template = $_template; return; } $sources = array_reverse($sources, true); reset($sources); $s = current($sources); $source->components = $sources; $source->filepath = $s->filepath; $source->uid = sha1($uid); $source->exists = $exists; if ($_template && $_template->smarty->compile_check) { $source->timestamp = $s->timestamp; } // need the template at getContent() $source->template = $_template; }
/** * populate Source Object with meta data from Resource * * @param Smarty_Template_Source $source source object * @param Smarty_Internal_Template $_template template object */ public function populate(Smarty_Template_Source $source, Smarty_Internal_Template $_template = null) { $uid = ''; $sources = array(); $components = explode('|', $source->name); $exists = true; foreach ($components as $component) { $s = Smarty_Resource::source(null, $source->smarty, $component); if ($s->type == 'php') { throw new SmartyException("Resource type {$s->type} cannot be used with the extends resource type"); } $sources[$s->uid] = $s; $uid .= $s->filepath; if ($_template && $_template->smarty->compile_check) { $exists = $exists && $s->exists; } } $source->components = $sources; $source->filepath = $s->filepath; $source->uid = sha1($uid); if ($_template && $_template->smarty->compile_check) { $source->timestamp = $s->timestamp; $source->exists = $exists; } // need the template at getContent() $source->template = $_template; }
/** * populate Source Object with meta data from Resource * * @param Smarty_Template_Source $source source object * @param Smarty_Internal_Template $_template template object * * @return void */ public function populate(Smarty_Template_Source $source, Smarty_Internal_Template $_template = null) { $uid = ''; $sources = array(); $timestamp = 0; foreach ($_template->smarty->getTemplateDir() as $key => $directory) { try { $s = Smarty_Resource::source(null, $source->smarty, 'file:' . '[' . $key . ']' . $source->name); if (!$s->exists) { continue; } $sources[$s->uid] = $s; $uid .= $s->filepath; $timestamp = $s->timestamp > $timestamp ? $s->timestamp : $timestamp; } catch (SmartyException $e) { } } if (!$sources) { $source->exists = false; return; } $sources = array_reverse($sources, true); reset($sources); $s = current($sources); $source->components = $sources; $source->filepath = $s->filepath; $source->uid = sha1($uid . $_template->smarty->_joined_template_dir); $source->exists = true; $source->timestamp = $timestamp; }
/** * populate Source Object with meta data from Resource * * @param Smarty_Template_Source $source source object * @param Smarty_Internal_Template $_template template object */ public function populate(Smarty_Template_Source $source, Smarty_Internal_Template $_template = null) { $filePath = $this->buildFilepath($source, $_template); $s = Smarty_Resource::source(null, $source->smarty, $filePath); $source->components = $s; $source->filepath = $s->filepath; $source->uid = $s->uid; if ($_template && $_template->smarty->compile_check) { $source->timestamp = $s->timestamp; $source->exists = $s->exists; } $source->template = $_template; }
/** * get Smarty property in template context * * @param string $property_name property name */ public function __get($property_name) { switch ($property_name) { case 'source': if (empty($this->template_resource)) { throw new SmartyException("Unable to parse resource name \"{$this->template_resource}\""); } $this->source = Smarty_Resource::source($this); // cache template object under a unique ID // do not cache eval resources if ($this->source->type != 'eval') { if ($this->smarty->allow_ambiguous_resources) { $_templateId = $this->source->unique_resource . $this->cache_id . $this->compile_id; } else { $_templateId = $this->smarty->joined_template_dir . '#' . $this->template_resource . $this->cache_id . $this->compile_id; } if (isset($_templateId[150])) { $_templateId = sha1($_templateId); } $this->smarty->template_objects[$_templateId] = $this; } return $this->source; case 'compiled': $this->compiled = $this->source->getCompiled($this); return $this->compiled; case 'cached': if (!class_exists('Smarty_Template_Cached')) { include SMARTY_SYSPLUGINS_DIR . 'smarty_cacheresource.php'; } $this->cached = new Smarty_Template_Cached($this); return $this->cached; case 'compiler': $this->smarty->loadPlugin($this->source->compiler_class); $this->compiler = new $this->source->compiler_class($this->source->template_lexer_class, $this->source->template_parser_class, $this->smarty); return $this->compiler; // FIXME: routing of template -> smarty attributes // FIXME: routing of template -> smarty attributes default: if (property_exists($this->smarty, $property_name)) { return $this->smarty->{$property_name}; } } throw new SmartyException("template property '{$property_name}' does not exist."); }
/** * This function is executed automatically when a compiled or cached template file is included * - Decode saved properties from compiled template and cache files * - Check if compiled or cache file is valid * * @param array $properties special template properties * @param bool $cache flag if called from cache file * * @return bool flag if compiled or cache file is valid */ public function decodeProperties($properties, $cache = false) { $properties['version'] = isset($properties['version']) ? $properties['version'] : ''; $is_valid = true; if (Smarty::SMARTY_VERSION != $properties['version']) { // new version must rebuild $is_valid = false; } elseif ((!$cache && $this->smarty->compile_check || $cache && ($this->smarty->compile_check === true || $this->smarty->compile_check === Smarty::COMPILECHECK_ON)) && !empty($properties['file_dependency'])) { // check file dependencies at compiled code foreach ($properties['file_dependency'] as $_file_to_check) { if ($_file_to_check[2] == 'file' || $_file_to_check[2] == 'php') { if ($this->source->filepath == $_file_to_check[0] && isset($this->source->timestamp)) { // do not recheck current template $mtime = $this->source->timestamp; } else { // file and php types can be checked without loading the respective resource handlers $mtime = is_file($_file_to_check[0]) ? @filemtime($_file_to_check[0]) : false; } } elseif ($_file_to_check[2] == 'string') { continue; } else { $source = Smarty_Resource::source(null, $this->smarty, $_file_to_check[0]); $mtime = $source->timestamp; } if (!$mtime || $mtime > $_file_to_check[1]) { $is_valid = false; break; } } } if ($cache) { // CACHING_LIFETIME_SAVED cache expiry has to be validated here since otherwise we'd define the unifunc if ($this->caching === Smarty::CACHING_LIFETIME_SAVED && $properties['cache_lifetime'] >= 0 && time() > $this->cached->timestamp + $properties['cache_lifetime']) { $is_valid = false; } $this->cached->valid = $is_valid; } else { $this->mustCompile = !$is_valid; } if ($is_valid) { $this->has_nocache_code = $properties['has_nocache_code']; // $this->properties['nocache_hash'] = $properties['nocache_hash']; if (isset($properties['cache_lifetime'])) { $this->properties['cache_lifetime'] = $properties['cache_lifetime']; } if (isset($properties['file_dependency'])) { $this->properties['file_dependency'] = array_merge($this->properties['file_dependency'], $properties['file_dependency']); } if (isset($properties['tpl_function'])) { $this->properties['tpl_function'] = array_merge($this->properties['tpl_function'], $properties['tpl_function']); } $this->properties['version'] = $properties['version']; $this->properties['unifunc'] = $properties['unifunc']; } return $is_valid; }
public function __get($property_name) { switch ($property_name) { case 'source': if (strlen($this->template_resource) == 0) { throw new SmartyException('Missing template name'); } $this->source = Smarty_Resource::source($this); if ($this->source->type != 'eval') { if ($this->smarty->allow_ambiguous_resources) { $_templateId = $this->source->unique_resource . $this->cache_id . $this->compile_id; } else { $_templateId = $this->smarty->joined_template_dir . '#' . $this->template_resource . $this->cache_id . $this->compile_id; } if (isset($_templateId[150])) { $_templateId = sha1($_templateId); } $this->smarty->template_objects[$_templateId] = $this; } return $this->source; case 'compiled': $this->compiled = $this->source->getCompiled($this); return $this->compiled; case 'cached': if (!class_exists('Smarty_Template_Cached')) { include SMARTY_SYSPLUGINS_DIR . 'smarty_cacheresource.php'; } $this->cached = new Smarty_Template_Cached($this); return $this->cached; case 'compiler': $this->smarty->loadPlugin($this->source->compiler_class); $this->compiler = new $this->source->compiler_class($this->source->template_lexer_class, $this->source->template_parser_class, $this->smarty); return $this->compiler; default: if (property_exists($this->smarty, $property_name)) { return $this->smarty->{$property_name}; } } throw new SmartyException("template property '{$property_name}' does not exist."); }
/** * Constructor * * @param \Smarty_Internal_Template $template */ public function __construct(Smarty_Internal_Template $template) { $valid = true; if (!$template->source->recompiled) { if (Smarty::SMARTY_VERSION != $this->version) { // new version must rebuild $valid = false; } elseif ((int) $template->smarty->compile_check == 1 || $this->isCache && $template->smarty->compile_check === Smarty::COMPILECHECK_ON) { // check file dependencies at compiled code foreach ($this->resourceInfo as $r) { if ($r[2] == 'file' || $r[2] == 'php') { if ($template->source->filepath == $r[0]) { // do not recheck current template $mtime = $template->source->timestamp; } else { // file and php types can be checked without loading the respective resource handlers if (is_file($r[0])) { $mtime = filemtime($r[0]); } else { $valid = false; break; } } } else { $source = Smarty_Resource::source(null, $template->smarty, $r[0]); if ($source->exists) { $mtime = $source->timestamp; } else { $valid = false; break; } } if (!$mtime || $mtime > $r[1]) { $valid = false; break; } } } if ($this->isCache) { // CACHING_LIFETIME_SAVED cache expiry has to be validated here since otherwise we'd define the unifunc if ($this->cacheLifetime > 0 && ($template->caching === Smarty::CACHING_LIFETIME_SAVED || $this->caching === Smarty::CACHING_LIFETIME_SAVED) && time() > $template->cached->timestamp + $this->cacheLifetime) { $valid = false; } $template->cached->valid = $valid; } else { $template->mustCompile = !$valid; } } if ($valid && !empty($this->plugins)) { $this->loadPlugins($this->plugins); } }