- 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:
Uwe Tews
2018-03-28 07:15:29 +02:00
parent cf22e986c0
commit 336c07c23f
11 changed files with 175 additions and 111 deletions

View File

@@ -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}

View File

@@ -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
*/ */

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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",

View File

@@ -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;
} }
} }

View File

@@ -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);
} }
/** /**

View File

@@ -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
* *

View File

@@ -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