/** * Start logging template * * @param \Smarty_Internal_Template $template template * @param null $mode true: display false: fetch null: subtemplate */ public function start_template(Smarty_Internal_Template $template, $mode = null) { if (isset($mode) && !$template->_isSubTpl()) { $this->index++; $this->offset++; $this->template_data[$this->index] = null; } $key = $this->get_key($template); $this->template_data[$this->index][$key]['start_template_time'] = microtime(true); }
/** * Returns if the current template must be compiled by the Smarty compiler * It does compare the timestamps of template source and the compiled templates and checks the force compile * configuration * * @param \Smarty_Internal_Template $_template * * @return bool * @throws \SmartyException */ public function mustCompile(Smarty_Internal_Template $_template) { if (!$_template->source->exists) { if ($_template->_isSubTpl()) { $parent_resource = " in '{$_template->parent}->template_resource}'"; } else { $parent_resource = ''; } throw new SmartyException("Unable to load template {$_template->source->type} '{$_template->source->name}'{$parent_resource}"); } if ($_template->mustCompile === null) { $_template->mustCompile = !$_template->source->handler->uncompiled && ($_template->smarty->force_compile || $_template->source->handler->recompiled || !$_template->compiled->exists || $_template->smarty->compile_check && $_template->compiled->getTimeStamp() < $_template->source->getTimeStamp()); } return $_template->mustCompile; }
/** * Render and output the template (without using the compiler) * * @param Smarty_Template_Source $source source object * @param Smarty_Internal_Template $_template template object * * @return void * @throws SmartyException if template cannot be loaded or allow_php_templates is disabled */ public function renderUncompiled(Smarty_Template_Source $source, Smarty_Internal_Template $_template) { if (!$source->smarty->allow_php_templates) { throw new SmartyException("PHP templates are disabled"); } if (!$source->exists) { throw new SmartyException("Unable to load template {$source->type} '{$source->name}'" . ($_template->_isSubTpl() ? " in '{$_template->parent->template_resource}'" : '')); } // prepare variables extract($_template->getTemplateVars()); // include PHP template with short open tags enabled ini_set('short_open_tag', '1'); /** @var Smarty_Internal_Template $_smarty_template * used in included file */ $_smarty_template = $_template; include $source->filepath; ini_set('short_open_tag', $this->short_open_tag); }
/** * build template filepath by traversing the template_dir array * * @param Smarty_Template_Source $source source object * @param Smarty_Internal_Template $_template template object * * @return string fully qualified filepath * @throws SmartyException */ protected function buildFilepath(Smarty_Template_Source $source, Smarty_Internal_Template $_template = null) { $file = $source->name; // absolute file ? if ($file[0] == '/' || $file[1] == ':') { $file = $source->smarty->_realpath($file, true); return is_file($file) ? $file : false; } // go relative to a given template? if ($file[0] == '.' && $_template && $_template->_isSubTpl() && preg_match('#^[.]{1,2}[\\\\/]#', $file)) { if ($_template->parent->source->type != 'file' && $_template->parent->source->type != 'extends' && !isset($_template->parent->_cache['allow_relative_path'])) { throw new SmartyException("Template '{$file}' cannot be relative to template of resource type '{$_template->parent->source->type}'"); } // normalize path $path = $source->smarty->_realpath(dirname($_template->parent->source->filepath) . $source->smarty->ds . $file); // files relative to a template only get one shot return is_file($path) ? $path : false; } // normalize $source->smarty->ds if (strpos($file, $source->smarty->ds == '/' ? '\\' : '/') !== false) { $file = str_replace($source->smarty->ds == '/' ? '\\' : '/', $source->smarty->ds, $file); } $_directories = $source->smarty->getTemplateDir(null, $source->isConfig); // template_dir index? if ($file[0] == '[' && preg_match('#^\\[([^\\]]+)\\](.+)$#', $file, $fileMatch)) { $file = $fileMatch[2]; $_indices = explode(',', $fileMatch[1]); $_index_dirs = array(); foreach ($_indices as $index) { $index = trim($index); // try string indexes if (isset($_directories[$index])) { $_index_dirs[] = $_directories[$index]; } elseif (is_numeric($index)) { // try numeric index $index = (int) $index; if (isset($_directories[$index])) { $_index_dirs[] = $_directories[$index]; } else { // try at location index $keys = array_keys($_directories); if (isset($_directories[$keys[$index]])) { $_index_dirs[] = $_directories[$keys[$index]]; } } } } if (empty($_index_dirs)) { // index not found return false; } else { $_directories = $_index_dirs; } } // relative file name? foreach ($_directories as $_directory) { $path = $_directory . $file; if (is_file($path)) { return strpos($path, '.' . $source->smarty->ds) !== false ? $source->smarty->_realpath($path) : $path; } } if (!isset($_index_dirs)) { // Could be relative to cwd $path = $source->smarty->_realpath($file, true); if (is_file($path)) { return $path; } } // Use include path ? if ($source->smarty->use_include_path) { return $source->smarty->ext->_getIncludePath->getIncludePath($_directories, $file, $source->smarty); } return false; }