mirror of
https://github.com/smarty-php/smarty.git
synced 2025-08-04 18:34:27 +02:00
- bugfix plugins may not be loaded if {function} or {block} tags are executed in nocache mode
https://github.com/smarty-php/smarty/issues/371
This commit is contained in:
@@ -1,4 +1,8 @@
|
|||||||
===== 3.1.32 - dev ===
|
===== 3.1.32 - dev ===
|
||||||
|
26.03.2018
|
||||||
|
- bugfix plugins may not be loaded if {function} or {block} tags are executed in nocache mode
|
||||||
|
https://github.com/smarty-php/smarty/issues/371
|
||||||
|
|
||||||
26.03.2018
|
26.03.2018
|
||||||
- new feature {parent} = {$smarty.block.parent} {child} = {$smarty.block.child}
|
- new feature {parent} = {$smarty.block.parent} {child} = {$smarty.block.child}
|
||||||
|
|
||||||
|
@@ -112,7 +112,7 @@ class Smarty extends Smarty_Internal_TemplateBase
|
|||||||
/**
|
/**
|
||||||
* smarty version
|
* smarty version
|
||||||
*/
|
*/
|
||||||
const SMARTY_VERSION = '3.1.32-dev-44';
|
const SMARTY_VERSION = '3.1.32-dev-45';
|
||||||
/**
|
/**
|
||||||
* define variable scopes
|
* define variable scopes
|
||||||
*/
|
*/
|
||||||
|
@@ -77,6 +77,7 @@ class Smarty_Internal_Compile_Block extends Smarty_Internal_Compile_Shared_Inher
|
|||||||
array($_attr, $compiler->nocache, $compiler->parser->current_buffer,
|
array($_attr, $compiler->nocache, $compiler->parser->current_buffer,
|
||||||
$compiler->template->compiled->has_nocache_code,
|
$compiler->template->compiled->has_nocache_code,
|
||||||
$compiler->template->caching));
|
$compiler->template->caching));
|
||||||
|
$compiler->saveRequiredPlugins(true);
|
||||||
$compiler->nocache = $compiler->nocache | $compiler->tag_nocache;
|
$compiler->nocache = $compiler->nocache | $compiler->tag_nocache;
|
||||||
$compiler->parser->current_buffer = new Smarty_Internal_ParseTree_Template();
|
$compiler->parser->current_buffer = new Smarty_Internal_ParseTree_Template();
|
||||||
$compiler->template->compiled->has_nocache_code = false;
|
$compiler->template->compiled->has_nocache_code = false;
|
||||||
@@ -126,7 +127,8 @@ class Smarty_Internal_Compile_Blockclose extends Smarty_Internal_Compile_Shared_
|
|||||||
$output .= "public \${$property} = " . var_export($value,true) .";\n";
|
$output .= "public \${$property} = " . var_export($value,true) .";\n";
|
||||||
}
|
}
|
||||||
$output .= "public function callBlock(Smarty_Internal_Template \$_smarty_tpl) {\n";
|
$output .= "public function callBlock(Smarty_Internal_Template \$_smarty_tpl) {\n";
|
||||||
//$output .= "/*/%%SmartyNocache:{$compiler->template->compiled->nocache_hash}%%*/\n";
|
$output .= $compiler->compileRequiredPlugins();
|
||||||
|
$compiler->restoreRequiredPlugins();
|
||||||
if ($compiler->template->compiled->has_nocache_code) {
|
if ($compiler->template->compiled->has_nocache_code) {
|
||||||
$output .= "\$_smarty_tpl->cached->hashes['{$compiler->template->compiled->nocache_hash}'] = true;\n";
|
$output .= "\$_smarty_tpl->cached->hashes['{$compiler->template->compiled->nocache_hash}'] = true;\n";
|
||||||
}
|
}
|
||||||
@@ -151,16 +153,6 @@ class Smarty_Internal_Compile_Blockclose extends Smarty_Internal_Compile_Shared_
|
|||||||
$output));
|
$output));
|
||||||
$compiler->blockOrFunctionCode .= $compiler->parser->current_buffer->to_smarty_php($compiler->parser);
|
$compiler->blockOrFunctionCode .= $compiler->parser->current_buffer->to_smarty_php($compiler->parser);
|
||||||
$compiler->parser->current_buffer = new Smarty_Internal_ParseTree_Template();
|
$compiler->parser->current_buffer = new Smarty_Internal_ParseTree_Template();
|
||||||
// nocache plugins must be copied
|
|
||||||
if (!empty($compiler->template->compiled->required_plugins[ 'nocache' ])) {
|
|
||||||
foreach ($compiler->template->compiled->required_plugins[ 'nocache' ] as $plugin => $tmp) {
|
|
||||||
foreach ($tmp as $type => $data) {
|
|
||||||
$compiler->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $plugin ][ $type ] =
|
|
||||||
$data;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// restore old status
|
// restore old status
|
||||||
$compiler->template->compiled->has_nocache_code = $_has_nocache_code;
|
$compiler->template->compiled->has_nocache_code = $_has_nocache_code;
|
||||||
$compiler->tag_nocache = $compiler->nocache;
|
$compiler->tag_nocache = $compiler->nocache;
|
||||||
|
@@ -67,6 +67,7 @@ class Smarty_Internal_Compile_Function extends Smarty_Internal_CompileBase
|
|||||||
// Init temporary context
|
// Init temporary context
|
||||||
$compiler->parser->current_buffer = new Smarty_Internal_ParseTree_Template();
|
$compiler->parser->current_buffer = new Smarty_Internal_ParseTree_Template();
|
||||||
$compiler->template->compiled->has_nocache_code = false;
|
$compiler->template->compiled->has_nocache_code = false;
|
||||||
|
$compiler->saveRequiredPlugins(true);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -134,13 +135,14 @@ class Smarty_Internal_Compile_Functionclose extends Smarty_Internal_CompileBase
|
|||||||
$output .= "if (!function_exists('{$_funcNameCaching}')) {\n";
|
$output .= "if (!function_exists('{$_funcNameCaching}')) {\n";
|
||||||
$output .= "function {$_funcNameCaching} (Smarty_Internal_Template \$_smarty_tpl,\$params) {\n";
|
$output .= "function {$_funcNameCaching} (Smarty_Internal_Template \$_smarty_tpl,\$params) {\n";
|
||||||
$output .= "ob_start();\n";
|
$output .= "ob_start();\n";
|
||||||
|
$output .= $compiler->compileRequiredPlugins();
|
||||||
$output .= "\$_smarty_tpl->compiled->has_nocache_code = true;\n";
|
$output .= "\$_smarty_tpl->compiled->has_nocache_code = true;\n";
|
||||||
$output .= $_paramsCode;
|
$output .= $_paramsCode;
|
||||||
$output .= "foreach (\$params as \$key => \$value) {\n\$_smarty_tpl->tpl_vars[\$key] = new Smarty_Variable(\$value, \$_smarty_tpl->isRenderingCache);\n}";
|
$output .= "foreach (\$params as \$key => \$value) {\n\$_smarty_tpl->tpl_vars[\$key] = new Smarty_Variable(\$value, \$_smarty_tpl->isRenderingCache);\n}\n";
|
||||||
$output .= "\$params = var_export(\$params, true);\n";
|
$output .= "\$params = var_export(\$params, true);\n";
|
||||||
$output .= "echo \"/*%%SmartyNocache:{$compiler->template->compiled->nocache_hash}%%*/<?php ";
|
$output .= "echo \"/*%%SmartyNocache:{$compiler->template->compiled->nocache_hash}%%*/<?php ";
|
||||||
$output .= "\\\$_smarty_tpl->smarty->ext->_tplFunction->saveTemplateVariables(\\\$_smarty_tpl, '{$_name}');\nforeach (\$params as \\\$key => \\\$value) {\n\\\$_smarty_tpl->tpl_vars[\\\$key] = new Smarty_Variable(\\\$value, \\\$_smarty_tpl->isRenderingCache);\n}\n?>";
|
$output .= "\\\$_smarty_tpl->smarty->ext->_tplFunction->saveTemplateVariables(\\\$_smarty_tpl, '{$_name}');\nforeach (\$params as \\\$key => \\\$value) {\n\\\$_smarty_tpl->tpl_vars[\\\$key] = new Smarty_Variable(\\\$value, \\\$_smarty_tpl->isRenderingCache);\n}\n?>";
|
||||||
$output .= "/*/%%SmartyNocache:{$compiler->template->compiled->nocache_hash}%%*/\n\";?>";
|
$output .= "/*/%%SmartyNocache:{$compiler->template->compiled->nocache_hash}%%*/\";?>";
|
||||||
$compiler->parser->current_buffer->append_subtree($compiler->parser,
|
$compiler->parser->current_buffer->append_subtree($compiler->parser,
|
||||||
new Smarty_Internal_ParseTree_Tag($compiler->parser,
|
new Smarty_Internal_ParseTree_Tag($compiler->parser,
|
||||||
$output));
|
$output));
|
||||||
@@ -166,7 +168,9 @@ class Smarty_Internal_Compile_Functionclose extends Smarty_Internal_CompileBase
|
|||||||
$output .= "if (!function_exists('{$_funcName}')) {\n";
|
$output .= "if (!function_exists('{$_funcName}')) {\n";
|
||||||
$output .= "function {$_funcName}(Smarty_Internal_Template \$_smarty_tpl,\$params) {\n";
|
$output .= "function {$_funcName}(Smarty_Internal_Template \$_smarty_tpl,\$params) {\n";
|
||||||
$output .= $_paramsCode;
|
$output .= $_paramsCode;
|
||||||
$output .= "foreach (\$params as \$key => \$value) {\n\$_smarty_tpl->tpl_vars[\$key] = new Smarty_Variable(\$value, \$_smarty_tpl->isRenderingCache);\n}?>";
|
$output .= "foreach (\$params as \$key => \$value) {\n\$_smarty_tpl->tpl_vars[\$key] = new Smarty_Variable(\$value, \$_smarty_tpl->isRenderingCache);\n}\n";
|
||||||
|
$output .= $compiler->compileCheckPlugins(array_merge($compiler->required_plugins[ 'compiled' ], $compiler->required_plugins[ 'nocache' ]));
|
||||||
|
$output .= "?>\n";
|
||||||
$compiler->parser->current_buffer->append_subtree($compiler->parser,
|
$compiler->parser->current_buffer->append_subtree($compiler->parser,
|
||||||
new Smarty_Internal_ParseTree_Tag($compiler->parser,
|
new Smarty_Internal_ParseTree_Tag($compiler->parser,
|
||||||
$output));
|
$output));
|
||||||
@@ -178,19 +182,10 @@ class Smarty_Internal_Compile_Functionclose extends Smarty_Internal_CompileBase
|
|||||||
new Smarty_Internal_ParseTree_Tag($compiler->parser,
|
new Smarty_Internal_ParseTree_Tag($compiler->parser,
|
||||||
$output));
|
$output));
|
||||||
$compiler->parent_compiler->blockOrFunctionCode .= $compiler->parser->current_buffer->to_smarty_php($compiler->parser);
|
$compiler->parent_compiler->blockOrFunctionCode .= $compiler->parser->current_buffer->to_smarty_php($compiler->parser);
|
||||||
// nocache plugins must be copied
|
// restore old buffer
|
||||||
if (!empty($compiler->template->compiled->required_plugins[ 'nocache' ])) {
|
|
||||||
foreach ($compiler->template->compiled->required_plugins[ 'nocache' ] as $plugin => $tmp) {
|
|
||||||
foreach ($tmp as $type => $data) {
|
|
||||||
$compiler->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $plugin ][ $type ] =
|
|
||||||
$data;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// restore old buffer
|
|
||||||
|
|
||||||
$compiler->parser->current_buffer = $saved_data[ 1 ];
|
$compiler->parser->current_buffer = $saved_data[ 1 ];
|
||||||
// restore old status
|
// restore old status
|
||||||
|
$compiler->restoreRequiredPlugins();
|
||||||
$compiler->template->compiled->has_nocache_code = $saved_data[ 2 ];
|
$compiler->template->compiled->has_nocache_code = $saved_data[ 2 ];
|
||||||
$compiler->template->caching = $saved_data[ 3 ];
|
$compiler->template->caching = $saved_data[ 3 ];
|
||||||
return true;
|
return true;
|
||||||
|
@@ -130,8 +130,8 @@ class Smarty_Internal_Compile_Private_Modifier extends Smarty_Internal_CompileBa
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (isset($compiler->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ $modifier ][ Smarty::PLUGIN_MODIFIER ][ 'file' ]) ||
|
if (isset($compiler->required_plugins[ 'nocache' ][ $modifier ][ Smarty::PLUGIN_MODIFIER ][ 'file' ]) ||
|
||||||
isset($compiler->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $modifier ][ Smarty::PLUGIN_MODIFIER ][ 'file' ])
|
isset($compiler->required_plugins[ 'compiled' ][ $modifier ][ Smarty::PLUGIN_MODIFIER ][ 'file' ])
|
||||||
) {
|
) {
|
||||||
// was a plugin
|
// was a plugin
|
||||||
$compiler->known_modifier_type[ $modifier ] = 4;
|
$compiler->known_modifier_type[ $modifier ] = 4;
|
||||||
|
@@ -58,35 +58,9 @@ class Smarty_Internal_Runtime_CodeFrame
|
|||||||
var_export($_template->smarty->ext->_tplFunction->getTplFunction($_template), true) . ");\n";
|
var_export($_template->smarty->ext->_tplFunction->getTplFunction($_template), true) . ");\n";
|
||||||
|
|
||||||
}
|
}
|
||||||
// include code for plugins
|
// include code for required plugins
|
||||||
if (!$cache) {
|
if (!$cache && isset($compiler)) {
|
||||||
if (!empty($_template->compiled->required_plugins[ 'compiled' ])) {
|
$output .= $compiler->compileRequiredPlugins();
|
||||||
foreach ($_template->compiled->required_plugins[ 'compiled' ] as $tmp) {
|
|
||||||
foreach ($tmp as $data) {
|
|
||||||
$file = addslashes($data[ 'file' ]);
|
|
||||||
if (is_array($data[ 'function' ])) {
|
|
||||||
$output .= "if (!is_callable(array('{$data['function'][0]}','{$data['function'][1]}'))) require_once '{$file}';\n";
|
|
||||||
} else {
|
|
||||||
$output .= "if (!is_callable('{$data['function']}')) require_once '{$file}';\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ($_template->caching && !empty($_template->compiled->required_plugins[ 'nocache' ])) {
|
|
||||||
$_template->compiled->has_nocache_code = true;
|
|
||||||
$output .= "echo '/*%%SmartyNocache:{$_template->compiled->nocache_hash}%%*/<?php \$_smarty = \$_smarty_tpl->smarty; ";
|
|
||||||
foreach ($_template->compiled->required_plugins[ 'nocache' ] as $tmp) {
|
|
||||||
foreach ($tmp as $data) {
|
|
||||||
$file = addslashes($data[ 'file' ]);
|
|
||||||
if (is_array($data[ 'function' ])) {
|
|
||||||
$output .= addslashes("if (!is_callable(array('{$data['function'][0]}','{$data['function'][1]}'))) require_once '{$file}';\n");
|
|
||||||
} else {
|
|
||||||
$output .= addslashes("if (!is_callable('{$data['function']}')) require_once '{$file}';\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$output .= "?>/*/%%SmartyNocache:{$_template->compiled->nocache_hash}%%*/';\n";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
$output .= "?>";
|
$output .= "?>";
|
||||||
$output .= $content;
|
$output .= $content;
|
||||||
|
@@ -120,15 +120,13 @@ class Smarty_Internal_Runtime_TplFunction
|
|||||||
}
|
}
|
||||||
// add template function code to cache file
|
// add template function code to cache file
|
||||||
if (isset($tplPtr->cached)) {
|
if (isset($tplPtr->cached)) {
|
||||||
/* @var Smarty_Template_Cached $cache */
|
$content = $tplPtr->cached->read($tplPtr);
|
||||||
$cache = $tplPtr->cached;
|
|
||||||
$content = $cache->read($tplPtr);
|
|
||||||
if ($content) {
|
if ($content) {
|
||||||
// check if we must update file dependency
|
// check if we must update file dependency
|
||||||
if (!preg_match("/'{$funcParam['uid']}'(.*?)'nocache_hash'/", $content, $match2)) {
|
if (!preg_match("/'{$funcParam['uid']}'(.*?)'nocache_hash'/", $content, $match2)) {
|
||||||
$content = preg_replace("/('file_dependency'(.*?)\()/", "\\1{$match1[0]}", $content);
|
$content = preg_replace("/('file_dependency'(.*?)\()/", "\\1{$match1[0]}", $content);
|
||||||
}
|
}
|
||||||
$tplPtr->smarty->ext->_updateCache->write($cache, $tplPtr,
|
$tplPtr->smarty->ext->_updateCache->write($tplPtr,
|
||||||
preg_replace('/\s*\?>\s*$/', "\n", $content) .
|
preg_replace('/\s*\?>\s*$/', "\n", $content) .
|
||||||
"\n" . preg_replace(array('/^\s*<\?php\s+/',
|
"\n" . preg_replace(array('/^\s*<\?php\s+/',
|
||||||
'/\s*\?>\s*$/',), "\n",
|
'/\s*\?>\s*$/',), "\n",
|
||||||
|
@@ -115,41 +115,43 @@ class Smarty_Internal_Runtime_UpdateCache
|
|||||||
$content = $_template->smarty->ext->_filterHandler->runFilter('output', $content, $_template);
|
$content = $_template->smarty->ext->_filterHandler->runFilter('output', $content, $_template);
|
||||||
}
|
}
|
||||||
// write cache file content
|
// write cache file content
|
||||||
$this->writeCachedContent($cached, $_template, $content);
|
$this->writeCachedContent($_template, $content);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Writes the content to cache resource
|
* Writes the content to cache resource
|
||||||
*
|
*
|
||||||
* @param \Smarty_Template_Cached $cached
|
|
||||||
* @param Smarty_Internal_Template $_template
|
* @param Smarty_Internal_Template $_template
|
||||||
* @param string $content
|
* @param string $content
|
||||||
*
|
*
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function writeCachedContent(Smarty_Template_Cached $cached, Smarty_Internal_Template $_template, $content)
|
public function writeCachedContent(Smarty_Internal_Template $_template, $content)
|
||||||
{
|
{
|
||||||
if ($_template->source->handler->recompiled || !$_template->caching
|
if ($_template->source->handler->recompiled || !$_template->caching
|
||||||
) {
|
) {
|
||||||
// don't write cache file
|
// don't write cache file
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
if (!isset($_template->cached)) {
|
||||||
|
$_template->loadCached();
|
||||||
|
}
|
||||||
$content = $_template->smarty->ext->_codeFrame->create($_template, $content, '', true);
|
$content = $_template->smarty->ext->_codeFrame->create($_template, $content, '', true);
|
||||||
return $this->write($cached, $_template, $content);
|
return $this->write($_template, $content);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Write this cache object to handler
|
* Write this cache object to handler
|
||||||
*
|
*
|
||||||
* @param \Smarty_Template_Cached $cached
|
|
||||||
* @param Smarty_Internal_Template $_template template object
|
* @param Smarty_Internal_Template $_template template object
|
||||||
* @param string $content content to cache
|
* @param string $content content to cache
|
||||||
*
|
*
|
||||||
* @return bool success
|
* @return bool success
|
||||||
*/
|
*/
|
||||||
public function write(Smarty_Template_Cached $cached, Smarty_Internal_Template $_template, $content)
|
public function write(Smarty_Internal_Template $_template, $content)
|
||||||
{
|
{
|
||||||
if (!$_template->source->handler->recompiled) {
|
if (!$_template->source->handler->recompiled) {
|
||||||
|
$cached = $_template->cached;
|
||||||
if ($cached->handler->writeCachedContent($_template, $content)) {
|
if ($cached->handler->writeCachedContent($_template, $content)) {
|
||||||
$cached->content = null;
|
$cached->content = null;
|
||||||
$cached->timestamp = time();
|
$cached->timestamp = time();
|
||||||
@@ -160,6 +162,7 @@ class Smarty_Internal_Runtime_UpdateCache
|
|||||||
if ($_template->smarty->cache_locking) {
|
if ($_template->smarty->cache_locking) {
|
||||||
$cached->handler->releaseLock($_template->smarty, $cached);
|
$cached->handler->releaseLock($_template->smarty, $cached);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
$cached->content = null;
|
$cached->content = null;
|
||||||
@@ -168,6 +171,7 @@ class Smarty_Internal_Runtime_UpdateCache
|
|||||||
$cached->valid = false;
|
$cached->valid = false;
|
||||||
$cached->processed = false;
|
$cached->processed = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -234,15 +234,6 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase
|
|||||||
$this->smarty->_debug->display_debug($this, true);
|
$this->smarty->_debug->display_debug($this, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ($this->_isSubTpl()) {
|
|
||||||
foreach ($this->compiled->required_plugins as $code => $tmp1) {
|
|
||||||
foreach ($tmp1 as $name => $tmp) {
|
|
||||||
foreach ($tmp as $type => $data) {
|
|
||||||
$this->parent->compiled->required_plugins[ $code ][ $name ][ $type ] = $data;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!$no_output_filter &&
|
if (!$no_output_filter &&
|
||||||
(!$this->caching || $this->cached->has_nocache_code || $this->source->handler->recompiled) &&
|
(!$this->caching || $this->cached->has_nocache_code || $this->source->handler->recompiled) &&
|
||||||
(isset($this->smarty->autoload_filters[ 'output' ]) ||
|
(isset($this->smarty->autoload_filters[ 'output' ]) ||
|
||||||
@@ -428,6 +419,39 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if plugins are callable require file otherwise
|
||||||
|
*
|
||||||
|
* @param array $plugins required plugins
|
||||||
|
*
|
||||||
|
* @throws \SmartyException
|
||||||
|
*/
|
||||||
|
public function _checkPlugins($plugins) {
|
||||||
|
static $checked = array();
|
||||||
|
foreach($plugins as $plugin) {
|
||||||
|
$name = join('::', (array)$plugin[ 'function' ]);
|
||||||
|
if (!isset($checked[$name])) {
|
||||||
|
if (!is_callable($plugin['function'])) {
|
||||||
|
if (is_file($plugin['file'])) {
|
||||||
|
require_once $plugin['file'];
|
||||||
|
if (is_callable($plugin['function'])) {
|
||||||
|
$checked[ $name ] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$checked[ $name ] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!isset($checked[ $name ])) {
|
||||||
|
if (false !== $this->smarty->loadPlugin($name)) {
|
||||||
|
$checked[ $name ] = true;
|
||||||
|
} else {
|
||||||
|
throw new SmartyException("Plugin '{$name}' not callable");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This function is executed automatically when a compiled or cached template file is included
|
* This function is executed automatically when a compiled or cached template file is included
|
||||||
* - Decode saved properties from compiled template and cache files
|
* - Decode saved properties from compiled template and cache files
|
||||||
@@ -523,7 +547,7 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase
|
|||||||
*/
|
*/
|
||||||
public function writeCachedContent($content)
|
public function writeCachedContent($content)
|
||||||
{
|
{
|
||||||
return $this->smarty->ext->_updateCache->writeCachedContent($this->cached, $this, $content);
|
return $this->smarty->ext->_updateCache->writeCachedContent($this, $content);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -57,6 +57,14 @@ abstract class Smarty_Internal_TemplateCompilerBase
|
|||||||
* @var bool
|
* @var bool
|
||||||
*/
|
*/
|
||||||
public $suppressNocacheProcessing = false;
|
public $suppressNocacheProcessing = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* caching enabled (copied from template object)
|
||||||
|
*
|
||||||
|
* @var int
|
||||||
|
*/
|
||||||
|
public $caching = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* tag stack
|
* tag stack
|
||||||
*
|
*
|
||||||
@@ -69,6 +77,18 @@ abstract class Smarty_Internal_TemplateCompilerBase
|
|||||||
* @var array
|
* @var array
|
||||||
*/
|
*/
|
||||||
public $_tag_stack_count = array();
|
public $_tag_stack_count = array();
|
||||||
|
/**
|
||||||
|
* Plugins used by template
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
public $required_plugins = array('compiled' => array(), 'nocache' => array());
|
||||||
|
/**
|
||||||
|
* Required plugins stack
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
public $required_plugins_stack = array();
|
||||||
/**
|
/**
|
||||||
* current template
|
* current template
|
||||||
*
|
*
|
||||||
@@ -374,6 +394,7 @@ abstract class Smarty_Internal_TemplateCompilerBase
|
|||||||
} else {
|
} else {
|
||||||
$this->nocache_hash = $template->compiled->nocache_hash;
|
$this->nocache_hash = $template->compiled->nocache_hash;
|
||||||
}
|
}
|
||||||
|
$this->caching = $template->caching;
|
||||||
// flag for nocache sections
|
// flag for nocache sections
|
||||||
$this->nocache = $nocache;
|
$this->nocache = $nocache;
|
||||||
$this->tag_nocache = false;
|
$this->tag_nocache = false;
|
||||||
@@ -711,25 +732,25 @@ abstract class Smarty_Internal_TemplateCompilerBase
|
|||||||
public function getPlugin($plugin_name, $plugin_type)
|
public function getPlugin($plugin_name, $plugin_type)
|
||||||
{
|
{
|
||||||
$function = null;
|
$function = null;
|
||||||
if ($this->template->caching && ($this->nocache || $this->tag_nocache)) {
|
if ($this->caching && ($this->nocache || $this->tag_nocache)) {
|
||||||
if (isset($this->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ])) {
|
if (isset($this->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ])) {
|
||||||
$function =
|
$function =
|
||||||
$this->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ][ 'function' ];
|
$this->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ][ 'function' ];
|
||||||
} else if (isset($this->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ])) {
|
} else if (isset($this->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ])) {
|
||||||
$this->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ] =
|
$this->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ] =
|
||||||
$this->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ];
|
$this->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ];
|
||||||
$function =
|
$function =
|
||||||
$this->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ][ 'function' ];
|
$this->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ][ 'function' ];
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (isset($this->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ])) {
|
if (isset($this->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ])) {
|
||||||
$function =
|
$function =
|
||||||
$this->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ][ 'function' ];
|
$this->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ][ 'function' ];
|
||||||
} else if (isset($this->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ])) {
|
} else if (isset($this->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ])) {
|
||||||
$this->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ] =
|
$this->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ] =
|
||||||
$this->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ];
|
$this->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ];
|
||||||
$function =
|
$function =
|
||||||
$this->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ][ 'function' ];
|
$this->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ][ 'function' ];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (isset($function)) {
|
if (isset($function)) {
|
||||||
@@ -742,15 +763,15 @@ abstract class Smarty_Internal_TemplateCompilerBase
|
|||||||
$function = 'smarty_' . $plugin_type . '_' . $plugin_name;
|
$function = 'smarty_' . $plugin_type . '_' . $plugin_name;
|
||||||
$file = $this->smarty->loadPlugin($function, false);
|
$file = $this->smarty->loadPlugin($function, false);
|
||||||
if (is_string($file)) {
|
if (is_string($file)) {
|
||||||
if ($this->template->caching && ($this->nocache || $this->tag_nocache)) {
|
if ($this->caching && ($this->nocache || $this->tag_nocache)) {
|
||||||
$this->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ][ 'file' ] =
|
$this->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ][ 'file' ] =
|
||||||
$file;
|
$file;
|
||||||
$this->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ][ 'function' ] =
|
$this->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ][ 'function' ] =
|
||||||
$function;
|
$function;
|
||||||
} else {
|
} else {
|
||||||
$this->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ][ 'file' ] =
|
$this->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ][ 'file' ] =
|
||||||
$file;
|
$file;
|
||||||
$this->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ][ 'function' ] =
|
$this->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ][ 'function' ] =
|
||||||
$function;
|
$function;
|
||||||
}
|
}
|
||||||
if ($plugin_type === 'modifier') {
|
if ($plugin_type === 'modifier') {
|
||||||
@@ -790,15 +811,15 @@ abstract class Smarty_Internal_TemplateCompilerBase
|
|||||||
$this->tag_nocache = $this->tag_nocache || !$cacheable;
|
$this->tag_nocache = $this->tag_nocache || !$cacheable;
|
||||||
if ($script !== null) {
|
if ($script !== null) {
|
||||||
if (is_file($script)) {
|
if (is_file($script)) {
|
||||||
if ($this->template->caching && ($this->nocache || $this->tag_nocache)) {
|
if ($this->caching && ($this->nocache || $this->tag_nocache)) {
|
||||||
$this->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ $tag ][ $plugin_type ][ 'file' ] =
|
$this->required_plugins[ 'nocache' ][ $tag ][ $plugin_type ][ 'file' ] =
|
||||||
$script;
|
$script;
|
||||||
$this->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ $tag ][ $plugin_type ][ 'function' ] =
|
$this->required_plugins[ 'nocache' ][ $tag ][ $plugin_type ][ 'function' ] =
|
||||||
$callback;
|
$callback;
|
||||||
} else {
|
} else {
|
||||||
$this->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $tag ][ $plugin_type ][ 'file' ] =
|
$this->required_plugins[ 'compiled' ][ $tag ][ $plugin_type ][ 'file' ] =
|
||||||
$script;
|
$script;
|
||||||
$this->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $tag ][ $plugin_type ][ 'function' ] =
|
$this->required_plugins[ 'compiled' ][ $tag ][ $plugin_type ][ 'function' ] =
|
||||||
$callback;
|
$callback;
|
||||||
}
|
}
|
||||||
require_once $script;
|
require_once $script;
|
||||||
@@ -853,7 +874,7 @@ abstract class Smarty_Internal_TemplateCompilerBase
|
|||||||
// If the template is not evaluated and we have a nocache section and or a nocache tag
|
// If the template is not evaluated and we have a nocache section and or a nocache tag
|
||||||
if ($is_code && !empty($content)) {
|
if ($is_code && !empty($content)) {
|
||||||
// generate replacement code
|
// generate replacement code
|
||||||
if ((!($this->template->source->handler->recompiled) || $this->forceNocache) && $this->template->caching &&
|
if ((!($this->template->source->handler->recompiled) || $this->forceNocache) && $this->caching &&
|
||||||
!$this->suppressNocacheProcessing && ($this->nocache || $this->tag_nocache)
|
!$this->suppressNocacheProcessing && ($this->nocache || $this->tag_nocache)
|
||||||
) {
|
) {
|
||||||
$this->template->compiled->has_nocache_code = true;
|
$this->template->compiled->has_nocache_code = true;
|
||||||
@@ -862,9 +883,9 @@ abstract class Smarty_Internal_TemplateCompilerBase
|
|||||||
$_output = "<?php echo '/*%%SmartyNocache:{$this->nocache_hash}%%*/{$_output}/*/%%SmartyNocache:{$this->nocache_hash}%%*/';?>\n";
|
$_output = "<?php echo '/*%%SmartyNocache:{$this->nocache_hash}%%*/{$_output}/*/%%SmartyNocache:{$this->nocache_hash}%%*/';?>\n";
|
||||||
// make sure we include modifier plugins for nocache code
|
// make sure we include modifier plugins for nocache code
|
||||||
foreach ($this->modifier_plugins as $plugin_name => $dummy) {
|
foreach ($this->modifier_plugins as $plugin_name => $dummy) {
|
||||||
if (isset($this->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $plugin_name ][ 'modifier' ])) {
|
if (isset($this->required_plugins[ 'compiled' ][ $plugin_name ][ 'modifier' ])) {
|
||||||
$this->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ $plugin_name ][ 'modifier' ] =
|
$this->required_plugins[ 'nocache' ][ $plugin_name ][ 'modifier' ] =
|
||||||
$this->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $plugin_name ][ 'modifier' ];
|
$this->required_plugins[ 'compiled' ][ $plugin_name ][ 'modifier' ];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -1266,6 +1287,65 @@ abstract class Smarty_Internal_TemplateCompilerBase
|
|||||||
return $code;
|
return $code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Save current required plugins
|
||||||
|
*
|
||||||
|
* @param bool $init if true init required plugins
|
||||||
|
*/
|
||||||
|
public function saveRequiredPlugins($init=false)
|
||||||
|
{
|
||||||
|
$this->required_plugins_stack[] = $this->required_plugins;
|
||||||
|
if ($init) {
|
||||||
|
$this->required_plugins = array('compiled' => array(), 'nocache' => array());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Restore required plugins
|
||||||
|
*/
|
||||||
|
public function restoreRequiredPlugins()
|
||||||
|
{
|
||||||
|
$this->required_plugins = array_pop($this->required_plugins_stack);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compile code to call Smarty_Internal_Template::_checkPlugins()
|
||||||
|
* for required plugins
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function compileRequiredPlugins()
|
||||||
|
{
|
||||||
|
$code = $this->compileCheckPlugins($this->required_plugins[ 'compiled' ]);
|
||||||
|
if ($this->caching && !empty($this->required_plugins[ 'nocache' ])) {
|
||||||
|
$code .= $this->makeNocacheCode($this->compileCheckPlugins($this->required_plugins[ 'nocache' ]));
|
||||||
|
}
|
||||||
|
return $code;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compile code to call Smarty_Internal_Template::_checkPlugins
|
||||||
|
* - checks if plugin is callable require otherwise
|
||||||
|
*
|
||||||
|
* @param $requiredPlugins
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function compileCheckPlugins($requiredPlugins)
|
||||||
|
{
|
||||||
|
if (!empty($requiredPlugins)) {
|
||||||
|
$plugins = array();
|
||||||
|
foreach ($requiredPlugins as $plugin) {
|
||||||
|
foreach ($plugin as $data) {
|
||||||
|
$plugins[] = $data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return '$_smarty_tpl->_checkPlugins(' . $this->getVarExport($plugins) . ');' . "\n";
|
||||||
|
} else {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* method to compile a Smarty template
|
* method to compile a Smarty template
|
||||||
*
|
*
|
||||||
|
@@ -72,13 +72,6 @@ abstract class Smarty_Template_Resource_Base
|
|||||||
*/
|
*/
|
||||||
public $content = null;
|
public $content = null;
|
||||||
|
|
||||||
/**
|
|
||||||
* required plugins
|
|
||||||
*
|
|
||||||
* @var array
|
|
||||||
*/
|
|
||||||
public $required_plugins = array();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Included sub templates
|
* Included sub templates
|
||||||
* - index name
|
* - index name
|
||||||
|
Reference in New Issue
Block a user