handler = $handler; // Note: prone to circular references $this->recompiled = $handler->recompiled; $this->uncompiled = $handler->uncompiled; $this->compiler_class = $handler->compiler_class; $this->template_lexer_class = $handler->template_lexer_class; $this->template_parser_class = $handler->template_parser_class; $this->smarty = $smarty; $this->resource = $resource; $this->type = $type; $this->name = $name; } /** * initialize Source Object for given resource * Either [$_template] or [$smarty, $template_resource] must be specified * * @param Smarty_Internal_Template $_template template object * @param Smarty $smarty smarty object * @param string $template_resource resource identifier * * @return Smarty_Template_Source Source Object * @throws SmartyException */ public static function load(Smarty_Internal_Template $_template = null, Smarty $smarty = null, $template_resource = null) { if ($_template) { $smarty = $_template->smarty; $template_resource = $_template->template_resource; } if (empty($template_resource)) { throw new SmartyException('Missing template name'); } // parse resource_name, load resource handler, identify unique resource name list($name, $type) = Smarty_Resource::parseResourceName($template_resource, $smarty->default_resource_type); $resource = Smarty_Resource::load($smarty, $type); // if resource is not recompiling and resource name is not dotted we can check the source cache if ($smarty->resource_caching && !$resource->recompiled && !(isset($name[1]) && $name[0] == '.' && ($name[1] == '.' || $name[1] == '/'))) { $unique_resource = $resource->buildUniqueResourceName($smarty, $name); if (isset($smarty->source_objects[$unique_resource])) { return $smarty->source_objects[$unique_resource]; } } else { $unique_resource = null; } // create new source object $source = new Smarty_Template_Source($resource, $smarty, $template_resource, $type, $name); $resource->populate($source, $_template); if ((!isset($source->exists) || !$source->exists) && isset($_template->smarty->default_template_handler_func)) { Smarty_Internal_Extension_DefaultTemplateHandler::_getDefault($_template, $source); } // on recompiling resources we are done if ($smarty->resource_caching && !$resource->recompiled) { // may by we have already $unique_resource $is_relative = false; if (!isset($unique_resource)) { $is_relative = isset($name[1]) && $name[0] == '.' && ($name[1] == '.' || $name[1] == '/') && ($type == 'file' || (isset($_template->parent->source) && $_template->parent->source->type == 'extends')); $unique_resource = $resource->buildUniqueResourceName($smarty, $is_relative ? $source->filepath . $name : $name); } $source->unique_resource = $unique_resource; // save in runtime cache if not relative if (!$is_relative) { $smarty->source_objects[$unique_resource] = $source; } } return $source; } /** * render the uncompiled source * * @param Smarty_Internal_Template $_template template object * * @return string * @throws \Exception */ public function renderUncompiled(Smarty_Internal_Template $_template) { $level = ob_get_level(); ob_start(); try { $this->handler->renderUncompiled($_template->source, $_template); return ob_get_clean(); } catch (Exception $e) { while (ob_get_level() > $level) { ob_end_clean(); } throw $e; } } /** * Get source time stamp * * @return int */ public function getTimeStamp() { if (!isset($this->timestamp)) { $this->handler->populateTimestamp($this); } return $this->timestamp; } /** * Get source content * * @return string */ public function getContent() { return isset($this->content) ? $this->content : $this->handler->getContent($this); } }