mirror of
https://github.com/smarty-php/smarty.git
synced 2025-08-04 18:34:27 +02:00
- bugfix Smarty version was not filled in header comment of compiled and cached files
- optimization replace internal Smarty::$ds property by DIRECTORY_SEPARATOR (reverted from commit 1e787d08f1
)
This commit is contained in:
@@ -1,8 +1,4 @@
|
|||||||
===== 3.1.32 - dev ===
|
===== 3.1.32 - dev ===
|
||||||
26.10.2017 3.1.32-dev-28
|
|
||||||
- bugfix Smarty version was not filled in header comment of compiled and cached files
|
|
||||||
- optimization replace internal Smarty::$ds property by DIRECTORY_SEPARATOR
|
|
||||||
|
|
||||||
21.10.2017
|
21.10.2017
|
||||||
- bugfix custom delimiters could fail since modification of version 3.1.32-dev-23
|
- bugfix custom delimiters could fail since modification of version 3.1.32-dev-23
|
||||||
https://github.com/smarty-php/smarty/issues/394
|
https://github.com/smarty-php/smarty/issues/394
|
||||||
|
@@ -100,7 +100,7 @@ class Smarty extends Smarty_Internal_TemplateBase
|
|||||||
/**
|
/**
|
||||||
* smarty version
|
* smarty version
|
||||||
*/
|
*/
|
||||||
const SMARTY_VERSION = '3.1.32-dev-28';
|
const SMARTY_VERSION = '3.1.32-dev-27';
|
||||||
/**
|
/**
|
||||||
* define variable scopes
|
* define variable scopes
|
||||||
*/
|
*/
|
||||||
@@ -544,6 +544,12 @@ class Smarty extends Smarty_Internal_TemplateBase
|
|||||||
* @var Smarty_Internal_Debug
|
* @var Smarty_Internal_Debug
|
||||||
*/
|
*/
|
||||||
public $_debug = null;
|
public $_debug = null;
|
||||||
|
/**
|
||||||
|
* Directory separator
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
public $ds = DIRECTORY_SEPARATOR;
|
||||||
/**
|
/**
|
||||||
* template directory
|
* template directory
|
||||||
*
|
*
|
||||||
@@ -763,6 +769,27 @@ class Smarty extends Smarty_Internal_TemplateBase
|
|||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set template directory
|
||||||
|
*
|
||||||
|
* @param string|array $template_dir directory(s) of template sources
|
||||||
|
* @param bool $isConfig true for config_dir
|
||||||
|
*
|
||||||
|
* @return \Smarty current Smarty instance for chaining
|
||||||
|
*/
|
||||||
|
public function setTemplateDir($template_dir, $isConfig = false)
|
||||||
|
{
|
||||||
|
if ($isConfig) {
|
||||||
|
$this->config_dir = array();
|
||||||
|
$this->_processedConfigDir = array();
|
||||||
|
} else {
|
||||||
|
$this->template_dir = array();
|
||||||
|
$this->_processedTemplateDir = array();
|
||||||
|
}
|
||||||
|
$this->addTemplateDir($template_dir, null, $isConfig);
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add template directory(s)
|
* Add template directory(s)
|
||||||
*
|
*
|
||||||
@@ -832,24 +859,15 @@ class Smarty extends Smarty_Internal_TemplateBase
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set template directory
|
* Set config directory
|
||||||
*
|
*
|
||||||
* @param string|array $template_dir directory(s) of template sources
|
* @param $config_dir
|
||||||
* @param bool $isConfig true for config_dir
|
|
||||||
*
|
*
|
||||||
* @return \Smarty current Smarty instance for chaining
|
* @return Smarty current Smarty instance for chaining
|
||||||
*/
|
*/
|
||||||
public function setTemplateDir($template_dir, $isConfig = false)
|
public function setConfigDir($config_dir)
|
||||||
{
|
{
|
||||||
if ($isConfig) {
|
return $this->setTemplateDir($config_dir, true);
|
||||||
$this->config_dir = array();
|
|
||||||
$this->_processedConfigDir = array();
|
|
||||||
} else {
|
|
||||||
$this->template_dir = array();
|
|
||||||
$this->_processedTemplateDir = array();
|
|
||||||
}
|
|
||||||
$this->addTemplateDir($template_dir, null, $isConfig);
|
|
||||||
return $this;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -878,15 +896,17 @@ class Smarty extends Smarty_Internal_TemplateBase
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set config directory
|
* Set plugins directory
|
||||||
*
|
*
|
||||||
* @param $config_dir
|
* @param string|array $plugins_dir directory(s) of plugins
|
||||||
*
|
*
|
||||||
* @return Smarty current Smarty instance for chaining
|
* @return Smarty current Smarty instance for chaining
|
||||||
*/
|
*/
|
||||||
public function setConfigDir($config_dir)
|
public function setPluginsDir($plugins_dir)
|
||||||
{
|
{
|
||||||
return $this->setTemplateDir($config_dir, true);
|
$this->plugins_dir = (array)$plugins_dir;
|
||||||
|
$this->_pluginsDirNormalized = false;
|
||||||
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -922,7 +942,7 @@ class Smarty extends Smarty_Internal_TemplateBase
|
|||||||
$this->plugins_dir = (array)$this->plugins_dir;
|
$this->plugins_dir = (array)$this->plugins_dir;
|
||||||
}
|
}
|
||||||
foreach ($this->plugins_dir as $k => $v) {
|
foreach ($this->plugins_dir as $k => $v) {
|
||||||
$this->plugins_dir[ $k ] = $this->_realpath(rtrim($v, "/\\") . DIRECTORY_SEPARATOR, true);
|
$this->plugins_dir[ $k ] = $this->_realpath(rtrim($v, "/\\") . $this->ds, true);
|
||||||
}
|
}
|
||||||
$this->_cache[ 'plugin_files' ] = array();
|
$this->_cache[ 'plugin_files' ] = array();
|
||||||
$this->_pluginsDirNormalized = true;
|
$this->_pluginsDirNormalized = true;
|
||||||
@@ -931,16 +951,15 @@ class Smarty extends Smarty_Internal_TemplateBase
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set plugins directory
|
|
||||||
*
|
*
|
||||||
* @param string|array $plugins_dir directory(s) of plugins
|
* @param string $compile_dir directory to store compiled templates in
|
||||||
*
|
*
|
||||||
* @return Smarty current Smarty instance for chaining
|
* @return Smarty current Smarty instance for chaining
|
||||||
*/
|
*/
|
||||||
public function setPluginsDir($plugins_dir)
|
public function setCompileDir($compile_dir)
|
||||||
{
|
{
|
||||||
$this->plugins_dir = (array)$plugins_dir;
|
$this->_normalizeDir('compile_dir', $compile_dir);
|
||||||
$this->_pluginsDirNormalized = false;
|
$this->_compileDirNormalized = true;
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -959,15 +978,16 @@ class Smarty extends Smarty_Internal_TemplateBase
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* Set cache directory
|
||||||
*
|
*
|
||||||
* @param string $compile_dir directory to store compiled templates in
|
* @param string $cache_dir directory to store cached templates in
|
||||||
*
|
*
|
||||||
* @return Smarty current Smarty instance for chaining
|
* @return Smarty current Smarty instance for chaining
|
||||||
*/
|
*/
|
||||||
public function setCompileDir($compile_dir)
|
public function setCacheDir($cache_dir)
|
||||||
{
|
{
|
||||||
$this->_normalizeDir('compile_dir', $compile_dir);
|
$this->_normalizeDir('cache_dir', $cache_dir);
|
||||||
$this->_compileDirNormalized = true;
|
$this->_cacheDirNormalized = true;
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -985,20 +1005,6 @@ class Smarty extends Smarty_Internal_TemplateBase
|
|||||||
return $this->cache_dir;
|
return $this->cache_dir;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Set cache directory
|
|
||||||
*
|
|
||||||
* @param string $cache_dir directory to store cached templates in
|
|
||||||
*
|
|
||||||
* @return Smarty current Smarty instance for chaining
|
|
||||||
*/
|
|
||||||
public function setCacheDir($cache_dir)
|
|
||||||
{
|
|
||||||
$this->_normalizeDir('cache_dir', $cache_dir);
|
|
||||||
$this->_cacheDirNormalized = true;
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* creates a template object
|
* creates a template object
|
||||||
*
|
*
|
||||||
@@ -1127,24 +1133,24 @@ class Smarty extends Smarty_Internal_TemplateBase
|
|||||||
*/
|
*/
|
||||||
public function _realpath($path, $realpath = null)
|
public function _realpath($path, $realpath = null)
|
||||||
{
|
{
|
||||||
$nds = DIRECTORY_SEPARATOR === '/' ? '\\' : '/';
|
$nds = $this->ds == '/' ? '\\' : '/';
|
||||||
// normalize DIRECTORY_SEPARATOR
|
// normalize $this->ds
|
||||||
$path = str_replace($nds, DIRECTORY_SEPARATOR, $path);
|
$path = str_replace($nds, $this->ds, $path);
|
||||||
preg_match('%^(?<root>(?:[[:alpha:]]:[\\\\]|/|[\\\\]{2}[[:alpha:]]+|[[:print:]]{2,}:[/]{2}|[\\\\])?)(?<path>(.*))$%u',
|
preg_match('%^(?<root>(?:[[:alpha:]]:[\\\\]|/|[\\\\]{2}[[:alpha:]]+|[[:print:]]{2,}:[/]{2}|[\\\\])?)(?<path>(.*))$%u',
|
||||||
$path,
|
$path,
|
||||||
$parts);
|
$parts);
|
||||||
$path = $parts[ 'path' ];
|
$path = $parts[ 'path' ];
|
||||||
if ($parts[ 'root' ] === '\\') {
|
if ($parts[ 'root' ] == '\\') {
|
||||||
$parts[ 'root' ] = substr(getcwd(), 0, 2) . $parts[ 'root' ];
|
$parts[ 'root' ] = substr(getcwd(), 0, 2) . $parts[ 'root' ];
|
||||||
} else {
|
} else {
|
||||||
if ($realpath !== null && !$parts[ 'root' ]) {
|
if ($realpath !== null && !$parts[ 'root' ]) {
|
||||||
$path = getcwd() . DIRECTORY_SEPARATOR . $path;
|
$path = getcwd() . $this->ds . $path;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// remove noop 'DIRECTORY_SEPARATOR DIRECTORY_SEPARATOR' and 'DIRECTORY_SEPARATOR.DIRECTORY_SEPARATOR' patterns
|
// remove noop 'DIRECTORY_SEPARATOR DIRECTORY_SEPARATOR' and 'DIRECTORY_SEPARATOR.DIRECTORY_SEPARATOR' patterns
|
||||||
$path = preg_replace('#([\\\\/]([.]?[\\\\/])+)#u', DIRECTORY_SEPARATOR, $path);
|
$path = preg_replace('#([\\\\/]([.]?[\\\\/])+)#u', $this->ds, $path);
|
||||||
// resolve '..DIRECTORY_SEPARATOR' pattern, smallest first
|
// resolve '..DIRECTORY_SEPARATOR' pattern, smallest first
|
||||||
if (strpos($path, '..' . DIRECTORY_SEPARATOR) !== false &&
|
if (strpos($path, '..' . $this->ds) != false &&
|
||||||
preg_match_all('#(([.]?[\\\\/])*([.][.])[\\\\/]([.]?[\\\\/])*)+#u', $path, $match)
|
preg_match_all('#(([.]?[\\\\/])*([.][.])[\\\\/]([.]?[\\\\/])*)+#u', $path, $match)
|
||||||
) {
|
) {
|
||||||
$counts = array();
|
$counts = array();
|
||||||
@@ -1155,7 +1161,7 @@ class Smarty extends Smarty_Internal_TemplateBase
|
|||||||
foreach ($counts as $count) {
|
foreach ($counts as $count) {
|
||||||
$path = preg_replace('#(([\\\\/]([.]?[\\\\/])*[^\\\\/.]+){' . $count .
|
$path = preg_replace('#(([\\\\/]([.]?[\\\\/])*[^\\\\/.]+){' . $count .
|
||||||
'}[\\\\/]([.]?[\\\\/])*([.][.][\\\\/]([.]?[\\\\/])*){' . $count . '})(?=[^.])#u',
|
'}[\\\\/]([.]?[\\\\/])*([.][.][\\\\/]([.]?[\\\\/])*){' . $count . '})(?=[^.])#u',
|
||||||
DIRECTORY_SEPARATOR,
|
$this->ds,
|
||||||
$path);
|
$path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1203,16 +1209,6 @@ class Smarty extends Smarty_Internal_TemplateBase
|
|||||||
$this->escape_html = $escape_html;
|
$this->escape_html = $escape_html;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Return auto_literal flag
|
|
||||||
*
|
|
||||||
* @return boolean
|
|
||||||
*/
|
|
||||||
public function getAutoLiteral()
|
|
||||||
{
|
|
||||||
return $this->auto_literal;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set auto_literal flag
|
* Set auto_literal flag
|
||||||
*
|
*
|
||||||
@@ -1223,6 +1219,16 @@ class Smarty extends Smarty_Internal_TemplateBase
|
|||||||
$this->auto_literal = $auto_literal;
|
$this->auto_literal = $auto_literal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return auto_literal flag
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public function getAutoLiteral()
|
||||||
|
{
|
||||||
|
return $this->auto_literal;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param boolean $force_compile
|
* @param boolean $force_compile
|
||||||
*/
|
*/
|
||||||
@@ -1239,16 +1245,6 @@ class Smarty extends Smarty_Internal_TemplateBase
|
|||||||
$this->merge_compiled_includes = $merge_compiled_includes;
|
$this->merge_compiled_includes = $merge_compiled_includes;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Get left delimiter
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getLeftDelimiter()
|
|
||||||
{
|
|
||||||
return $this->left_delimiter;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set left delimiter
|
* Set left delimiter
|
||||||
*
|
*
|
||||||
@@ -1260,13 +1256,13 @@ class Smarty extends Smarty_Internal_TemplateBase
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get right delimiter
|
* Get left delimiter
|
||||||
*
|
*
|
||||||
* @return string $right_delimiter
|
* @return string
|
||||||
*/
|
*/
|
||||||
public function getRightDelimiter()
|
public function getLeftDelimiter()
|
||||||
{
|
{
|
||||||
return $this->right_delimiter;
|
return $this->left_delimiter;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1279,6 +1275,16 @@ class Smarty extends Smarty_Internal_TemplateBase
|
|||||||
$this->right_delimiter = $right_delimiter;
|
$this->right_delimiter = $right_delimiter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get right delimiter
|
||||||
|
*
|
||||||
|
* @return string $right_delimiter
|
||||||
|
*/
|
||||||
|
public function getRightDelimiter()
|
||||||
|
{
|
||||||
|
return $this->right_delimiter;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param boolean $debugging
|
* @param boolean $debugging
|
||||||
*/
|
*/
|
||||||
@@ -1401,7 +1407,7 @@ class Smarty extends Smarty_Internal_TemplateBase
|
|||||||
*/
|
*/
|
||||||
private function _normalizeDir($dirName, $dir)
|
private function _normalizeDir($dirName, $dir)
|
||||||
{
|
{
|
||||||
$this->{$dirName} = $this->_realpath(rtrim($dir, "/\\") . DIRECTORY_SEPARATOR, true);
|
$this->{$dirName} = $this->_realpath(rtrim($dir, "/\\") . $this->ds, true);
|
||||||
if (!isset(Smarty::$_muted_directories[ $this->{$dirName} ])) {
|
if (!isset(Smarty::$_muted_directories[ $this->{$dirName} ])) {
|
||||||
Smarty::$_muted_directories[ $this->{$dirName} ] = null;
|
Smarty::$_muted_directories[ $this->{$dirName} ] = null;
|
||||||
}
|
}
|
||||||
@@ -1427,7 +1433,7 @@ class Smarty extends Smarty_Internal_TemplateBase
|
|||||||
}
|
}
|
||||||
foreach ($dir as $k => $v) {
|
foreach ($dir as $k => $v) {
|
||||||
if (!isset($processed[ $k ])) {
|
if (!isset($processed[ $k ])) {
|
||||||
$dir[ $k ] = $v = $this->_realpath(rtrim($v, "/\\") . DIRECTORY_SEPARATOR, true);
|
$dir[ $k ] = $v = $this->_realpath(rtrim($v, "/\\") . $this->ds, true);
|
||||||
$processed[ $k ] = true;
|
$processed[ $k ] = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -20,6 +20,7 @@ class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase
|
|||||||
* caching mode to create nocache code but no cache file
|
* caching mode to create nocache code but no cache file
|
||||||
*/
|
*/
|
||||||
const CACHING_NOCACHE_CODE = 9999;
|
const CACHING_NOCACHE_CODE = 9999;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Attribute definition: Overwrites base class.
|
* Attribute definition: Overwrites base class.
|
||||||
*
|
*
|
||||||
@@ -27,6 +28,7 @@ class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase
|
|||||||
* @see Smarty_Internal_CompileBase
|
* @see Smarty_Internal_CompileBase
|
||||||
*/
|
*/
|
||||||
public $required_attributes = array('file');
|
public $required_attributes = array('file');
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Attribute definition: Overwrites base class.
|
* Attribute definition: Overwrites base class.
|
||||||
*
|
*
|
||||||
@@ -34,6 +36,7 @@ class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase
|
|||||||
* @see Smarty_Internal_CompileBase
|
* @see Smarty_Internal_CompileBase
|
||||||
*/
|
*/
|
||||||
public $shorttag_order = array('file');
|
public $shorttag_order = array('file');
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Attribute definition: Overwrites base class.
|
* Attribute definition: Overwrites base class.
|
||||||
*
|
*
|
||||||
@@ -41,6 +44,7 @@ class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase
|
|||||||
* @see Smarty_Internal_CompileBase
|
* @see Smarty_Internal_CompileBase
|
||||||
*/
|
*/
|
||||||
public $option_flags = array('nocache', 'inline', 'caching');
|
public $option_flags = array('nocache', 'inline', 'caching');
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Attribute definition: Overwrites base class.
|
* Attribute definition: Overwrites base class.
|
||||||
*
|
*
|
||||||
@@ -48,6 +52,7 @@ class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase
|
|||||||
* @see Smarty_Internal_CompileBase
|
* @see Smarty_Internal_CompileBase
|
||||||
*/
|
*/
|
||||||
public $optional_attributes = array('_any');
|
public $optional_attributes = array('_any');
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Valid scope names
|
* Valid scope names
|
||||||
*
|
*
|
||||||
@@ -72,6 +77,7 @@ class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase
|
|||||||
$uid = $t_hash = null;
|
$uid = $t_hash = null;
|
||||||
// check and get attributes
|
// check and get attributes
|
||||||
$_attr = $this->getAttributes($compiler, $args);
|
$_attr = $this->getAttributes($compiler, $args);
|
||||||
|
|
||||||
$fullResourceName = $source_resource = $_attr[ 'file' ];
|
$fullResourceName = $source_resource = $_attr[ 'file' ];
|
||||||
$variable_template = false;
|
$variable_template = false;
|
||||||
$cache_tpl = false;
|
$cache_tpl = false;
|
||||||
@@ -84,11 +90,11 @@ class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase
|
|||||||
$variable_template = true;
|
$variable_template = true;
|
||||||
}
|
}
|
||||||
if (!$variable_template) {
|
if (!$variable_template) {
|
||||||
if ($type !== 'string') {
|
if ($type != 'string') {
|
||||||
$fullResourceName = "{$type}:{$name}";
|
$fullResourceName = "{$type}:{$name}";
|
||||||
$compiled = $compiler->parent_compiler->template->compiled;
|
$compiled = $compiler->parent_compiler->template->compiled;
|
||||||
if (isset($compiled->includes[ $fullResourceName ])) {
|
if (isset($compiled->includes[ $fullResourceName ])) {
|
||||||
$compiled->includes[ $fullResourceName ]++;
|
$compiled->includes[ $fullResourceName ] ++;
|
||||||
$cache_tpl = true;
|
$cache_tpl = true;
|
||||||
} else {
|
} else {
|
||||||
if ("{$compiler->template->source->type}:{$compiler->template->source->name}" ==
|
if ("{$compiler->template->source->type}:{$compiler->template->source->name}" ==
|
||||||
@@ -110,8 +116,10 @@ class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase
|
|||||||
} else {
|
} else {
|
||||||
$variable_template = true;
|
$variable_template = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// scope setup
|
// scope setup
|
||||||
$_scope = $compiler->convertScope($_attr, $this->valid_scopes);
|
$_scope = $compiler->convertScope($_attr, $this->valid_scopes);
|
||||||
|
|
||||||
// set flag to cache subtemplate object when called within loop or template name is variable.
|
// set flag to cache subtemplate object when called within loop or template name is variable.
|
||||||
if ($cache_tpl || $variable_template || $compiler->loopNesting > 0) {
|
if ($cache_tpl || $variable_template || $compiler->loopNesting > 0) {
|
||||||
$_cache_tpl = 'true';
|
$_cache_tpl = 'true';
|
||||||
@@ -120,14 +128,18 @@ class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase
|
|||||||
}
|
}
|
||||||
// assume caching is off
|
// assume caching is off
|
||||||
$_caching = Smarty::CACHING_OFF;
|
$_caching = Smarty::CACHING_OFF;
|
||||||
|
|
||||||
$call_nocache = $compiler->tag_nocache || $compiler->nocache;
|
$call_nocache = $compiler->tag_nocache || $compiler->nocache;
|
||||||
|
|
||||||
// caching was on and {include} is not in nocache mode
|
// caching was on and {include} is not in nocache mode
|
||||||
if ($compiler->template->caching && !$compiler->nocache && !$compiler->tag_nocache) {
|
if ($compiler->template->caching && !$compiler->nocache && !$compiler->tag_nocache) {
|
||||||
$_caching = self::CACHING_NOCACHE_CODE;
|
$_caching = self::CACHING_NOCACHE_CODE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// flag if included template code should be merged into caller
|
// flag if included template code should be merged into caller
|
||||||
$merge_compiled_includes = ($compiler->smarty->merge_compiled_includes || $_attr[ 'inline' ] === true) &&
|
$merge_compiled_includes = ($compiler->smarty->merge_compiled_includes || $_attr[ 'inline' ] === true) &&
|
||||||
!$compiler->template->source->handler->recompiled;
|
!$compiler->template->source->handler->recompiled;
|
||||||
|
|
||||||
if ($merge_compiled_includes) {
|
if ($merge_compiled_includes) {
|
||||||
// variable template name ?
|
// variable template name ?
|
||||||
if ($variable_template) {
|
if ($variable_template) {
|
||||||
@@ -138,6 +150,7 @@ class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase
|
|||||||
$merge_compiled_includes = false;
|
$merge_compiled_includes = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* if the {include} tag provides individual parameter for caching or compile_id
|
* if the {include} tag provides individual parameter for caching or compile_id
|
||||||
* the subtemplate must not be included into the common cache file and is treated like
|
* the subtemplate must not be included into the common cache file and is treated like
|
||||||
@@ -145,7 +158,7 @@ class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
if ($_attr[ 'nocache' ] !== true && $_attr[ 'caching' ]) {
|
if ($_attr[ 'nocache' ] !== true && $_attr[ 'caching' ]) {
|
||||||
$_caching = $_new_caching = (int)$_attr[ 'caching' ];
|
$_caching = $_new_caching = (int) $_attr[ 'caching' ];
|
||||||
$call_nocache = true;
|
$call_nocache = true;
|
||||||
} else {
|
} else {
|
||||||
$_new_caching = Smarty::CACHING_LIFETIME_CURRENT;
|
$_new_caching = Smarty::CACHING_LIFETIME_CURRENT;
|
||||||
@@ -169,6 +182,7 @@ class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase
|
|||||||
} else {
|
} else {
|
||||||
$_compile_id = '$_smarty_tpl->compile_id';
|
$_compile_id = '$_smarty_tpl->compile_id';
|
||||||
}
|
}
|
||||||
|
|
||||||
// if subtemplate will be called in nocache mode do not merge
|
// if subtemplate will be called in nocache mode do not merge
|
||||||
if ($compiler->template->caching && $call_nocache) {
|
if ($compiler->template->caching && $call_nocache) {
|
||||||
$merge_compiled_includes = false;
|
$merge_compiled_includes = false;
|
||||||
@@ -186,6 +200,7 @@ class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase
|
|||||||
$_assign = $_attr[ 'assign' ];
|
$_assign = $_attr[ 'assign' ];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$has_compiled_template = false;
|
$has_compiled_template = false;
|
||||||
if ($merge_compiled_includes) {
|
if ($merge_compiled_includes) {
|
||||||
$c_id = isset($_attr[ 'compile_id' ]) ? $_attr[ 'compile_id' ] : $compiler->template->compile_id;
|
$c_id = isset($_attr[ 'compile_id' ]) ? $_attr[ 'compile_id' ] : $compiler->template->compile_id;
|
||||||
@@ -217,17 +232,17 @@ class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase
|
|||||||
$_vars = 'array(' . join(',', $_pairs) . ')';
|
$_vars = 'array(' . join(',', $_pairs) . ')';
|
||||||
}
|
}
|
||||||
$update_compile_id = $compiler->template->caching && !$compiler->tag_nocache && !$compiler->nocache &&
|
$update_compile_id = $compiler->template->caching && !$compiler->tag_nocache && !$compiler->nocache &&
|
||||||
$_compile_id !== '$_smarty_tpl->compile_id';
|
$_compile_id != '$_smarty_tpl->compile_id';
|
||||||
if ($has_compiled_template && !$call_nocache) {
|
if ($has_compiled_template && !$call_nocache) {
|
||||||
$_output = "<?php\n";
|
$_output = "<?php\n";
|
||||||
if ($update_compile_id) {
|
if ($update_compile_id) {
|
||||||
$_output .= $compiler->makeNocacheCode("\$_compile_id_save[] = \$_smarty_tpl->compile_id;\n\$_smarty_tpl->compile_id = {$_compile_id};\n");
|
$_output .= $compiler->makeNocacheCode("\$_compile_id_save[] = \$_smarty_tpl->compile_id;\n\$_smarty_tpl->compile_id = {$_compile_id};\n");
|
||||||
}
|
}
|
||||||
if (!empty($_attr) && $_caching === 9999 && $compiler->template->caching) {
|
if (!empty($_attr) && $_caching == 9999 && $compiler->template->caching) {
|
||||||
$_vars_nc = "foreach ($_vars as \$ik => \$iv) {\n";
|
$_vars_nc = "foreach ($_vars as \$ik => \$iv) {\n";
|
||||||
$_vars_nc .= "\$_smarty_tpl->tpl_vars[\$ik] = new Smarty_Variable(\$iv);\n";
|
$_vars_nc .= "\$_smarty_tpl->tpl_vars[\$ik] = new Smarty_Variable(\$iv);\n";
|
||||||
$_vars_nc .= "}\n";
|
$_vars_nc .= "}\n";
|
||||||
$_output .= substr($compiler->processNocacheCode('<?php ' . $_vars_nc . "?>\n", true), 6, -3);
|
$_output .= substr($compiler->processNocacheCode('<?php ' . $_vars_nc . "?>\n", true), 6, - 3);
|
||||||
}
|
}
|
||||||
if (isset($_assign)) {
|
if (isset($_assign)) {
|
||||||
$_output .= "ob_start();\n";
|
$_output .= "ob_start();\n";
|
||||||
@@ -240,8 +255,10 @@ class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase
|
|||||||
$_output .= $compiler->makeNocacheCode("\$_smarty_tpl->compile_id = array_pop(\$_compile_id_save);\n");
|
$_output .= $compiler->makeNocacheCode("\$_smarty_tpl->compile_id = array_pop(\$_compile_id_save);\n");
|
||||||
}
|
}
|
||||||
$_output .= "?>\n";
|
$_output .= "?>\n";
|
||||||
|
|
||||||
return $_output;
|
return $_output;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($call_nocache) {
|
if ($call_nocache) {
|
||||||
$compiler->tag_nocache = true;
|
$compiler->tag_nocache = true;
|
||||||
}
|
}
|
||||||
@@ -274,8 +291,7 @@ class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase
|
|||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function compileInlineTemplate(Smarty_Internal_SmartyTemplateCompiler $compiler,
|
public function compileInlineTemplate(Smarty_Internal_SmartyTemplateCompiler $compiler,
|
||||||
Smarty_Internal_Template $tpl,
|
Smarty_Internal_Template $tpl, $t_hash)
|
||||||
$t_hash)
|
|
||||||
{
|
{
|
||||||
$uid = $tpl->source->type . $tpl->source->uid;
|
$uid = $tpl->source->type . $tpl->source->uid;
|
||||||
if (!($tpl->source->handler->uncompiled) && $tpl->source->exists) {
|
if (!($tpl->source->handler->uncompiled) && $tpl->source->exists) {
|
||||||
@@ -293,7 +309,7 @@ class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase
|
|||||||
$tpl->mustCompile = true;
|
$tpl->mustCompile = true;
|
||||||
$compiler->parent_compiler->mergedSubTemplatesData[ $uid ][ $t_hash ][ 'nocache_hash' ] =
|
$compiler->parent_compiler->mergedSubTemplatesData[ $uid ][ $t_hash ][ 'nocache_hash' ] =
|
||||||
$tpl->compiled->nocache_hash;
|
$tpl->compiled->nocache_hash;
|
||||||
if ($compiler->template->source->type === 'file') {
|
if ($compiler->template->source->type == 'file') {
|
||||||
$sourceInfo = $compiler->template->source->filepath;
|
$sourceInfo = $compiler->template->source->filepath;
|
||||||
} else {
|
} else {
|
||||||
$basename = $compiler->template->source->handler->getBasename($compiler->template->source);
|
$basename = $compiler->template->source->handler->getBasename($compiler->template->source);
|
||||||
@@ -315,8 +331,7 @@ class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase
|
|||||||
if ($tpl->compiled->has_nocache_code) {
|
if ($tpl->compiled->has_nocache_code) {
|
||||||
// replace nocache_hash
|
// replace nocache_hash
|
||||||
$compiled_code =
|
$compiled_code =
|
||||||
str_replace("{$tpl->compiled->nocache_hash}",
|
str_replace("{$tpl->compiled->nocache_hash}", $compiler->template->compiled->nocache_hash,
|
||||||
$compiler->template->compiled->nocache_hash,
|
|
||||||
$compiled_code);
|
$compiled_code);
|
||||||
$compiler->template->compiled->has_nocache_code = true;
|
$compiler->template->compiled->has_nocache_code = true;
|
||||||
}
|
}
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Smarty Internal Plugin Compile Insert
|
* Smarty Internal Plugin Compile Insert
|
||||||
* Compiles the {insert} tag
|
* Compiles the {insert} tag
|
||||||
@@ -23,6 +24,7 @@ class Smarty_Internal_Compile_Insert extends Smarty_Internal_CompileBase
|
|||||||
* @see Smarty_Internal_CompileBase
|
* @see Smarty_Internal_CompileBase
|
||||||
*/
|
*/
|
||||||
public $required_attributes = array('name');
|
public $required_attributes = array('name');
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Attribute definition: Overwrites base class.
|
* Attribute definition: Overwrites base class.
|
||||||
*
|
*
|
||||||
@@ -30,6 +32,7 @@ class Smarty_Internal_Compile_Insert extends Smarty_Internal_CompileBase
|
|||||||
* @see Smarty_Internal_CompileBase
|
* @see Smarty_Internal_CompileBase
|
||||||
*/
|
*/
|
||||||
public $shorttag_order = array('name');
|
public $shorttag_order = array('name');
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Attribute definition: Overwrites base class.
|
* Attribute definition: Overwrites base class.
|
||||||
*
|
*
|
||||||
@@ -53,6 +56,7 @@ class Smarty_Internal_Compile_Insert extends Smarty_Internal_CompileBase
|
|||||||
$_attr = $this->getAttributes($compiler, $args);
|
$_attr = $this->getAttributes($compiler, $args);
|
||||||
//Does tag create output
|
//Does tag create output
|
||||||
$compiler->has_output = isset($_attr[ 'assign' ]) ? false : true;
|
$compiler->has_output = isset($_attr[ 'assign' ]) ? false : true;
|
||||||
|
|
||||||
$nocacheParam = $compiler->template->caching && ($compiler->tag_nocache || $compiler->nocache);
|
$nocacheParam = $compiler->template->caching && ($compiler->tag_nocache || $compiler->nocache);
|
||||||
if (!$nocacheParam) {
|
if (!$nocacheParam) {
|
||||||
// do not compile as nocache code
|
// do not compile as nocache code
|
||||||
@@ -62,6 +66,7 @@ class Smarty_Internal_Compile_Insert extends Smarty_Internal_CompileBase
|
|||||||
$_smarty_tpl = $compiler->template;
|
$_smarty_tpl = $compiler->template;
|
||||||
$_name = null;
|
$_name = null;
|
||||||
$_script = null;
|
$_script = null;
|
||||||
|
|
||||||
$_output = '<?php ';
|
$_output = '<?php ';
|
||||||
// save possible attributes
|
// save possible attributes
|
||||||
eval('$_name = @' . $_attr[ 'name' ] . ';');
|
eval('$_name = @' . $_attr[ 'name' ] . ';');
|
||||||
@@ -91,8 +96,8 @@ class Smarty_Internal_Compile_Insert extends Smarty_Internal_CompileBase
|
|||||||
$_dir = $compiler->smarty instanceof SmartyBC ? $compiler->smarty->trusted_dir : null;
|
$_dir = $compiler->smarty instanceof SmartyBC ? $compiler->smarty->trusted_dir : null;
|
||||||
}
|
}
|
||||||
if (!empty($_dir)) {
|
if (!empty($_dir)) {
|
||||||
foreach ((array)$_dir as $_script_dir) {
|
foreach ((array) $_dir as $_script_dir) {
|
||||||
$_script_dir = rtrim($_script_dir, '/\\') . DIRECTORY_SEPARATOR;
|
$_script_dir = rtrim($_script_dir, '/\\') . $compiler->smarty->ds;
|
||||||
if (file_exists($_script_dir . $_script)) {
|
if (file_exists($_script_dir . $_script)) {
|
||||||
$_filepath = $_script_dir . $_script;
|
$_filepath = $_script_dir . $_script;
|
||||||
break;
|
break;
|
||||||
@@ -108,8 +113,7 @@ class Smarty_Internal_Compile_Insert extends Smarty_Internal_CompileBase
|
|||||||
require_once $_filepath;
|
require_once $_filepath;
|
||||||
if (!is_callable($_function)) {
|
if (!is_callable($_function)) {
|
||||||
$compiler->trigger_template_error(" {insert} function '{$_function}' is not callable in script file '{$_script}'",
|
$compiler->trigger_template_error(" {insert} function '{$_function}' is not callable in script file '{$_script}'",
|
||||||
null,
|
null, true);
|
||||||
true);
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
$_filepath = 'null';
|
$_filepath = 'null';
|
||||||
@@ -118,8 +122,7 @@ class Smarty_Internal_Compile_Insert extends Smarty_Internal_CompileBase
|
|||||||
if (!is_callable($_function)) {
|
if (!is_callable($_function)) {
|
||||||
// try plugin
|
// try plugin
|
||||||
if (!$_function = $compiler->getPlugin($_name, 'insert')) {
|
if (!$_function = $compiler->getPlugin($_name, 'insert')) {
|
||||||
$compiler->trigger_template_error("{insert} no function or plugin found for '{$_name}'",
|
$compiler->trigger_template_error("{insert} no function or plugin found for '{$_name}'", null,
|
||||||
null,
|
|
||||||
true);
|
true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -146,6 +149,7 @@ class Smarty_Internal_Compile_Insert extends Smarty_Internal_CompileBase
|
|||||||
$_output .= "echo {$_function}({$_params},\$_smarty_tpl);?>";
|
$_output .= "echo {$_function}({$_params},\$_smarty_tpl);?>";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return $_output;
|
return $_output;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -35,12 +35,13 @@ class Smarty_Internal_Method_ClearCompiledTemplate
|
|||||||
{
|
{
|
||||||
// clear template objects cache
|
// clear template objects cache
|
||||||
$smarty->_clearTemplateCache();
|
$smarty->_clearTemplateCache();
|
||||||
|
|
||||||
$_compile_dir = $smarty->getCompileDir();
|
$_compile_dir = $smarty->getCompileDir();
|
||||||
if ($_compile_dir === '/') { //We should never want to delete this!
|
if ($_compile_dir == '/') { //We should never want to delete this!
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
$_compile_id = isset($compile_id) ? preg_replace('![^\w]+!', '_', $compile_id) : null;
|
$_compile_id = isset($compile_id) ? preg_replace('![^\w]+!', '_', $compile_id) : null;
|
||||||
$_dir_sep = $smarty->use_sub_dirs ? DIRECTORY_SEPARATOR : '^';
|
$_dir_sep = $smarty->use_sub_dirs ? $smarty->ds : '^';
|
||||||
if (isset($resource_name)) {
|
if (isset($resource_name)) {
|
||||||
$_save_stat = $smarty->caching;
|
$_save_stat = $smarty->caching;
|
||||||
$smarty->caching = false;
|
$smarty->caching = false;
|
||||||
@@ -48,7 +49,7 @@ class Smarty_Internal_Method_ClearCompiledTemplate
|
|||||||
$tpl = $smarty->createTemplate($resource_name);
|
$tpl = $smarty->createTemplate($resource_name);
|
||||||
$smarty->caching = $_save_stat;
|
$smarty->caching = $_save_stat;
|
||||||
if (!$tpl->source->handler->uncompiled && !$tpl->source->handler->recompiled && $tpl->source->exists) {
|
if (!$tpl->source->handler->uncompiled && !$tpl->source->handler->recompiled && $tpl->source->exists) {
|
||||||
$_resource_part_1 = basename(str_replace('^', DIRECTORY_SEPARATOR, $tpl->compiled->filepath));
|
$_resource_part_1 = basename(str_replace('^', $smarty->ds, $tpl->compiled->filepath));
|
||||||
$_resource_part_1_length = strlen($_resource_part_1);
|
$_resource_part_1_length = strlen($_resource_part_1);
|
||||||
} else {
|
} else {
|
||||||
return 0;
|
return 0;
|
||||||
@@ -74,10 +75,10 @@ class Smarty_Internal_Method_ClearCompiledTemplate
|
|||||||
}
|
}
|
||||||
$_compile = new RecursiveIteratorIterator($_compileDirs, RecursiveIteratorIterator::CHILD_FIRST);
|
$_compile = new RecursiveIteratorIterator($_compileDirs, RecursiveIteratorIterator::CHILD_FIRST);
|
||||||
foreach ($_compile as $_file) {
|
foreach ($_compile as $_file) {
|
||||||
if (substr(basename($_file->getPathname()), 0, 1) === '.') {
|
if (substr(basename($_file->getPathname()), 0, 1) == '.') {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
$_filepath = (string)$_file;
|
$_filepath = (string) $_file;
|
||||||
if ($_file->isDir()) {
|
if ($_file->isDir()) {
|
||||||
if (!$_compile->isDot()) {
|
if (!$_compile->isDot()) {
|
||||||
// delete folder if empty
|
// delete folder if empty
|
||||||
@@ -85,22 +86,19 @@ class Smarty_Internal_Method_ClearCompiledTemplate
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// delete only php files
|
// delete only php files
|
||||||
if (substr($_filepath, -4) !== '.php') {
|
if (substr($_filepath, - 4) !== '.php') {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
$unlink = false;
|
$unlink = false;
|
||||||
if ((!isset($_compile_id) || (isset($_filepath[ $_compile_id_part_length ]) && $a =
|
if ((!isset($_compile_id) || (isset($_filepath[ $_compile_id_part_length ]) && $a =
|
||||||
!strncmp($_filepath, $_compile_id_part, $_compile_id_part_length))) &&
|
!strncmp($_filepath, $_compile_id_part, $_compile_id_part_length))) &&
|
||||||
(!isset($resource_name) || (isset($_filepath[ $_resource_part_1_length ]) &&
|
(!isset($resource_name) || (isset($_filepath[ $_resource_part_1_length ]) &&
|
||||||
substr_compare($_filepath,
|
substr_compare($_filepath, $_resource_part_1,
|
||||||
$_resource_part_1,
|
- $_resource_part_1_length, $_resource_part_1_length) ==
|
||||||
-$_resource_part_1_length,
|
|
||||||
$_resource_part_1_length) ===
|
|
||||||
0) || (isset($_filepath[ $_resource_part_2_length ]) &&
|
0) || (isset($_filepath[ $_resource_part_2_length ]) &&
|
||||||
substr_compare($_filepath,
|
substr_compare($_filepath, $_resource_part_2,
|
||||||
$_resource_part_2,
|
- $_resource_part_2_length,
|
||||||
-$_resource_part_2_length,
|
$_resource_part_2_length) == 0))
|
||||||
$_resource_part_2_length) === 0))
|
|
||||||
) {
|
) {
|
||||||
if (isset($exp_time)) {
|
if (isset($exp_time)) {
|
||||||
if (is_file($_filepath) && time() - @filemtime($_filepath) >= $exp_time) {
|
if (is_file($_filepath) && time() - @filemtime($_filepath) >= $exp_time) {
|
||||||
@@ -110,13 +108,14 @@ class Smarty_Internal_Method_ClearCompiledTemplate
|
|||||||
$unlink = true;
|
$unlink = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($unlink && is_file($_filepath) && @unlink($_filepath)) {
|
if ($unlink && is_file($_filepath) && @unlink($_filepath)) {
|
||||||
$_count++;
|
$_count ++;
|
||||||
if (function_exists('opcache_invalidate')
|
if (function_exists('opcache_invalidate')
|
||||||
&& (!function_exists('ini_get') || strlen(ini_get("opcache.restrict_api")) < 1)
|
&& (!function_exists('ini_get') || strlen(ini_get("opcache.restrict_api")) < 1)
|
||||||
) {
|
) {
|
||||||
opcache_invalidate($_filepath, true);
|
opcache_invalidate($_filepath, true);
|
||||||
} else if (function_exists('apc_delete_file')) {
|
} elseif (function_exists('apc_delete_file')) {
|
||||||
apc_delete_file($_filepath);
|
apc_delete_file($_filepath);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -30,32 +30,32 @@ class Smarty_Internal_Resource_File extends Smarty_Resource
|
|||||||
{
|
{
|
||||||
$file = $source->name;
|
$file = $source->name;
|
||||||
// absolute file ?
|
// absolute file ?
|
||||||
if ($file[ 0 ] === '/' || $file[ 1 ] === ':') {
|
if ($file[ 0 ] == '/' || $file[ 1 ] == ':') {
|
||||||
$file = $source->smarty->_realpath($file, true);
|
$file = $source->smarty->_realpath($file, true);
|
||||||
return is_file($file) ? $file : false;
|
return is_file($file) ? $file : false;
|
||||||
}
|
}
|
||||||
// go relative to a given template?
|
// go relative to a given template?
|
||||||
if ($file[ 0 ] === '.' && $_template && $_template->_isSubTpl() &&
|
if ($file[ 0 ] == '.' && $_template && $_template->_isSubTpl() &&
|
||||||
preg_match('#^[.]{1,2}[\\\/]#', $file)
|
preg_match('#^[.]{1,2}[\\\/]#', $file)
|
||||||
) {
|
) {
|
||||||
if ($_template->parent->source->type !== 'file' && $_template->parent->source->type !== 'extends' &&
|
if ($_template->parent->source->type != 'file' && $_template->parent->source->type != 'extends' &&
|
||||||
!isset($_template->parent->_cache[ 'allow_relative_path' ])
|
!isset($_template->parent->_cache[ 'allow_relative_path' ])
|
||||||
) {
|
) {
|
||||||
throw new SmartyException("Template '{$file}' cannot be relative to template of resource type '{$_template->parent->source->type}'");
|
throw new SmartyException("Template '{$file}' cannot be relative to template of resource type '{$_template->parent->source->type}'");
|
||||||
}
|
}
|
||||||
// normalize path
|
// normalize path
|
||||||
$path = $source->smarty->_realpath(dirname($_template->parent->source->filepath) . DIRECTORY_SEPARATOR . $file);
|
$path = $source->smarty->_realpath(dirname($_template->parent->source->filepath) . $source->smarty->ds . $file);
|
||||||
// files relative to a template only get one shot
|
// files relative to a template only get one shot
|
||||||
return is_file($path) ? $path : false;
|
return is_file($path) ? $path : false;
|
||||||
}
|
}
|
||||||
// normalize DIRECTORY_SEPARATOR
|
// normalize $source->smarty->ds
|
||||||
if (strpos($file, DIRECTORY_SEPARATOR === '/' ? '\\' : '/') !== false) {
|
if (strpos($file, $source->smarty->ds == '/' ? '\\' : '/') !== false) {
|
||||||
$file = str_replace(DIRECTORY_SEPARATOR === '/' ? '\\' : '/', DIRECTORY_SEPARATOR, $file);
|
$file = str_replace($source->smarty->ds == '/' ? '\\' : '/', $source->smarty->ds, $file);
|
||||||
}
|
}
|
||||||
|
|
||||||
$_directories = $source->smarty->getTemplateDir(null, $source->isConfig);
|
$_directories = $source->smarty->getTemplateDir(null, $source->isConfig);
|
||||||
// template_dir index?
|
// template_dir index?
|
||||||
if ($file[ 0 ] === '[' && preg_match('#^\[([^\]]+)\](.+)$#', $file, $fileMatch)) {
|
if ($file[ 0 ] == '[' && preg_match('#^\[([^\]]+)\](.+)$#', $file, $fileMatch)) {
|
||||||
$file = $fileMatch[ 2 ];
|
$file = $fileMatch[ 2 ];
|
||||||
$_indices = explode(',', $fileMatch[ 1 ]);
|
$_indices = explode(',', $fileMatch[ 1 ]);
|
||||||
$_index_dirs = array();
|
$_index_dirs = array();
|
||||||
@@ -90,7 +90,7 @@ class Smarty_Internal_Resource_File extends Smarty_Resource
|
|||||||
foreach ($_directories as $_directory) {
|
foreach ($_directories as $_directory) {
|
||||||
$path = $_directory . $file;
|
$path = $_directory . $file;
|
||||||
if (is_file($path)) {
|
if (is_file($path)) {
|
||||||
return (strpos($path, '.' . DIRECTORY_SEPARATOR) !== false) ? $source->smarty->_realpath($path) : $path;
|
return (strpos($path, '.' . $source->smarty->ds) !== false) ? $source->smarty->_realpath($path) : $path;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!isset($_index_dirs)) {
|
if (!isset($_index_dirs)) {
|
||||||
|
@@ -21,42 +21,49 @@ class Smarty_Internal_Runtime_GetIncludePath
|
|||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
public $_include_path = '';
|
public $_include_path = '';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* include path directory cache
|
* include path directory cache
|
||||||
*
|
*
|
||||||
* @var array
|
* @var array
|
||||||
*/
|
*/
|
||||||
public $_include_dirs = array();
|
public $_include_dirs = array();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* include path directory cache
|
* include path directory cache
|
||||||
*
|
*
|
||||||
* @var array
|
* @var array
|
||||||
*/
|
*/
|
||||||
public $_user_dirs = array();
|
public $_user_dirs = array();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* stream cache
|
* stream cache
|
||||||
*
|
*
|
||||||
* @var string[]
|
* @var string[]
|
||||||
*/
|
*/
|
||||||
public $isFile = array();
|
public $isFile = array();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* stream cache
|
* stream cache
|
||||||
*
|
*
|
||||||
* @var string[]
|
* @var string[]
|
||||||
*/
|
*/
|
||||||
public $isPath = array();
|
public $isPath = array();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* stream cache
|
* stream cache
|
||||||
*
|
*
|
||||||
* @var int[]
|
* @var int[]
|
||||||
*/
|
*/
|
||||||
public $number = array();
|
public $number = array();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* status cache
|
* status cache
|
||||||
*
|
*
|
||||||
* @var bool
|
* @var bool
|
||||||
*/
|
*/
|
||||||
public $_has_stream_include = null;
|
public $_has_stream_include = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Number for array index
|
* Number for array index
|
||||||
*
|
*
|
||||||
@@ -74,13 +81,13 @@ class Smarty_Internal_Runtime_GetIncludePath
|
|||||||
public function isNewIncludePath(Smarty $smarty)
|
public function isNewIncludePath(Smarty $smarty)
|
||||||
{
|
{
|
||||||
$_i_path = get_include_path();
|
$_i_path = get_include_path();
|
||||||
if ($this->_include_path !== $_i_path) {
|
if ($this->_include_path != $_i_path) {
|
||||||
$this->_include_dirs = array();
|
$this->_include_dirs = array();
|
||||||
$this->_include_path = $_i_path;
|
$this->_include_path = $_i_path;
|
||||||
$_dirs = (array)explode(PATH_SEPARATOR, $_i_path);
|
$_dirs = (array) explode(PATH_SEPARATOR, $_i_path);
|
||||||
foreach ($_dirs as $_path) {
|
foreach ($_dirs as $_path) {
|
||||||
if (is_dir($_path)) {
|
if (is_dir($_path)) {
|
||||||
$this->_include_dirs[] = $smarty->_realpath($_path . DIRECTORY_SEPARATOR, true);
|
$this->_include_dirs[] = $smarty->_realpath($_path . $smarty->ds, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@@ -121,7 +128,7 @@ class Smarty_Internal_Runtime_GetIncludePath
|
|||||||
}
|
}
|
||||||
// try PHP include_path
|
// try PHP include_path
|
||||||
foreach ($dirs as $dir) {
|
foreach ($dirs as $dir) {
|
||||||
$dir_n = isset($this->number[ $dir ]) ? $this->number[ $dir ] : $this->number[ $dir ] = $this->counter++;
|
$dir_n = isset($this->number[ $dir ]) ? $this->number[ $dir ] : $this->number[ $dir ] = $this->counter ++;
|
||||||
if (isset($this->isFile[ $dir_n ][ $file ])) {
|
if (isset($this->isFile[ $dir_n ][ $file ])) {
|
||||||
if ($this->isFile[ $dir_n ][ $file ]) {
|
if ($this->isFile[ $dir_n ][ $file ]) {
|
||||||
return $this->isFile[ $dir_n ][ $file ];
|
return $this->isFile[ $dir_n ][ $file ];
|
||||||
@@ -136,9 +143,9 @@ class Smarty_Internal_Runtime_GetIncludePath
|
|||||||
$dir = $this->_user_dirs[ $dir_n ];
|
$dir = $this->_user_dirs[ $dir_n ];
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if ($dir[ 0 ] === '/' || $dir[ 1 ] === ':') {
|
if ($dir[ 0 ] == '/' || $dir[ 1 ] == ':') {
|
||||||
$dir = str_ireplace(getcwd(), '.', $dir);
|
$dir = str_ireplace(getcwd(), '.', $dir);
|
||||||
if ($dir[ 0 ] === '/' || $dir[ 1 ] === ':') {
|
if ($dir[ 0 ] == '/' || $dir[ 1 ] == ':') {
|
||||||
$this->_user_dirs[ $dir_n ] = false;
|
$this->_user_dirs[ $dir_n ] = false;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@@ -35,30 +35,34 @@ class Smarty_Internal_Runtime_WriteFile
|
|||||||
if ($_file_perms !== null) {
|
if ($_file_perms !== null) {
|
||||||
$old_umask = umask(0);
|
$old_umask = umask(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
$_dirpath = dirname($_filepath);
|
$_dirpath = dirname($_filepath);
|
||||||
// if subdirs, create dir structure
|
|
||||||
|
// if subdirs, create dir structure
|
||||||
if ($_dirpath !== '.') {
|
if ($_dirpath !== '.') {
|
||||||
$i = 0;
|
$i=0;
|
||||||
// loop if concurrency problem occurs
|
// loop if concurrency problem occurs
|
||||||
// see https://bugs.php.net/bug.php?id=35326
|
// see https://bugs.php.net/bug.php?id=35326
|
||||||
while (!is_dir($_dirpath)) {
|
while (!is_dir($_dirpath)) {
|
||||||
if (@mkdir($_dirpath, $_dir_perms, true)) {
|
if (@mkdir($_dirpath, $_dir_perms, true)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
clearstatcache();
|
clearstatcache();
|
||||||
if (++$i === 3) {
|
if (++$i === 3) {
|
||||||
error_reporting($_error_reporting);
|
error_reporting($_error_reporting);
|
||||||
throw new SmartyException("unable to create directory {$_dirpath}");
|
throw new SmartyException("unable to create directory {$_dirpath}");
|
||||||
}
|
}
|
||||||
sleep(1);
|
sleep(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// write to tmp file, then move to overt file lock race condition
|
// write to tmp file, then move to overt file lock race condition
|
||||||
$_tmp_file = $_dirpath . DIRECTORY_SEPARATOR . str_replace(array('.', ','), '_', uniqid('wrt', true));
|
$_tmp_file = $_dirpath . $smarty->ds . str_replace(array('.', ','), '_', uniqid('wrt', true));
|
||||||
if (!file_put_contents($_tmp_file, $_contents)) {
|
if (!file_put_contents($_tmp_file, $_contents)) {
|
||||||
error_reporting($_error_reporting);
|
error_reporting($_error_reporting);
|
||||||
throw new SmartyException("unable to write file {$_tmp_file}");
|
throw new SmartyException("unable to write file {$_tmp_file}");
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Windows' rename() fails if the destination exists,
|
* Windows' rename() fails if the destination exists,
|
||||||
* Linux' rename() properly handles the overwrite.
|
* Linux' rename() properly handles the overwrite.
|
||||||
@@ -95,6 +99,7 @@ class Smarty_Internal_Runtime_WriteFile
|
|||||||
umask($old_umask);
|
umask($old_umask);
|
||||||
}
|
}
|
||||||
error_reporting($_error_reporting);
|
error_reporting($_error_reporting);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -20,29 +20,32 @@
|
|||||||
*/
|
*/
|
||||||
abstract class Smarty_Resource
|
abstract class Smarty_Resource
|
||||||
{
|
{
|
||||||
/**
|
|
||||||
* resource types provided by the core
|
|
||||||
*
|
|
||||||
* @var array
|
|
||||||
*/
|
|
||||||
public static $sysplugins = array('file' => 'smarty_internal_resource_file.php',
|
|
||||||
'string' => 'smarty_internal_resource_string.php',
|
|
||||||
'extends' => 'smarty_internal_resource_extends.php',
|
|
||||||
'stream' => 'smarty_internal_resource_stream.php',
|
|
||||||
'eval' => 'smarty_internal_resource_eval.php',
|
|
||||||
'php' => 'smarty_internal_resource_php.php');
|
|
||||||
/**
|
/**
|
||||||
* Source is bypassing compiler
|
* Source is bypassing compiler
|
||||||
*
|
*
|
||||||
* @var boolean
|
* @var boolean
|
||||||
*/
|
*/
|
||||||
public $uncompiled = false;
|
public $uncompiled = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Source must be recompiled on every occasion
|
* Source must be recompiled on every occasion
|
||||||
*
|
*
|
||||||
* @var boolean
|
* @var boolean
|
||||||
*/
|
*/
|
||||||
public $recompiled = false;
|
public $recompiled = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* resource types provided by the core
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
public static $sysplugins = array('file' => 'smarty_internal_resource_file.php',
|
||||||
|
'string' => 'smarty_internal_resource_string.php',
|
||||||
|
'extends' => 'smarty_internal_resource_extends.php',
|
||||||
|
'stream' => 'smarty_internal_resource_stream.php',
|
||||||
|
'eval' => 'smarty_internal_resource_eval.php',
|
||||||
|
'php' => 'smarty_internal_resource_php.php');
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Flag if resource does implement populateCompiledFilepath() method
|
* Flag if resource does implement populateCompiledFilepath() method
|
||||||
*
|
*
|
||||||
@@ -50,124 +53,6 @@ abstract class Smarty_Resource
|
|||||||
*/
|
*/
|
||||||
public $hasCompiledHandler = false;
|
public $hasCompiledHandler = false;
|
||||||
|
|
||||||
/**
|
|
||||||
* Load Resource Handler
|
|
||||||
*
|
|
||||||
* @param Smarty $smarty smarty object
|
|
||||||
* @param string $type name of the resource
|
|
||||||
*
|
|
||||||
* @throws SmartyException
|
|
||||||
* @return Smarty_Resource Resource Handler
|
|
||||||
*/
|
|
||||||
public static function load(Smarty $smarty, $type)
|
|
||||||
{
|
|
||||||
// try smarty's cache
|
|
||||||
if (isset($smarty->_cache[ 'resource_handlers' ][ $type ])) {
|
|
||||||
return $smarty->_cache[ 'resource_handlers' ][ $type ];
|
|
||||||
}
|
|
||||||
// try registered resource
|
|
||||||
if (isset($smarty->registered_resources[ $type ])) {
|
|
||||||
return $smarty->_cache[ 'resource_handlers' ][ $type ] =
|
|
||||||
$smarty->registered_resources[ $type ] instanceof Smarty_Resource ?
|
|
||||||
$smarty->registered_resources[ $type ] : new Smarty_Internal_Resource_Registered();
|
|
||||||
}
|
|
||||||
// try sysplugins dir
|
|
||||||
if (isset(self::$sysplugins[ $type ])) {
|
|
||||||
$_resource_class = 'Smarty_Internal_Resource_' . ucfirst($type);
|
|
||||||
return $smarty->_cache[ 'resource_handlers' ][ $type ] = new $_resource_class();
|
|
||||||
}
|
|
||||||
// try plugins dir
|
|
||||||
$_resource_class = 'Smarty_Resource_' . ucfirst($type);
|
|
||||||
if ($smarty->loadPlugin($_resource_class)) {
|
|
||||||
if (class_exists($_resource_class, false)) {
|
|
||||||
return $smarty->_cache[ 'resource_handlers' ][ $type ] = new $_resource_class();
|
|
||||||
} else {
|
|
||||||
$smarty->registerResource($type,
|
|
||||||
array("smarty_resource_{$type}_source", "smarty_resource_{$type}_timestamp",
|
|
||||||
"smarty_resource_{$type}_secure", "smarty_resource_{$type}_trusted"));
|
|
||||||
// give it another try, now that the resource is registered properly
|
|
||||||
return self::load($smarty, $type);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// try streams
|
|
||||||
$_known_stream = stream_get_wrappers();
|
|
||||||
if (in_array($type, $_known_stream)) {
|
|
||||||
// is known stream
|
|
||||||
if (is_object($smarty->security_policy)) {
|
|
||||||
$smarty->security_policy->isTrustedStream($type);
|
|
||||||
}
|
|
||||||
return $smarty->_cache[ 'resource_handlers' ][ $type ] = new Smarty_Internal_Resource_Stream();
|
|
||||||
}
|
|
||||||
// TODO: try default_(template|config)_handler
|
|
||||||
// give up
|
|
||||||
throw new SmartyException("Unknown resource type '{$type}'");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* extract resource_type and resource_name from template_resource and config_resource
|
|
||||||
* @note "C:/foo.tpl" was forced to file resource up till Smarty 3.1.3 (including).
|
|
||||||
*
|
|
||||||
* @param string $resource_name template_resource or config_resource to parse
|
|
||||||
* @param string $default_resource the default resource_type defined in $smarty
|
|
||||||
*
|
|
||||||
* @return array with parsed resource name and type
|
|
||||||
*/
|
|
||||||
public static function parseResourceName($resource_name, $default_resource)
|
|
||||||
{
|
|
||||||
if (preg_match('/^([A-Za-z0-9_\-]{2,})[:]/', $resource_name, $match)) {
|
|
||||||
$type = $match[ 1 ];
|
|
||||||
$name = substr($resource_name, strlen($match[ 0 ]));
|
|
||||||
} else {
|
|
||||||
// no resource given, use default
|
|
||||||
// or single character before the colon is not a resource type, but part of the filepath
|
|
||||||
$type = $default_resource;
|
|
||||||
$name = $resource_name;
|
|
||||||
}
|
|
||||||
return array($name, $type);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* modify template_resource according to resource handlers specifications
|
|
||||||
*
|
|
||||||
* @param \Smarty_Internal_Template|\Smarty $obj Smarty instance
|
|
||||||
* @param string $template_resource template_resource to extract resource handler and name of
|
|
||||||
*
|
|
||||||
* @return string unique resource name
|
|
||||||
*/
|
|
||||||
public static function getUniqueTemplateName($obj, $template_resource)
|
|
||||||
{
|
|
||||||
$smarty = $obj->_getSmartyObj();
|
|
||||||
list($name, $type) = self::parseResourceName($template_resource, $smarty->default_resource_type);
|
|
||||||
// TODO: optimize for Smarty's internal resource types
|
|
||||||
$resource = Smarty_Resource::load($smarty, $type);
|
|
||||||
// go relative to a given template?
|
|
||||||
$_file_is_dotted = $name[ 0 ] === '.' && ($name[ 1 ] === '.' || $name[ 1 ] === '/');
|
|
||||||
if ($obj->_isTplObj() && $_file_is_dotted &&
|
|
||||||
($obj->source->type === 'file' || $obj->parent->source->type === 'extends')
|
|
||||||
) {
|
|
||||||
$name = $smarty->_realpath(dirname($obj->parent->source->filepath) . DIRECTORY_SEPARATOR . $name);
|
|
||||||
}
|
|
||||||
return $resource->buildUniqueResourceName($smarty, $name);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* initialize Source Object for given resource
|
|
||||||
* wrapper for backward compatibility to versions < 3.1.22
|
|
||||||
* 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
|
|
||||||
*/
|
|
||||||
public static function source(Smarty_Internal_Template $_template = null,
|
|
||||||
Smarty $smarty = null,
|
|
||||||
$template_resource = null)
|
|
||||||
{
|
|
||||||
return Smarty_Template_Source::load($_template, $smarty, $template_resource);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Load template's source into current template object
|
* Load template's source into current template object
|
||||||
*
|
*
|
||||||
@@ -220,13 +105,6 @@ abstract class Smarty_Resource
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Check if resource must check time stamps when when loading complied or cached templates.
|
|
||||||
* Resources like 'extends' which use source components my disable timestamp checks on own resource.
|
|
||||||
*
|
|
||||||
* @return bool
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determine basename for compiled filename
|
* Determine basename for compiled filename
|
||||||
*
|
*
|
||||||
@@ -239,9 +117,138 @@ abstract class Smarty_Resource
|
|||||||
return basename(preg_replace('![^\w]+!', '_', $source->name));
|
return basename(preg_replace('![^\w]+!', '_', $source->name));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load Resource Handler
|
||||||
|
*
|
||||||
|
* @param Smarty $smarty smarty object
|
||||||
|
* @param string $type name of the resource
|
||||||
|
*
|
||||||
|
* @throws SmartyException
|
||||||
|
* @return Smarty_Resource Resource Handler
|
||||||
|
*/
|
||||||
|
public static function load(Smarty $smarty, $type)
|
||||||
|
{
|
||||||
|
// try smarty's cache
|
||||||
|
if (isset($smarty->_cache[ 'resource_handlers' ][ $type ])) {
|
||||||
|
return $smarty->_cache[ 'resource_handlers' ][ $type ];
|
||||||
|
}
|
||||||
|
|
||||||
|
// try registered resource
|
||||||
|
if (isset($smarty->registered_resources[ $type ])) {
|
||||||
|
return $smarty->_cache[ 'resource_handlers' ][ $type ] =
|
||||||
|
$smarty->registered_resources[ $type ] instanceof Smarty_Resource ?
|
||||||
|
$smarty->registered_resources[ $type ] : new Smarty_Internal_Resource_Registered();
|
||||||
|
}
|
||||||
|
|
||||||
|
// try sysplugins dir
|
||||||
|
if (isset(self::$sysplugins[ $type ])) {
|
||||||
|
$_resource_class = 'Smarty_Internal_Resource_' . ucfirst($type);
|
||||||
|
return $smarty->_cache[ 'resource_handlers' ][ $type ] = new $_resource_class();
|
||||||
|
}
|
||||||
|
|
||||||
|
// try plugins dir
|
||||||
|
$_resource_class = 'Smarty_Resource_' . ucfirst($type);
|
||||||
|
if ($smarty->loadPlugin($_resource_class)) {
|
||||||
|
if (class_exists($_resource_class, false)) {
|
||||||
|
return $smarty->_cache[ 'resource_handlers' ][ $type ] = new $_resource_class();
|
||||||
|
} else {
|
||||||
|
$smarty->registerResource($type,
|
||||||
|
array("smarty_resource_{$type}_source", "smarty_resource_{$type}_timestamp",
|
||||||
|
"smarty_resource_{$type}_secure", "smarty_resource_{$type}_trusted"));
|
||||||
|
// give it another try, now that the resource is registered properly
|
||||||
|
return self::load($smarty, $type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// try streams
|
||||||
|
$_known_stream = stream_get_wrappers();
|
||||||
|
if (in_array($type, $_known_stream)) {
|
||||||
|
// is known stream
|
||||||
|
if (is_object($smarty->security_policy)) {
|
||||||
|
$smarty->security_policy->isTrustedStream($type);
|
||||||
|
}
|
||||||
|
return $smarty->_cache[ 'resource_handlers' ][ $type ] = new Smarty_Internal_Resource_Stream();
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: try default_(template|config)_handler
|
||||||
|
|
||||||
|
// give up
|
||||||
|
throw new SmartyException("Unknown resource type '{$type}'");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* extract resource_type and resource_name from template_resource and config_resource
|
||||||
|
* @note "C:/foo.tpl" was forced to file resource up till Smarty 3.1.3 (including).
|
||||||
|
*
|
||||||
|
* @param string $resource_name template_resource or config_resource to parse
|
||||||
|
* @param string $default_resource the default resource_type defined in $smarty
|
||||||
|
*
|
||||||
|
* @return array with parsed resource name and type
|
||||||
|
*/
|
||||||
|
public static function parseResourceName($resource_name, $default_resource)
|
||||||
|
{
|
||||||
|
if (preg_match('/^([A-Za-z0-9_\-]{2,})[:]/', $resource_name, $match)) {
|
||||||
|
$type = $match[ 1 ];
|
||||||
|
$name = substr($resource_name, strlen($match[ 0 ]));
|
||||||
|
} else {
|
||||||
|
// no resource given, use default
|
||||||
|
// or single character before the colon is not a resource type, but part of the filepath
|
||||||
|
$type = $default_resource;
|
||||||
|
$name = $resource_name;
|
||||||
|
}
|
||||||
|
return array($name, $type);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* modify template_resource according to resource handlers specifications
|
||||||
|
*
|
||||||
|
* @param \Smarty_Internal_Template|\Smarty $obj Smarty instance
|
||||||
|
* @param string $template_resource template_resource to extract resource handler and name of
|
||||||
|
*
|
||||||
|
* @return string unique resource name
|
||||||
|
*/
|
||||||
|
public static function getUniqueTemplateName($obj, $template_resource)
|
||||||
|
{
|
||||||
|
$smarty = $obj->_getSmartyObj();
|
||||||
|
list($name, $type) = self::parseResourceName($template_resource, $smarty->default_resource_type);
|
||||||
|
// TODO: optimize for Smarty's internal resource types
|
||||||
|
$resource = Smarty_Resource::load($smarty, $type);
|
||||||
|
// go relative to a given template?
|
||||||
|
$_file_is_dotted = $name[ 0 ] == '.' && ($name[ 1 ] == '.' || $name[ 1 ] == '/');
|
||||||
|
if ($obj->_isTplObj() && $_file_is_dotted &&
|
||||||
|
($obj->source->type == 'file' || $obj->parent->source->type == 'extends')
|
||||||
|
) {
|
||||||
|
$name = $smarty->_realpath(dirname($obj->parent->source->filepath) . $smarty->ds . $name);
|
||||||
|
}
|
||||||
|
return $resource->buildUniqueResourceName($smarty, $name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check if resource must check time stamps when when loading complied or cached templates.
|
||||||
|
* Resources like 'extends' which use source components my disable timestamp checks on own resource.
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
public function checkTimestamps()
|
public function checkTimestamps()
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* initialize Source Object for given resource
|
||||||
|
* wrapper for backward compatibility to versions < 3.1.22
|
||||||
|
* 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
|
||||||
|
*/
|
||||||
|
public static function source(Smarty_Internal_Template $_template = null, Smarty $smarty = null,
|
||||||
|
$template_resource = null)
|
||||||
|
{
|
||||||
|
return Smarty_Template_Source::load($_template, $smarty, $template_resource);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -11,6 +11,7 @@
|
|||||||
*/
|
*/
|
||||||
class Smarty_Template_Compiled extends Smarty_Template_Resource_Base
|
class Smarty_Template_Compiled extends Smarty_Template_Resource_Base
|
||||||
{
|
{
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* nocache hash
|
* nocache hash
|
||||||
*
|
*
|
||||||
@@ -48,22 +49,21 @@ class Smarty_Template_Compiled extends Smarty_Template_Resource_Base
|
|||||||
$this->filepath = $smarty->getCompileDir();
|
$this->filepath = $smarty->getCompileDir();
|
||||||
if (isset($_template->compile_id)) {
|
if (isset($_template->compile_id)) {
|
||||||
$this->filepath .= preg_replace('![^\w]+!', '_', $_template->compile_id) .
|
$this->filepath .= preg_replace('![^\w]+!', '_', $_template->compile_id) .
|
||||||
($smarty->use_sub_dirs ? DIRECTORY_SEPARATOR : '^');
|
($smarty->use_sub_dirs ? $smarty->ds : '^');
|
||||||
}
|
}
|
||||||
// if use_sub_dirs, break file into directories
|
// if use_sub_dirs, break file into directories
|
||||||
if ($smarty->use_sub_dirs) {
|
if ($smarty->use_sub_dirs) {
|
||||||
$this->filepath .= $source->uid[ 0 ] . $source->uid[ 1 ] . DIRECTORY_SEPARATOR . $source->uid[ 2 ] .
|
$this->filepath .= $source->uid[ 0 ] . $source->uid[ 1 ] . $smarty->ds . $source->uid[ 2 ] .
|
||||||
$source->uid[ 3 ] . DIRECTORY_SEPARATOR . $source->uid[ 4 ] . $source->uid[ 5 ] .
|
$source->uid[ 3 ] . $smarty->ds . $source->uid[ 4 ] . $source->uid[ 5 ] . $smarty->ds;
|
||||||
DIRECTORY_SEPARATOR;
|
|
||||||
}
|
}
|
||||||
$this->filepath .= $source->uid . '_';
|
$this->filepath .= $source->uid . '_';
|
||||||
if ($source->isConfig) {
|
if ($source->isConfig) {
|
||||||
$this->filepath .= (int)$smarty->config_read_hidden + (int)$smarty->config_booleanize * 2 +
|
$this->filepath .= (int) $smarty->config_read_hidden + (int) $smarty->config_booleanize * 2 +
|
||||||
(int)$smarty->config_overwrite * 4;
|
(int) $smarty->config_overwrite * 4;
|
||||||
} else {
|
} else {
|
||||||
$this->filepath .= (int)$smarty->merge_compiled_includes + (int)$smarty->escape_html * 2 +
|
$this->filepath .= (int) $smarty->merge_compiled_includes + (int) $smarty->escape_html * 2 +
|
||||||
(($smarty->merge_compiled_includes && $source->type === 'extends') ?
|
(($smarty->merge_compiled_includes && $source->type === 'extends') ?
|
||||||
(int)$smarty->extends_recursion * 4 : 0);
|
(int) $smarty->extends_recursion * 4 : 0);
|
||||||
}
|
}
|
||||||
$this->filepath .= '.' . $source->type;
|
$this->filepath .= '.' . $source->type;
|
||||||
$basename = $source->handler->getBasename($source);
|
$basename = $source->handler->getBasename($source);
|
||||||
@@ -134,7 +134,7 @@ class Smarty_Template_Compiled extends Smarty_Template_Resource_Base
|
|||||||
$smarty = &$_smarty_tpl->smarty;
|
$smarty = &$_smarty_tpl->smarty;
|
||||||
if ($source->handler->recompiled) {
|
if ($source->handler->recompiled) {
|
||||||
$source->handler->process($_smarty_tpl);
|
$source->handler->process($_smarty_tpl);
|
||||||
} else if (!$source->handler->uncompiled) {
|
} elseif (!$source->handler->uncompiled) {
|
||||||
if (!$this->exists || $smarty->force_compile ||
|
if (!$this->exists || $smarty->force_compile ||
|
||||||
($smarty->compile_check && $source->getTimeStamp() > $this->getTimeStamp())
|
($smarty->compile_check && $source->getTimeStamp() > $this->getTimeStamp())
|
||||||
) {
|
) {
|
||||||
@@ -218,6 +218,28 @@ class Smarty_Template_Compiled extends Smarty_Template_Resource_Base
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load fresh compiled template by including the PHP file
|
||||||
|
* HHVM requires a work around because of a PHP incompatibility
|
||||||
|
*
|
||||||
|
* @param \Smarty_Internal_Template $_smarty_tpl do not change variable name, is used by compiled template
|
||||||
|
*/
|
||||||
|
private function loadCompiledTemplate(Smarty_Internal_Template $_smarty_tpl)
|
||||||
|
{
|
||||||
|
if (function_exists('opcache_invalidate')
|
||||||
|
&& (!function_exists('ini_get') || strlen(ini_get("opcache.restrict_api")) < 1)
|
||||||
|
) {
|
||||||
|
opcache_invalidate($this->filepath, true);
|
||||||
|
} elseif (function_exists('apc_compile_file')) {
|
||||||
|
apc_compile_file($this->filepath);
|
||||||
|
}
|
||||||
|
if (defined('HHVM_VERSION')) {
|
||||||
|
eval("?>" . file_get_contents($this->filepath));
|
||||||
|
} else {
|
||||||
|
include($this->filepath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Read compiled content from handler
|
* Read compiled content from handler
|
||||||
*
|
*
|
||||||
@@ -232,26 +254,4 @@ class Smarty_Template_Compiled extends Smarty_Template_Resource_Base
|
|||||||
}
|
}
|
||||||
return isset($this->content) ? $this->content : false;
|
return isset($this->content) ? $this->content : false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Load fresh compiled template by including the PHP file
|
|
||||||
* HHVM requires a work around because of a PHP incompatibility
|
|
||||||
*
|
|
||||||
* @param \Smarty_Internal_Template $_smarty_tpl do not change variable name, is used by compiled template
|
|
||||||
*/
|
|
||||||
private function loadCompiledTemplate(Smarty_Internal_Template $_smarty_tpl)
|
|
||||||
{
|
|
||||||
if (function_exists('opcache_invalidate')
|
|
||||||
&& (!function_exists('ini_get') || strlen(ini_get("opcache.restrict_api")) < 1)
|
|
||||||
) {
|
|
||||||
opcache_invalidate($this->filepath, true);
|
|
||||||
} else if (function_exists('apc_compile_file')) {
|
|
||||||
apc_compile_file($this->filepath);
|
|
||||||
}
|
|
||||||
if (defined('HHVM_VERSION')) {
|
|
||||||
eval("?>" . file_get_contents($this->filepath));
|
|
||||||
} else {
|
|
||||||
include($this->filepath);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user