converted 3 public properties on Template into getters/setters. unified Template creation code. Provided a getter/setter for the has_nocache_code property. Removed the useless DataObject class. Fixed a few tests. Removed the variable-allow-php-templates property from the docs.

This commit is contained in:
Simon Wisselink
2023-01-13 00:04:08 +01:00
parent 541f0821f0
commit e0f2c36d4d
49 changed files with 723 additions and 922 deletions

View File

@@ -4,7 +4,6 @@ Smarty Class Variables {#api.variables}
These are all of the available Smarty class variables. You can access These are all of the available Smarty class variables. You can access
them directly, or use the corresponding setter/getter methods. them directly, or use the corresponding setter/getter methods.
- [$allow_php_templates](./api-variables/variable-allow-php-templates.md)
- [$auto_literal](./api-variables/variable-auto-literal.md) - [$auto_literal](./api-variables/variable-auto-literal.md)
- [$cache_dir](./api-variables/variable-cache-dir.md) - [$cache_dir](./api-variables/variable-cache-dir.md)
- [$cache_id](./api-variables/variable-cache-id.md) - [$cache_id](./api-variables/variable-cache-id.md)

View File

@@ -1,18 +0,0 @@
\$allow\_php\_templates {#variable.allow.php.templates}
=======================
By default the PHP template file resource is disabled. Setting
`$allow_php_templates` to TRUE will enable PHP template files.
::: {.informalexample}
<?php
$smarty->allow_php_templates = true;
?>
:::
> **Note**
>
> The PHP template file resource is an undocumented deprecated feature.

View File

@@ -85,9 +85,9 @@ abstract class Base
*/ */
public function getCachedContent(Template $_template) public function getCachedContent(Template $_template)
{ {
if ($_template->cached->handler->process($_template)) { if ($_template->getCached()->handler->process($_template)) {
ob_start(); ob_start();
$unifunc = $_template->cached->unifunc; $unifunc = $_template->getCached()->unifunc;
$unifunc($_template); $unifunc($_template);
return ob_get_clean(); return ob_get_clean();
} }

View File

@@ -143,13 +143,13 @@ abstract class Custom extends Base
$update = false $update = false
) { ) {
if (!$cached) { if (!$cached) {
$cached = $_smarty_tpl->cached; $cached = $_smarty_tpl->getCached();
} }
$content = $cached->content ? $cached->content : null; $content = $cached->content ? $cached->content : null;
$timestamp = $cached->timestamp ? $cached->timestamp : null; $timestamp = $cached->timestamp ? $cached->timestamp : null;
if ($content === null || !$timestamp) { if ($content === null || !$timestamp) {
$this->fetch( $this->fetch(
$_smarty_tpl->cached->filepath, $_smarty_tpl->getCached()->filepath,
$_smarty_tpl->source->name, $_smarty_tpl->source->name,
$_smarty_tpl->cache_id, $_smarty_tpl->cache_id,
$_smarty_tpl->compile_id, $_smarty_tpl->compile_id,
@@ -176,7 +176,7 @@ abstract class Custom extends Base
public function storeCachedContent(Template $_template, $content) public function storeCachedContent(Template $_template, $content)
{ {
return $this->save( return $this->save(
$_template->cached->filepath, $_template->getCached()->filepath,
$_template->source->name, $_template->source->name,
$_template->cache_id, $_template->cache_id,
$_template->compile_id, $_template->compile_id,
@@ -194,11 +194,11 @@ abstract class Custom extends Base
*/ */
public function retrieveCachedContent(Template $_template) public function retrieveCachedContent(Template $_template)
{ {
$content = $_template->cached->content ?: null; $content = $_template->getCached()->content ?: null;
if ($content === null) { if ($content === null) {
$timestamp = null; $timestamp = null;
$this->fetch( $this->fetch(
$_template->cached->filepath, $_template->getCached()->filepath,
$_template->source->name, $_template->source->name,
$_template->cache_id, $_template->cache_id,
$_template->compile_id, $_template->compile_id,

View File

@@ -108,12 +108,12 @@ class File extends Base
Cached $cached = null, Cached $cached = null,
$update = false $update = false
) { ) {
$_smarty_tpl->cached->valid = false; $_smarty_tpl->getCached()->valid = false;
if ($update && defined('HHVM_VERSION')) { if ($update && defined('HHVM_VERSION')) {
eval('?>' . file_get_contents($_smarty_tpl->cached->filepath)); eval('?>' . file_get_contents($_smarty_tpl->getCached()->filepath));
return true; return true;
} else { } else {
return @include $_smarty_tpl->cached->filepath; return @include $_smarty_tpl->getCached()->filepath;
} }
} }
@@ -128,15 +128,15 @@ class File extends Base
*/ */
public function storeCachedContent(Template $_template, $content) public function storeCachedContent(Template $_template, $content)
{ {
if ($_template->smarty->writeFile($_template->cached->filepath, $content) === true) { if ($_template->smarty->writeFile($_template->getCached()->filepath, $content) === true) {
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($_template->cached->filepath, true); opcache_invalidate($_template->getCached()->filepath, true);
} elseif (function_exists('apc_compile_file')) { } elseif (function_exists('apc_compile_file')) {
apc_compile_file($_template->cached->filepath); apc_compile_file($_template->getCached()->filepath);
} }
$cached = $_template->cached; $cached = $_template->getCached();
$cached->timestamp = $cached->exists = is_file($cached->filepath); $cached->timestamp = $cached->exists = is_file($cached->filepath);
if ($cached->exists) { if ($cached->exists) {
$cached->timestamp = filemtime($cached->filepath); $cached->timestamp = filemtime($cached->filepath);
@@ -155,8 +155,8 @@ class File extends Base
*/ */
public function retrieveCachedContent(Template $_template) public function retrieveCachedContent(Template $_template)
{ {
if (is_file($_template->cached->filepath)) { if (is_file($_template->getCached()->filepath)) {
return file_get_contents($_template->cached->filepath); return file_get_contents($_template->getCached()->filepath);
} }
return false; return false;
} }
@@ -213,7 +213,7 @@ class File extends Base
// remove from template cache // remove from template cache
$tpl->source; // have the template registered before unset() $tpl->source; // have the template registered before unset()
if ($tpl->source->exists) { if ($tpl->source->exists) {
$_resourcename_parts = basename(str_replace('^', '/', $tpl->cached->filepath)); $_resourcename_parts = basename(str_replace('^', '/', $tpl->getCached()->filepath));
} else { } else {
return 0; return 0;
} }

View File

@@ -107,13 +107,13 @@ abstract class KeyValueStore extends Base
$update = false $update = false
) { ) {
if (!$cached) { if (!$cached) {
$cached = $_smarty_tpl->cached; $cached = $_smarty_tpl->getCached();
} }
$content = $cached->content ?: null; $content = $cached->content ?: null;
$timestamp = $cached->timestamp ?: null; $timestamp = $cached->timestamp ?: null;
if ($content === null || !$timestamp) { if ($content === null || !$timestamp) {
if (!$this->fetch( if (!$this->fetch(
$_smarty_tpl->cached->filepath, $_smarty_tpl->getCached()->filepath,
$_smarty_tpl->source->name, $_smarty_tpl->source->name,
$_smarty_tpl->cache_id, $_smarty_tpl->cache_id,
$_smarty_tpl->compile_id, $_smarty_tpl->compile_id,
@@ -143,7 +143,7 @@ abstract class KeyValueStore extends Base
public function storeCachedContent(Template $_template, $content) public function storeCachedContent(Template $_template, $content)
{ {
$this->addMetaTimestamp($content); $this->addMetaTimestamp($content);
return $this->write(array($_template->cached->filepath => $content), $_template->cache_lifetime); return $this->write(array($_template->getCached()->filepath => $content), $_template->cache_lifetime);
} }
/** /**
@@ -155,11 +155,11 @@ abstract class KeyValueStore extends Base
*/ */
public function retrieveCachedContent(Template $_template) public function retrieveCachedContent(Template $_template)
{ {
$content = $_template->cached->content ? $_template->cached->content : null; $content = $_template->getCached()->content ?: null;
$timestamp = null; $timestamp = null;
if ($content === null) { if ($content === null) {
if (!$this->fetch( if (!$this->fetch(
$_template->cached->filepath, $_template->getCached()->filepath,
$_template->source->name, $_template->source->name,
$_template->cache_id, $_template->cache_id,
$_template->compile_id, $_template->compile_id,

View File

@@ -83,13 +83,13 @@ class Block extends Inheritance {
'block', 'block',
[ [
$_attr, $compiler->nocache, $compiler->parser->current_buffer, $_attr, $compiler->nocache, $compiler->parser->current_buffer,
$compiler->template->compiled->has_nocache_code, $compiler->template->getCompiled()->getNocacheCode(),
$compiler->template->caching, $compiler->template->caching,
] ]
); );
$compiler->nocache = $compiler->nocache | $compiler->tag_nocache; $compiler->nocache = $compiler->nocache | $compiler->tag_nocache;
$compiler->parser->current_buffer = new Template(); $compiler->parser->current_buffer = new Template();
$compiler->template->compiled->has_nocache_code = false; $compiler->template->getCompiled()->setNocacheCode(false);
$compiler->suppressNocacheProcessing = true; $compiler->suppressNocacheProcessing = true;
} }
} }

View File

@@ -45,8 +45,8 @@ class BlockClose extends Inheritance {
$output .= "public \${$property} = " . var_export($value, true) . ";\n"; $output .= "public \${$property} = " . var_export($value, true) . ";\n";
} }
$output .= "public function callBlock(\\Smarty\\Template \$_smarty_tpl) {\n"; $output .= "public function callBlock(\\Smarty\\Template \$_smarty_tpl) {\n";
if ($compiler->template->compiled->has_nocache_code) { if ($compiler->template->getCompiled()->getNocacheCode()) {
$output .= "\$_smarty_tpl->cached->hashes['{$compiler->template->compiled->nocache_hash}'] = true;\n"; $output .= "\$_smarty_tpl->getCached()->hashes['{$compiler->template->getCompiled()->nocache_hash}'] = true;\n";
} }
if (isset($_assign)) { if (isset($_assign)) {
$output .= "ob_start();\n"; $output .= "ob_start();\n";
@@ -78,7 +78,7 @@ class BlockClose extends Inheritance {
$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 Template(); $compiler->parser->current_buffer = new Template();
// restore old status // restore old status
$compiler->template->compiled->has_nocache_code = $_has_nocache_code; $compiler->template->getCompiled()->setNocacheCode($_has_nocache_code);
$compiler->tag_nocache = $compiler->nocache; $compiler->tag_nocache = $compiler->nocache;
$compiler->nocache = $_nocache; $compiler->nocache = $_nocache;
$compiler->parser->current_buffer = $_buffer; $compiler->parser->current_buffer = $_buffer;

View File

@@ -41,7 +41,7 @@ class FunctionClose extends Base {
$_attr = $saved_data[0]; $_attr = $saved_data[0];
$_name = trim($_attr['name'], '\'"'); $_name = trim($_attr['name'], '\'"');
$compiler->parent_compiler->tpl_function[$_name]['compiled_filepath'] = $compiler->parent_compiler->tpl_function[$_name]['compiled_filepath'] =
$compiler->parent_compiler->template->compiled->filepath; $compiler->parent_compiler->template->getCompiled()->filepath;
$compiler->parent_compiler->tpl_function[$_name]['uid'] = $compiler->template->source->uid; $compiler->parent_compiler->tpl_function[$_name]['uid'] = $compiler->template->source->uid;
$_parameter = $_attr; $_parameter = $_attr;
unset($_parameter['name']); unset($_parameter['name']);
@@ -56,22 +56,22 @@ class FunctionClose extends Base {
$_functionCode = $compiler->parser->current_buffer; $_functionCode = $compiler->parser->current_buffer;
// setup buffer for template function code // setup buffer for template function code
$compiler->parser->current_buffer = new \Smarty\ParseTree\Template(); $compiler->parser->current_buffer = new \Smarty\ParseTree\Template();
$_funcName = "smarty_template_function_{$_name}_{$compiler->template->compiled->nocache_hash}"; $_funcName = "smarty_template_function_{$_name}_{$compiler->template->getCompiled()->nocache_hash}";
$_funcNameCaching = $_funcName . 'Smarty\Compile\Tag\Nocache'; $_funcNameCaching = $_funcName . 'Smarty\Compile\Tag\Nocache';
if ($compiler->template->compiled->has_nocache_code) { if ($compiler->template->getCompiled()->getNocacheCode()) {
$compiler->parent_compiler->tpl_function[$_name]['call_name_caching'] = $_funcNameCaching; $compiler->parent_compiler->tpl_function[$_name]['call_name_caching'] = $_funcNameCaching;
$output = "<?php\n"; $output = "<?php\n";
$output .= $compiler->cStyleComment(" {$_funcNameCaching} ") . "\n"; $output .= $compiler->cStyleComment(" {$_funcNameCaching} ") . "\n";
$output .= "if (!function_exists('{$_funcNameCaching}')) {\n"; $output .= "if (!function_exists('{$_funcNameCaching}')) {\n";
$output .= "function {$_funcNameCaching} (\\Smarty\\Template \$_smarty_tpl,\$params) {\n"; $output .= "function {$_funcNameCaching} (\\Smarty\\Template \$_smarty_tpl,\$params) {\n";
$output .= "ob_start();\n"; $output .= "ob_start();\n";
$output .= "\$_smarty_tpl->compiled->has_nocache_code = true;\n"; $output .= "\$_smarty_tpl->getCompiled()->setNocacheCode(true);\n";
$output .= $_paramsCode; $output .= $_paramsCode;
$output .= "foreach (\$params as \$key => \$value) {\n\$_smarty_tpl->assign(\$key, \$value);\n}\n"; $output .= "foreach (\$params as \$key => \$value) {\n\$_smarty_tpl->assign(\$key, \$value);\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->getCompiled()->nocache_hash}%%*/<?php ";
$output .= "\\\$_smarty_tpl->smarty->getRuntime('TplFunction')->saveTemplateVariables(\\\$_smarty_tpl, '{$_name}');\nforeach (\$params as \\\$key => \\\$value) {\n\\\$_smarty_tpl->assign(\\\$key, \\\$value);\n}\n?>"; $output .= "\\\$_smarty_tpl->smarty->getRuntime('TplFunction')->saveTemplateVariables(\\\$_smarty_tpl, '{$_name}');\nforeach (\$params as \\\$key => \\\$value) {\n\\\$_smarty_tpl->assign(\\\$key, \\\$value);\n}\n?>";
$output .= "/*/%%SmartyNocache:{$compiler->template->compiled->nocache_hash}%%*/\";?>"; $output .= "/*/%%SmartyNocache:{$compiler->template->getCompiled()->nocache_hash}%%*/\";?>";
$compiler->parser->current_buffer->append_subtree( $compiler->parser->current_buffer->append_subtree(
$compiler->parser, $compiler->parser,
new \Smarty\ParseTree\Tag( new \Smarty\ParseTree\Tag(
@@ -80,10 +80,10 @@ class FunctionClose extends Base {
) )
); );
$compiler->parser->current_buffer->append_subtree($compiler->parser, $_functionCode); $compiler->parser->current_buffer->append_subtree($compiler->parser, $_functionCode);
$output = "<?php echo \"/*%%SmartyNocache:{$compiler->template->compiled->nocache_hash}%%*/<?php "; $output = "<?php echo \"/*%%SmartyNocache:{$compiler->template->getCompiled()->nocache_hash}%%*/<?php ";
$output .= "\\\$_smarty_tpl->smarty->getRuntime('TplFunction')->restoreTemplateVariables(\\\$_smarty_tpl, '{$_name}');?>\n"; $output .= "\\\$_smarty_tpl->smarty->getRuntime('TplFunction')->restoreTemplateVariables(\\\$_smarty_tpl, '{$_name}');?>\n";
$output .= "/*/%%SmartyNocache:{$compiler->template->compiled->nocache_hash}%%*/\";\n?>"; $output .= "/*/%%SmartyNocache:{$compiler->template->getCompiled()->nocache_hash}%%*/\";\n?>";
$output .= "<?php echo str_replace('{$compiler->template->compiled->nocache_hash}', \$_smarty_tpl->compiled->nocache_hash ?? '', ob_get_clean());\n"; $output .= "<?php echo str_replace('{$compiler->template->getCompiled()->nocache_hash}', \$_smarty_tpl->getCompiled()->nocache_hash ?? '', ob_get_clean());\n";
$output .= "}\n}\n"; $output .= "}\n}\n";
$output .= $compiler->cStyleComment("/ {$_funcName}_nocache ") . "\n\n"; $output .= $compiler->cStyleComment("/ {$_funcName}_nocache ") . "\n\n";
$output .= "?>\n"; $output .= "?>\n";
@@ -97,7 +97,7 @@ class FunctionClose extends Base {
$_functionCode = new \Smarty\ParseTree\Tag( $_functionCode = new \Smarty\ParseTree\Tag(
$compiler->parser, $compiler->parser,
preg_replace_callback( preg_replace_callback(
"/((<\?php )?echo '\/\*%%SmartyNocache:{$compiler->template->compiled->nocache_hash}%%\*\/([\S\s]*?)\/\*\/%%SmartyNocache:{$compiler->template->compiled->nocache_hash}%%\*\/';(\?>\n)?)/", "/((<\?php )?echo '\/\*%%SmartyNocache:{$compiler->template->getCompiled()->nocache_hash}%%\*\/([\S\s]*?)\/\*\/%%SmartyNocache:{$compiler->template->getCompiled()->nocache_hash}%%\*\/';(\?>\n)?)/",
[$this, 'removeNocache'], [$this, 'removeNocache'],
$_functionCode->to_smarty_php($compiler->parser) $_functionCode->to_smarty_php($compiler->parser)
) )
@@ -133,7 +133,7 @@ class FunctionClose extends Base {
// restore old buffer // restore old buffer
$compiler->parser->current_buffer = $saved_data[1]; $compiler->parser->current_buffer = $saved_data[1];
// restore old status // restore old status
$compiler->template->compiled->has_nocache_code = $saved_data[2]; $compiler->template->getCompiled()->setNocacheCode($saved_data[2]);
$compiler->template->caching = $saved_data[3]; $compiler->template->caching = $saved_data[3];
return true; return true;
} }
@@ -148,7 +148,7 @@ class FunctionClose extends Base {
public function removeNocache($match) { public function removeNocache($match) {
$code = $code =
preg_replace( preg_replace(
"/((<\?php )?echo '\/\*%%SmartyNocache:{$this->compiler->template->compiled->nocache_hash}%%\*\/)|(\/\*\/%%SmartyNocache:{$this->compiler->template->compiled->nocache_hash}%%\*\/';(\?>\n)?)/", "/((<\?php )?echo '\/\*%%SmartyNocache:{$this->compiler->template->getCompiled()->nocache_hash}%%\*\/)|(\/\*\/%%SmartyNocache:{$this->compiler->template->getCompiled()->nocache_hash}%%\*\/';(\?>\n)?)/",
'', '',
$match[0] $match[0]
); );

View File

@@ -60,13 +60,13 @@ class FunctionTag extends Base {
$compiler->parent_compiler->tpl_function[$_name] = []; $compiler->parent_compiler->tpl_function[$_name] = [];
$save = [ $save = [
$_attr, $compiler->parser->current_buffer, $compiler->template->compiled->has_nocache_code, $_attr, $compiler->parser->current_buffer, $compiler->template->getCompiled()->getNocacheCode(),
$compiler->template->caching, $compiler->template->caching,
]; ];
$this->openTag($compiler, 'function', $save); $this->openTag($compiler, 'function', $save);
// Init temporary context // Init temporary context
$compiler->parser->current_buffer = new \Smarty\ParseTree\Template(); $compiler->parser->current_buffer = new \Smarty\ParseTree\Template();
$compiler->template->compiled->has_nocache_code = false; $compiler->template->getCompiled()->setNocacheCode(false);
return true; return true;
} }
} }

View File

@@ -24,11 +24,6 @@ use Smarty\Template\Compiled;
*/ */
class IncludeTag extends Base { class IncludeTag extends Base {
/**
* caching mode to create nocache code but no cache file
*/
private const CACHING_NOCACHE_CODE = 9999;
/** /**
* Attribute definition: Overwrites base class. * Attribute definition: Overwrites base class.
* *
@@ -90,7 +85,7 @@ class IncludeTag extends Base {
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->getCompiled();
if (isset($compiled->includes[$fullResourceName])) { if (isset($compiled->includes[$fullResourceName])) {
$compiled->includes[$fullResourceName]++; $compiled->includes[$fullResourceName]++;
$cache_tpl = true; $cache_tpl = true;
@@ -122,7 +117,7 @@ class IncludeTag extends Base {
$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 = \Smarty\Template::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) &&
@@ -187,26 +182,28 @@ class IncludeTag extends Base {
} }
$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 = $_attr['compile_id'] ?? $compiler->template->compile_id;
// we must observe different compile_id and caching // we must observe different compile_id and caching
$t_hash = sha1($c_id . ($_caching ? '--caching' : '--nocaching')); $t_hash = sha1($c_id . ($_caching ? '--caching' : '--nocaching'));
$compiler->smarty->allow_ambiguous_resources = true;
/* @var \Smarty\Template $tpl */ $compiler->smarty->setAllowAmbiguousResources(true);
$tpl = new \Smarty\Template( $tpl = $compiler->smarty->createTemplate(
trim($fullResourceName, '"\''), trim($fullResourceName, '"\''),
$compiler->smarty,
$compiler->template,
$compiler->template->cache_id, $compiler->template->cache_id,
$c_id, $c_id,
$compiler->template,
$_caching $_caching
); );
$uid = $tpl->source->type . $tpl->source->uid; $uid = $tpl->source->type . $tpl->source->uid;
if (!isset($compiler->parent_compiler->mergedSubTemplatesData[$uid][$t_hash])) { if (!isset($compiler->parent_compiler->mergedSubTemplatesData[$uid][$t_hash])) {
$has_compiled_template = $this->compileInlineTemplate($compiler, $tpl, $t_hash); $has_compiled_template = $this->compileInlineTemplate($compiler, $tpl, $t_hash);
} else { } else {
$has_compiled_template = true; $has_compiled_template = true;
} }
unset($tpl);
$compiler->smarty->setAllowAmbiguousResources(false);
} }
// delete {include} standard attributes // delete {include} standard attributes
unset($_attr['file'], $_attr['assign'], $_attr['cache_id'], $_attr['compile_id'], $_attr['cache_lifetime'], $_attr['nocache'], $_attr['caching'], $_attr['scope'], $_attr['inline']); unset($_attr['file'], $_attr['assign'], $_attr['cache_id'], $_attr['compile_id'], $_attr['cache_lifetime'], $_attr['nocache'], $_attr['caching'], $_attr['scope'], $_attr['inline']);
@@ -227,7 +224,7 @@ class IncludeTag extends Base {
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 === \Smarty\Template::CACHING_NOCACHE_CODE && $compiler->template->caching) {
$_vars_nc = "foreach ($_vars as \$ik => \$iv) {\n"; $_vars_nc = "foreach ($_vars as \$ik => \$iv) {\n";
$_vars_nc .= "\$_smarty_tpl->assign(\$ik, \$iv);\n"; $_vars_nc .= "\$_smarty_tpl->assign(\$ik, \$iv);\n";
$_vars_nc .= "}\n"; $_vars_nc .= "}\n";
@@ -287,16 +284,14 @@ class IncludeTag extends Base {
$uid = $tpl->source->type . $tpl->source->uid; $uid = $tpl->source->type . $tpl->source->uid;
if ($tpl->source->exists) { if ($tpl->source->exists) {
$compiler->parent_compiler->mergedSubTemplatesData[$uid][$t_hash]['uid'] = $tpl->source->uid; $compiler->parent_compiler->mergedSubTemplatesData[$uid][$t_hash]['uid'] = $tpl->source->uid;
$tpl->compiled = new Compiled(); $tpl->getCompiled(true)->nocache_hash = $compiler->parent_compiler->template->getCompiled()->nocache_hash;
$tpl->compiled->nocache_hash = $compiler->parent_compiler->template->compiled->nocache_hash;
$tpl->loadCompiler();
// save unique function name // save unique function name
$compiler->parent_compiler->mergedSubTemplatesData[$uid][$t_hash]['func'] = $compiler->parent_compiler->mergedSubTemplatesData[$uid][$t_hash]['func'] =
$tpl->compiled->unifunc = 'content_' . str_replace(['.', ','], '_', uniqid('', true)); $tpl->getCompiled()->unifunc = 'content_' . str_replace(['.', ','], '_', uniqid('', true));
// make sure whole chain gets compiled // make sure whole chain gets compiled
$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->getCompiled()->nocache_hash;
if ($tpl->source->type === 'file') { if ($tpl->source->type === 'file') {
$sourceInfo = $tpl->source->filepath; $sourceInfo = $tpl->source->filepath;
} else { } else {
@@ -307,26 +302,28 @@ class IncludeTag extends Base {
// get compiled code // get compiled code
$compiled_code = "<?php\n\n"; $compiled_code = "<?php\n\n";
$compiled_code .= $compiler->cStyleComment(" Start inline template \"{$sourceInfo}\" =============================") . "\n"; $compiled_code .= $compiler->cStyleComment(" Start inline template \"{$sourceInfo}\" =============================") . "\n";
$compiled_code .= "function {$tpl->compiled->unifunc} (\\Smarty\\Template \$_smarty_tpl) {\n"; $compiled_code .= "function {$tpl->getCompiled()->unifunc} (\\Smarty\\Template \$_smarty_tpl) {\n";
$compiled_code .= "?>\n" . $tpl->compiler->compileTemplateSource($tpl, null, $compiler->parent_compiler); $compiled_code .= "?>\n" . $tpl->getCompiler()->compileTemplateSource($tpl, null, $compiler->parent_compiler);
$compiled_code .= "<?php\n"; $compiled_code .= "<?php\n";
$compiled_code .= "}\n?>\n"; $compiled_code .= "}\n?>\n";
$compiled_code .= $tpl->smarty->runPostFilters($tpl->compiler->blockOrFunctionCode, $tpl); $compiled_code .= $tpl->smarty->runPostFilters($tpl->getCompiler()->blockOrFunctionCode, $tpl);
$compiled_code .= "<?php\n\n"; $compiled_code .= "<?php\n\n";
$compiled_code .= $compiler->cStyleComment(" End inline template \"{$sourceInfo}\" =============================") . "\n"; $compiled_code .= $compiler->cStyleComment(" End inline template \"{$sourceInfo}\" =============================") . "\n";
$compiled_code .= '?>'; $compiled_code .= '?>';
unset($tpl->compiler);
if ($tpl->compiled->has_nocache_code) { // unset($tpl->compiler); // @TODO removed this.
if ($tpl->getCompiled()->getNocacheCode()) {
// replace nocache_hash // replace nocache_hash
$compiled_code = $compiled_code =
str_replace( str_replace(
"{$tpl->compiled->nocache_hash}", "{$tpl->getCompiled()->nocache_hash}",
$compiler->template->compiled->nocache_hash, $compiler->template->getCompiled()->nocache_hash,
$compiled_code $compiled_code
); );
$compiler->template->compiled->has_nocache_code = true; $compiler->template->getCompiled()->setNocacheCode(true);
} }
$compiler->parent_compiler->mergedSubTemplatesCode[$tpl->compiled->unifunc] = $compiled_code; $compiler->parent_compiler->mergedSubTemplatesCode[$tpl->getCompiled()->unifunc] = $compiled_code;
return true; return true;
} else { } else {
return false; return false;

View File

@@ -55,7 +55,7 @@ class MakeNocache extends Base {
$_attr = $this->getAttributes($compiler, $args); $_attr = $this->getAttributes($compiler, $args);
if ($compiler->template->caching) { if ($compiler->template->caching) {
$output = "<?php \$_smarty_tpl->smarty->getRuntime('MakeNocache')->save(\$_smarty_tpl, {$_attr[ 'var' ]});\n?>\n"; $output = "<?php \$_smarty_tpl->smarty->getRuntime('MakeNocache')->save(\$_smarty_tpl, {$_attr[ 'var' ]});\n?>\n";
$compiler->template->compiled->has_nocache_code = true; $compiler->template->getCompiled()->setNocacheCode(true);
$compiler->suppressNocacheProcessing = true; $compiler->suppressNocacheProcessing = true;
return $output; return $output;
} else { } else {

View File

@@ -47,12 +47,12 @@ class CodeFrame
$properties[ 'version' ] = \Smarty\Smarty::SMARTY_VERSION; $properties[ 'version' ] = \Smarty\Smarty::SMARTY_VERSION;
$properties[ 'unifunc' ] = 'content_' . str_replace(array('.', ','), '_', uniqid('', true)); $properties[ 'unifunc' ] = 'content_' . str_replace(array('.', ','), '_', uniqid('', true));
if (!$cache) { if (!$cache) {
$properties[ 'has_nocache_code' ] = $this->_template->compiled->has_nocache_code; $properties[ 'has_nocache_code' ] = $this->_template->getCompiled()->getNocacheCode();
$properties[ 'file_dependency' ] = $this->_template->compiled->file_dependency; $properties[ 'file_dependency' ] = $this->_template->getCompiled()->file_dependency;
$properties[ 'includes' ] = $this->_template->compiled->includes; $properties[ 'includes' ] = $this->_template->getCompiled()->includes;
} else { } else {
$properties[ 'has_nocache_code' ] = $this->_template->cached->has_nocache_code; $properties[ 'has_nocache_code' ] = $this->_template->getCached()->getNocacheCode();
$properties[ 'file_dependency' ] = $this->_template->cached->file_dependency; $properties[ 'file_dependency' ] = $this->_template->getCached()->file_dependency;
$properties[ 'cache_lifetime' ] = $this->_template->cache_lifetime; $properties[ 'cache_lifetime' ] = $this->_template->cache_lifetime;
} }
$output = sprintf( $output = sprintf(

View File

@@ -82,7 +82,7 @@ class Configfile extends BaseCompiler {
*/ */
public function compileTemplate(Template $template) { public function compileTemplate(Template $template) {
$this->template = $template; $this->template = $template;
$this->template->compiled->file_dependency[$this->template->source->uid] = $this->template->getCompiled()->file_dependency[$this->template->source->uid] =
[ [
$this->template->source->filepath, $this->template->source->filepath,
$this->template->source->getTimeStamp(), $this->template->source->getTimeStamp(),

View File

@@ -394,22 +394,22 @@ class Template extends BaseCompiler {
} }
$this->parent_compiler = $parent_compiler ? $parent_compiler : $this; $this->parent_compiler = $parent_compiler ? $parent_compiler : $this;
$nocache = isset($nocache) ? $nocache : false; $nocache = isset($nocache) ? $nocache : false;
if (empty($template->compiled->nocache_hash)) { if (empty($template->getCompiled()->nocache_hash)) {
$template->compiled->nocache_hash = $this->nocache_hash; $template->getCompiled()->nocache_hash = $this->nocache_hash;
} else { } else {
$this->nocache_hash = $template->compiled->nocache_hash; $this->nocache_hash = $template->getCompiled()->nocache_hash;
} }
$this->caching = $template->caching; $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;
// reset has nocache code flag // reset has nocache code flag
$this->template->compiled->has_nocache_code = false; $this->template->getCompiled()->setNocacheCode(false);
$this->has_variable_string = false; $this->has_variable_string = false;
$this->prefix_code = []; $this->prefix_code = [];
// add file dependency // add file dependency
if ($this->smarty->merge_compiled_includes || $this->template->source->handler->checkTimestamps()) { if ($this->smarty->merge_compiled_includes || $this->template->source->handler->checkTimestamps()) {
$this->parent_compiler->template->compiled->file_dependency[$this->template->source->uid] = $this->parent_compiler->template->getCompiled()->file_dependency[$this->template->source->uid] =
[ [
$this->template->source->filepath, $this->template->source->filepath,
$this->template->source->getTimeStamp(), $this->template->source->getTimeStamp(),
@@ -723,7 +723,7 @@ class Template extends BaseCompiler {
if ((!($this->template->source->handler->recompiled) || $this->forceNocache) && $this->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->getCompiled()->setNocacheCode(true);
$_output = addcslashes($content, '\'\\'); $_output = addcslashes($content, '\'\\');
$_output = str_replace('^#^', '\'', $_output); $_output = str_replace('^#^', '\'', $_output);
$_output = $_output =
@@ -1238,7 +1238,7 @@ class Template extends BaseCompiler {
$this $this
); );
if ($isTemplateSource && $this->template->caching) { if ($isTemplateSource && $this->template->caching) {
$this->parser->insertPhpCode("<?php\n\$_smarty_tpl->compiled->nocache_hash = '{$this->nocache_hash}';\n?>\n"); $this->parser->insertPhpCode("<?php\n\$_smarty_tpl->getCompiled()->nocache_hash = '{$this->nocache_hash}';\n?>\n");
} }
if (function_exists('mb_internal_encoding') if (function_exists('mb_internal_encoding')
&& function_exists('ini_get') && function_exists('ini_get')

View File

@@ -2,13 +2,11 @@
namespace Smarty; namespace Smarty;
use Smarty\Template\Config;
/** /**
* Smarty Internal Plugin Data * Smarty Internal Plugin Data
* This file contains the basic properties and methods for holding config and template variables * This file contains the basic properties and methods for holding config and template variables
*/ */
abstract class Data class Data
{ {
/** /**
@@ -49,6 +47,31 @@ abstract class Data
*/ */
public $config_vars = array(); public $config_vars = array();
/**
* create Smarty data object
*
* @param Smarty|array $_parent parent template
* @param Smarty|Template $smarty global smarty instance
* @param string $name optional data block name
*
* @throws Exception
*/
public function __construct($_parent = null, $smarty = null, $name = null) {
$this->smarty = $smarty;
if (is_object($_parent)) {
// when object set up back pointer
$this->parent = $_parent;
} elseif (is_array($_parent)) {
// set up variable values
foreach ($_parent as $_key => $_val) {
$this->assign($_key, $_val);
}
} elseif ($_parent !== null) {
throw new Exception('Wrong type for template variables');
}
}
/** /**
* assigns a Smarty variable * assigns a Smarty variable
* *
@@ -66,6 +89,7 @@ abstract class Data
foreach ($tpl_var as $_key => $_val) { foreach ($tpl_var as $_key => $_val) {
$this->assign($_key, $_val, $nocache, $scope); $this->assign($_key, $_val, $nocache, $scope);
} }
return;
} }
switch ($scope) { switch ($scope) {
@@ -363,6 +387,14 @@ abstract class Data
return $returnValue; return $returnValue;
} }
public function hasConfigVariable($varName): bool {
try {
return $this->getConfigVariable($varName) !== null;
} catch (Exception $e) {
return false;
}
}
/** /**
* Returns a single or all config variables * Returns a single or all config variables
* *
@@ -399,12 +431,11 @@ abstract class Data
public function configLoad($config_file, $sections = null) public function configLoad($config_file, $sections = null)
{ {
$smarty = $this->_getSmartyObj(); $smarty = $this->_getSmartyObj();
$template = new Template($config_file, $smarty, $this, null, null, null, null, true); $template = new Template($config_file, $smarty, $this, null, null, null, true);
$template->caching = Smarty::CACHING_OFF; $template->caching = Smarty::CACHING_OFF;
$template->assign('sections', (array) $sections ?? []); $template->assign('sections', (array) $sections ?? []);
// trigger a call to $this->assignConfigVars // trigger a call to $this->assignConfigVars
$template->compiled = \Smarty\Template\Compiled::load($template); $template->getCompiled(true)->render($template);
$template->compiled->render($template);
return $this; return $this;
} }

View File

@@ -1,53 +0,0 @@
<?php
/**
* Smarty Plugin Data
* This file contains the data object
*
* @author Uwe Tews
*/
namespace Smarty;
/**
* class for the Smarty data object
* The Smarty data object will hold Smarty variables in the current scope
*
*/
class DataObject extends Data {
/**
* Smarty object
*
* @var Smarty
*/
public $smarty = null;
/**
* create Smarty data object
*
* @param Smarty|array $_parent parent template
* @param Smarty|Template $smarty global smarty instance
* @param string $name optional data block name
*
* @throws Exception
*/
public function __construct($_parent = null, $smarty = null, $name = null) {
$this->smarty = $smarty;
if (is_object($_parent)) {
// when object set up back pointer
$this->parent = $_parent;
} elseif (is_array($_parent)) {
// set up variable values
foreach ($_parent as $_key => $_val) {
$this->assign($_key, $_val);
}
} elseif ($_parent !== null) {
throw new Exception('Wrong type for template variables');
}
}
}

View File

@@ -84,8 +84,8 @@ class Debug extends Data
public function start_compile(\Smarty\Template $template) public function start_compile(\Smarty\Template $template)
{ {
static $_is_stringy = array('string' => true, 'eval' => true); static $_is_stringy = array('string' => true, 'eval' => true);
if (!empty($template->compiler->trace_uid)) { if (!empty($template->getCompiler()->trace_uid)) {
$key = $template->compiler->trace_uid; $key = $template->getCompiler()->trace_uid;
if (!isset($this->template_data[ $this->index ][ $key ])) { if (!isset($this->template_data[ $this->index ][ $key ])) {
$this->saveTemplateData($_is_stringy, $template, $key); $this->saveTemplateData($_is_stringy, $template, $key);
} }
@@ -105,8 +105,8 @@ class Debug extends Data
*/ */
public function end_compile(\Smarty\Template $template) public function end_compile(\Smarty\Template $template)
{ {
if (!empty($template->compiler->trace_uid)) { if (!empty($template->getCompiler()->trace_uid)) {
$key = $template->compiler->trace_uid; $key = $template->getCompiler()->trace_uid;
} else { } else {
if (isset($this->ignore_uid[ $template->source->uid ])) { if (isset($this->ignore_uid[ $template->source->uid ])) {
return; return;
@@ -223,7 +223,7 @@ class Debug extends Data
$_config_vars = $ptr->config_vars; $_config_vars = $ptr->config_vars;
ksort($_config_vars); ksort($_config_vars);
$debugging = $smarty->debugging; $debugging = $smarty->debugging;
$_template = new \Smarty\Template($debObj->debug_tpl, $debObj); $_template = $debObj->createTemplate($debObj->debug_tpl);
if ($obj instanceof \Smarty\Template) { if ($obj instanceof \Smarty\Template) {
$_template->assign('template_name', $obj->source->type . ':' . $obj->source->name); $_template->assign('template_name', $obj->source->type . ':' . $obj->source->name);
} elseif ($obj instanceof Smarty || $full) { } elseif ($obj instanceof Smarty || $full) {
@@ -248,7 +248,7 @@ class Debug extends Data
/** /**
* Recursively gets variables from all template/data scopes * Recursively gets variables from all template/data scopes
* *
* @param \Smarty\Template|\Smarty\DataObject $obj object to debug * @param \Smarty\Data $obj object to debug
* *
* @return \StdClass * @return \StdClass
*/ */

View File

@@ -4,24 +4,11 @@ namespace Smarty\Resource;
use Smarty\Smarty; use Smarty\Smarty;
/**
* Smarty Resource Plugin
*
* @author Rodney Rehm
*/
/** /**
* Smarty Resource Plugin * Smarty Resource Plugin
* Base implementation for resource plugins * Base implementation for resource plugins
*
*
* @method renderUncompiled(\Smarty\Template\Source $source, \Smarty\Template $_template)
* @method populateCompiledFilepath(\Smarty\Template\Compiled $compiled, \Smarty\Template $_template)
* @method process(\Smarty\Template $_smarty_tpl) * @method process(\Smarty\Template $_smarty_tpl)
* @author Rodney Rehm
*/ */
abstract class BasePlugin abstract class BasePlugin
{ {
@@ -46,11 +33,13 @@ abstract class BasePlugin
public $recompiled = false; public $recompiled = false;
/** /**
* Flag if resource does implement populateCompiledFilepath() method * Flag if resource does allow compilation
* *
* @var bool * @return bool
*/ */
public $hasCompiledHandler = false; public function supportsCompiledTemplates(): bool {
return true;
}
/** /**
* Load Resource Handler * Load Resource Handler
@@ -119,30 +108,6 @@ abstract class BasePlugin
return array($name, $type); return array($name, $type);
} }
/**
* modify template_resource according to resource handlers specifications
*
* @param \Smarty\Template|null $template Smarty instance
* @param string $template_resource template_resource to extract resource handler and
* name of
*
* @return string unique resource name
* @throws \Smarty\Exception
*/
public static function getUniqueTemplateName($smarty, $template, $template_resource)
{
[$name, $type] = self::parseResourceName($template_resource, $smarty->default_resource_type);
// TODO: optimize for Smarty's internal resource types
$resource = BasePlugin::load($smarty, $type);
// go relative to a given template?
$_file_is_dotted = $name[ 0 ] === '.' && ($name[ 1 ] === '.' || $name[ 1 ] === '/');
if ($template && $_file_is_dotted && ($template->source->type === 'file' || $template->parent->source->type === 'extends')
) {
$name = $smarty->_realpath(dirname($template->parent->source->filepath) . DIRECTORY_SEPARATOR . $name);
}
return $resource->buildUniqueResourceName($smarty, $name);
}
/** /**
* initialize Source Object for given resource * initialize Source Object for given resource
* wrapper for backward compatibility to versions < 3.1.22 * wrapper for backward compatibility to versions < 3.1.22
@@ -191,30 +156,6 @@ abstract class BasePlugin
// intentionally left blank // intentionally left blank
} }
/**
* modify resource_name according to resource handlers specifications
*
* @param Smarty $smarty Smarty instance
* @param string $resource_name resource_name to make unique
* @param boolean $isConfig flag for config resource
*
* @return string unique resource name
*/
public function buildUniqueResourceName(Smarty $smarty, $resource_name, $isConfig = false)
{
if ($isConfig) {
if (!isset($smarty->_joined_config_dir)) {
$smarty->getTemplateDir(null, true);
}
return get_class($this) . '#' . $smarty->_joined_config_dir . '#' . $resource_name;
} else {
if (!isset($smarty->_joined_template_dir)) {
$smarty->getTemplateDir();
}
return get_class($this) . '#' . $smarty->_joined_template_dir . '#' . $resource_name;
}
}
/* /*
* Check if resource must check time stamps when when loading complied or cached templates. * 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. * Resources like 'extends' which use source components my disable timestamp checks on own resource.

View File

@@ -30,11 +30,13 @@ abstract class RecompiledPlugin extends BasePlugin {
public $recompiled = true; public $recompiled = true;
/** /**
* Resource does implement populateCompiledFilepath() method * Flag if resource does allow compilation
* *
* @var bool * @return bool
*/ */
public $hasCompiledHandler = true; public function supportsCompiledTemplates(): bool {
return false;
}
/** /**
* compile template from source * compile template from source
@@ -44,45 +46,27 @@ abstract class RecompiledPlugin extends BasePlugin {
* @throws Exception * @throws Exception
*/ */
public function process(Template $_smarty_tpl) { public function process(Template $_smarty_tpl) {
$compiled = &$_smarty_tpl->compiled; $compiled = $_smarty_tpl->getCompiled();
$compiled->file_dependency = []; $compiled->file_dependency = [];
$compiled->includes = []; $compiled->includes = [];
$compiled->nocache_hash = null; $compiled->nocache_hash = null;
$compiled->unifunc = null; $compiled->unifunc = null;
$level = ob_get_level(); $level = ob_get_level();
ob_start(); ob_start();
$_smarty_tpl->loadCompiler();
// call compiler // call compiler
try { try {
eval('?>' . $_smarty_tpl->compiler->compileTemplate($_smarty_tpl)); eval('?>' . $_smarty_tpl->getCompiler()->compileTemplate($_smarty_tpl));
} catch (\Exception $e) { } catch (\Exception $e) {
unset($_smarty_tpl->compiler);
while (ob_get_level() > $level) { while (ob_get_level() > $level) {
ob_end_clean(); ob_end_clean();
} }
throw $e; throw $e;
} }
// release compiler object to free memory
unset($_smarty_tpl->compiler);
ob_get_clean(); ob_get_clean();
$compiled->timestamp = time(); $compiled->timestamp = time();
$compiled->exists = true; $compiled->exists = true;
} }
/**
* populate Compiled Object with compiled filepath
*
* @param Compiled $compiled compiled object
* @param Template $_template template object
*
* @return void
*/
public function populateCompiledFilepath(Compiled $compiled, Template $_template) {
$compiled->filepath = false;
$compiled->timestamp = false;
$compiled->exists = false;
}
/* /*
* Disable timestamp checks for recompiled resource. * Disable timestamp checks for recompiled resource.
* *

View File

@@ -66,16 +66,4 @@ class StreamPlugin extends RecompiledPlugin {
} }
} }
/**
* modify resource_name according to resource handlers specifications
*
* @param Smarty $smarty Smarty instance
* @param string $resource_name resource_name to make unique
* @param boolean $isConfig flag for config resource
*
* @return string unique resource name
*/
public function buildUniqueResourceName(Smarty $smarty, $resource_name, $isConfig = false) {
return get_class($this) . '#' . $resource_name;
}
} }

View File

@@ -71,20 +71,6 @@ class StringEval extends RecompiledPlugin
return $string; return $string;
} }
/**
* modify resource_name according to resource handlers specifications
*
* @param Smarty $smarty Smarty instance
* @param string $resource_name resource_name to make unique
* @param boolean $isConfig flag for config resource
*
* @return string unique resource name
*/
public function buildUniqueResourceName(Smarty $smarty, $resource_name, $isConfig = false)
{
return get_class($this) . '#' . $this->decode($resource_name);
}
/** /**
* Determine basename for compiled filename * Determine basename for compiled filename
* *

View File

@@ -68,19 +68,6 @@ class StringPlugin extends BasePlugin {
return $string; return $string;
} }
/**
* modify resource_name according to resource handlers specifications
*
* @param Smarty $smarty Smarty instance
* @param string $resource_name resource_name to make unique
* @param boolean $isConfig flag for config resource
*
* @return string unique resource name
*/
public function buildUniqueResourceName(Smarty $smarty, $resource_name, $isConfig = false) {
return get_class($this) . '#' . $this->decode($resource_name);
}
/** /**
* Determine basename for compiled filename * Determine basename for compiled filename
* Always returns an empty string. * Always returns an empty string.

View File

@@ -116,7 +116,7 @@ class InheritanceRuntime {
$template, $template,
$tpl->cache_id, $tpl->cache_id,
$tpl->compile_id, $tpl->compile_id,
$tpl->caching ? 9999 : 0, $tpl->caching ? \Smarty\Template::CACHING_NOCACHE_CODE : 0,
$tpl->cache_lifetime, $tpl->cache_lifetime,
[], [],
$uid, $uid,

View File

@@ -28,9 +28,9 @@ class MakeNocacheRuntime {
if (preg_match('/(\w+)::__set_state/', $export, $match)) { if (preg_match('/(\w+)::__set_state/', $export, $match)) {
throw new \Smarty\Exception("{make_nocache \${$var}} in template '{$tpl->source->name}': variable does contain object '{$match[1]}' not implementing method '__set_state'"); throw new \Smarty\Exception("{make_nocache \${$var}} in template '{$tpl->source->name}': variable does contain object '{$match[1]}' not implementing method '__set_state'");
} }
echo "/*%%SmartyNocache:{$tpl->compiled->nocache_hash}%%*/<?php " . echo "/*%%SmartyNocache:{$tpl->getCompiled()->nocache_hash}%%*/<?php " .
addcslashes("\$_smarty_tpl->smarty->getRuntime('MakeNocache')->store(\$_smarty_tpl, '{$var}', ", '\\') . addcslashes("\$_smarty_tpl->smarty->getRuntime('MakeNocache')->store(\$_smarty_tpl, '{$var}', ", '\\') .
$export . ");?>\n/*/%%SmartyNocache:{$tpl->compiled->nocache_hash}%%*/"; $export . ");?>\n/*/%%SmartyNocache:{$tpl->getCompiled()->nocache_hash}%%*/";
} }
} }

View File

@@ -1,6 +1,7 @@
<?php <?php
namespace Smarty\Runtime; namespace Smarty\Runtime;
use Smarty\Exception;
use Smarty\Template; use Smarty\Template;
use Smarty\TemplateBase; use Smarty\TemplateBase;
@@ -98,8 +99,9 @@ class TplFunctionRuntime {
* @param string $_function PHP function name * @param string $_function PHP function name
* *
* @return bool * @return bool
* @throws Exception
*/ */
public function addTplFuncToCache(Template $tpl, $_name, $_function) { private function addTplFuncToCache(Template $tpl, $_name, $_function) {
$funcParam = $tpl->tplFunctions[$_name]; $funcParam = $tpl->tplFunctions[$_name];
if (is_file($funcParam['compiled_filepath'])) { if (is_file($funcParam['compiled_filepath'])) {
// read compiled file // read compiled file
@@ -112,21 +114,20 @@ class TplFunctionRuntime {
// make PHP function known // make PHP function known
eval($match[0]); eval($match[0]);
if (function_exists($_function)) { if (function_exists($_function)) {
// search cache file template
$tplPtr = $tpl; // Some magic code existed here, testing if the cached property had been set
while (!isset($tplPtr->cached) && isset($tplPtr->parent)) { // and then bubbling up until it found a parent template that had the cached property.
$tplPtr = $tplPtr->parent; // This is no longer possible, so somehow this might break.
}
// add template function code to cache file // add template function code to cache file
if (isset($tplPtr->cached)) { $content = $tpl->getCached()->readCache($tpl);
$content = $tplPtr->cached->readCache($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->cached->writeCache( $tpl->getCached()->writeCache(
$tplPtr, $tpl,
preg_replace('/\s*\?>\s*$/', "\n", $content) . preg_replace('/\s*\?>\s*$/', "\n", $content) .
"\n" . preg_replace( "\n" . preg_replace(
[ [
@@ -138,7 +139,6 @@ class TplFunctionRuntime {
) )
); );
} }
}
return true; return true;
} }
} }

View File

@@ -11,6 +11,7 @@ use Smarty\Extension\CoreExtension;
use Smarty\Extension\DefaultExtension; use Smarty\Extension\DefaultExtension;
use Smarty\Extension\ExtensionInterface; use Smarty\Extension\ExtensionInterface;
use Smarty\Filter\Output\TrimWhitespace; use Smarty\Filter\Output\TrimWhitespace;
use Smarty\Resource\BasePlugin;
use Smarty\Smarty\Runtime\CaptureRuntime; use Smarty\Smarty\Runtime\CaptureRuntime;
use Smarty\Smarty\Runtime\ForeachRuntime; use Smarty\Smarty\Runtime\ForeachRuntime;
use Smarty\Smarty\Runtime\InheritanceRuntime; use Smarty\Smarty\Runtime\InheritanceRuntime;
@@ -202,7 +203,7 @@ class Smarty extends \Smarty\TemplateBase
* *
* @var boolean * @var boolean
*/ */
public $allow_ambiguous_resources = false; private $allow_ambiguous_resources = false;
/** /**
* merge compiled includes * merge compiled includes
@@ -255,13 +256,6 @@ class Smarty extends \Smarty\TemplateBase
*/ */
public $security_policy = null; public $security_policy = null;
/**
* controls if the php template file resource is allowed
*
* @var bool
*/
public $allow_php_templates = false;
/** /**
* debug mode * debug mode
* Setting this to true enables the debug-console. * Setting this to true enables the debug-console.
@@ -538,6 +532,12 @@ class Smarty extends \Smarty\TemplateBase
*/ */
private $BCPluginsAdapter; private $BCPluginsAdapter;
/**
* Cache of templates created
* @var array
*/
private $templates;
/** /**
* Initialize new Smarty object * Initialize new Smarty object
*/ */
@@ -968,36 +968,55 @@ class Smarty extends \Smarty\TemplateBase
/** /**
* creates a template object * creates a template object
* *
* @param string $template the resource handle of the template file * @param Template|null $template_name
*
* @param mixed $cache_id cache id to be used with this template * @param mixed $cache_id cache id to be used with this template
* @param mixed $compile_id compile id to be used with this template * @param mixed $compile_id compile id to be used with this template
* @param object $parent next higher level of Smarty variables * @param null $parent next higher level of Smarty variables
* $cache_lifetime
* @param null $caching
* @param null $cache_lifetime
* @param string|null $baseFilePath
* *
* @return \Smarty\Template template object * @return Template template object
* @throws \Smarty\Exception * @throws Exception
*/ */
public function createTemplate($template, $cache_id = null, $compile_id = null, $parent = null) public function createTemplate($template_name, $cache_id = null, $compile_id = null, $parent = null, $caching = null,
$cache_lifetime = null, string $baseFilePath = null)
{ {
if ((is_object($cache_id) || is_array($cache_id))) {
$data = null;
// Shuffle params for backward compatibility: if 2nd param is an object, it's the parent
if (is_object($cache_id)) {
$parent = $cache_id; $parent = $cache_id;
$cache_id = null; $cache_id = null;
} }
if (is_array($parent)) {
$data = $parent; // Shuffle params for backward compatibility: if 2nd param is an array, it's data
$parent = null; if (is_array($cache_id)) {
} else { $data = $cache_id;
$data = null; $cache_id = null;
} }
if (!$this->_templateDirNormalized) { if (!$this->_templateDirNormalized) {
$this->_normalizeTemplateConfig(false); $this->_normalizeTemplateConfig(false);
} }
$_templateId = $this->_getTemplateId($template, $cache_id, $compile_id); $_templateId = $this->generateUniqueTemplateId($template_name, $cache_id, $compile_id, $caching, $baseFilePath);
$tpl = new \Smarty\Template($template, $this, null, $cache_id, $compile_id, null, null); // if (true || !isset($this->templates[$_templateId])) {
// $this->templates[$_templateId] = new Template($template_name, $this, null, $cache_id, $compile_id, $caching);
// $this->templates[$_templateId]->templateId = $_templateId;
// }
// $tpl = $this->templates[$_templateId];
$tpl = new Template($template_name, $this, $parent ?: $this, $cache_id, $compile_id, $caching);
$tpl->templateId = $_templateId; $tpl->templateId = $_templateId;
$tpl->parent = $parent ?: $this; if ($cache_lifetime) {
$tpl->setCacheLifetime($cache_lifetime);
}
// fill data if present // fill data if present
if (!empty($data) && is_array($data)) { if (!empty($data) && is_array($data)) {
// set up variable values // set up variable values
@@ -1021,31 +1040,50 @@ class Smarty extends \Smarty\TemplateBase
* @param null|mixed $cache_id * @param null|mixed $cache_id
* @param null|mixed $compile_id * @param null|mixed $compile_id
* @param null $caching * @param null $caching
* @param \Smarty\Template $template * @param string|null $baseFilePath
* *
* @return string * @return string
* @throws \Smarty\Exception
*/ */
public function _getTemplateId( public function generateUniqueTemplateId(
$template_name, $template_name,
$cache_id = null, $cache_id = null,
$compile_id = null, $compile_id = null,
$caching = null, $caching = null,
\Smarty\Template $template = null string $baseFilePath = null
) { ): string {
$template_name = (strpos($template_name, ':') === false) ? "{$this->default_resource_type}:{$template_name}" : // defaults for optional params
$template_name; $cache_id = $cache_id ?? $this->cache_id;
$cache_id = $cache_id === null ? $this->cache_id : $cache_id; $compile_id = $compile_id ?? $this->compile_id;
$compile_id = $compile_id === null ? $this->compile_id : $compile_id; $caching = (int) $caching ?? $this->caching;
$caching = (int)($caching === null ? $this->caching : $caching);
if ((isset($template) && strpos($template_name, ':.') !== false) || $this->allow_ambiguous_resources) { if (strpos($template_name, ':') === false) {
$_templateId = $template_name = "{$this->default_resource_type}:{$template_name}";
\Smarty\Resource\BasePlugin::getUniqueTemplateName($this, $template ?? null, $template_name) .
"#{$cache_id}#{$compile_id}#{$caching}";
} else {
$_templateId = $this->_joined_template_dir . "#{$template_name}#{$cache_id}#{$compile_id}#{$caching}";
} }
if (isset($_templateId[ 150 ])) {
$id_parts = [];
[$name, $type] = BasePlugin::parseResourceName($template_name, $this->default_resource_type);
$nameIsDotted = !empty($name) && $name[0] === '.' && ($name[1] === '.' || $name[1] === '/');
$id_parts[] = $type;
$id_parts[] = $this->_getSmartyObj()->_joined_template_dir;
// handle relative template names
if ($baseFilePath && $nameIsDotted) {
// go relative to a given template?
$id_parts[] = $this->_realpath($baseFilePath);
}
$id_parts[] = $name;
$id_parts[] = (string) $cache_id;
$id_parts[] = (string) $compile_id;
$id_parts[] = (string) $caching;
$_templateId = implode('#', $id_parts);
// hash very long IDs to prevent problems with filename length
// do not hash shorter IDs so they remain recognizable
if (strlen($_templateId) > 150) {
$_templateId = sha1($_templateId); $_templateId = sha1($_templateId);
} }
return $_templateId; return $_templateId;
@@ -1387,7 +1425,7 @@ class Smarty extends \Smarty\TemplateBase
$tpl = $this->createTemplate($resource_name); $tpl = $this->createTemplate($resource_name);
$this->caching = $_save_stat; $this->caching = $_save_stat;
if (!$tpl->source->handler->recompiled && $tpl->source->exists) { if (!$tpl->source->handler->recompiled && $tpl->source->exists) {
$_resource_part_1 = basename(str_replace('^', DIRECTORY_SEPARATOR, $tpl->compiled->filepath)); $_resource_part_1 = basename(str_replace('^', DIRECTORY_SEPARATOR, $tpl->getCompiled()->filepath));
$_resource_part_1_length = strlen($_resource_part_1); $_resource_part_1_length = strlen($_resource_part_1);
} else { } else {
return 0; return 0;
@@ -1593,15 +1631,15 @@ class Smarty extends \Smarty\TemplateBase
* check client side cache * check client side cache
* *
* @param \Smarty\Template\Cached $cached * @param \Smarty\Template\Cached $cached
* @param \Smarty\Template $_template * @param Template $_template
* @param string $content * @param string $content
* *
* @throws \Exception * @throws \Exception
* @throws \Smarty\Exception * @throws \Smarty\Exception
*/ */
public function cacheModifiedCheck(Template\Cached $cached, \Smarty\Template $_template, $content) public function cacheModifiedCheck(Template\Cached $cached, Template $_template, $content)
{ {
$_isCached = $_template->isCached() && !$_template->compiled->has_nocache_code; $_isCached = $_template->isCached() && !$_template->getCompiled()->getNocacheCode();
$_last_modified_date = $_last_modified_date =
@substr($_SERVER[ 'HTTP_IF_MODIFIED_SINCE' ], 0, strpos($_SERVER[ 'HTTP_IF_MODIFIED_SINCE' ], 'GMT') + 3); @substr($_SERVER[ 'HTTP_IF_MODIFIED_SINCE' ], 0, strpos($_SERVER[ 'HTTP_IF_MODIFIED_SINCE' ], 'GMT') + 3);
if ($_isCached && $cached->timestamp <= strtotime($_last_modified_date)) { if ($_isCached && $cached->timestamp <= strtotime($_last_modified_date)) {
@@ -2141,7 +2179,7 @@ class Smarty extends \Smarty\TemplateBase
* @param array|string $modifiers modifier or list of modifiers * @param array|string $modifiers modifier or list of modifiers
* to add * to add
* *
* @return \Smarty|\Smarty\Template * @return \Smarty|Template
* @api Smarty::addDefaultModifiers() * @api Smarty::addDefaultModifiers()
* *
*/ */
@@ -2231,7 +2269,7 @@ class Smarty extends \Smarty\TemplateBase
/** /**
* test if cache is valid * test if cache is valid
* *
* @param null|string|\Smarty\Template $template the resource handle of the template file or template * @param null|string|Template $template the resource handle of the template file or template
* object * object
* @param mixed $cache_id cache id to be used with this template * @param mixed $cache_id cache id to be used with this template
* @param mixed $compile_id compile id to be used with this template * @param mixed $compile_id compile id to be used with this template

View File

@@ -18,14 +18,30 @@ use Smarty\Template\Config;
/** /**
* Main class with template data structures and methods * Main class with template data structures and methods
*
* @property Compiled $compiled
* @property Cached $cached
* @property \Smarty\Compiler\Template $compiler
*/ */
#[\AllowDynamicProperties] #[\AllowDynamicProperties]
class Template extends TemplateBase { class Template extends TemplateBase {
/**
* caching mode to create nocache code but no cache file
*/
public const CACHING_NOCACHE_CODE = 9999;
/**
* @var Compiled
*/
private $compiled = null;
/**
* @var Cached
*/
private $cached = null;
/**
* @var \Smarty\Compiler\Template
*/
private $compiler = null;
/** /**
* Source instance * Source instance
* *
@@ -48,7 +64,7 @@ class Template extends TemplateBase {
public $mustCompile = null; public $mustCompile = null;
/** /**
* Template Id * Template ID
* *
* @var null|string * @var null|string
*/ */
@@ -100,7 +116,6 @@ class Template extends TemplateBase {
* @param mixed $_cache_id cache id or null * @param mixed $_cache_id cache id or null
* @param mixed $_compile_id compile id or null * @param mixed $_compile_id compile id or null
* @param bool|int|null $_caching use caching? * @param bool|int|null $_caching use caching?
* @param int|null $_cache_lifetime cache life-time in seconds
* @param bool $_isConfig * @param bool $_isConfig
* *
* @throws \Smarty\Exception * @throws \Smarty\Exception
@@ -112,7 +127,6 @@ class Template extends TemplateBase {
$_cache_id = null, $_cache_id = null,
$_compile_id = null, $_compile_id = null,
$_caching = null, $_caching = null,
$_cache_lifetime = null,
$_isConfig = false $_isConfig = false
) { ) {
$this->smarty = $smarty; $this->smarty = $smarty;
@@ -120,14 +134,14 @@ class Template extends TemplateBase {
$this->cache_id = $_cache_id === null ? $this->smarty->cache_id : $_cache_id; $this->cache_id = $_cache_id === null ? $this->smarty->cache_id : $_cache_id;
$this->compile_id = $_compile_id === null ? $this->smarty->compile_id : $_compile_id; $this->compile_id = $_compile_id === null ? $this->smarty->compile_id : $_compile_id;
$this->caching = (int)($_caching === null ? $this->smarty->caching : $_caching); $this->caching = (int)($_caching === null ? $this->smarty->caching : $_caching);
$this->cache_lifetime = $_cache_lifetime === null ? $this->smarty->cache_lifetime : $_cache_lifetime; $this->cache_lifetime = $this->smarty->cache_lifetime;
$this->compile_check = (int)$smarty->compile_check; $this->compile_check = (int)$smarty->compile_check;
$this->parent = $_parent; $this->parent = $_parent;
// Template resource // Template resource
$this->template_resource = $template_resource; $this->template_resource = $template_resource;
$this->source = $_isConfig ? Config::load($this) : Source::load($this); $this->source = $_isConfig ? Config::load($this) : Source::load($this);
if ($smarty->security_policy && method_exists($smarty->security_policy, 'registerCallBacks')) { if ($smarty->security_policy) {
$smarty->security_policy->registerCallBacks($this); $smarty->security_policy->registerCallBacks($this);
} }
} }
@@ -159,28 +173,27 @@ class Template extends TemplateBase {
} }
// read from cache or render // read from cache or render
if ($this->caching === \Smarty\Smarty::CACHING_LIFETIME_CURRENT || $this->caching === \Smarty\Smarty::CACHING_LIFETIME_SAVED) { if ($this->caching === \Smarty\Smarty::CACHING_LIFETIME_CURRENT || $this->caching === \Smarty\Smarty::CACHING_LIFETIME_SAVED) {
if (!isset($this->cached) || $this->cached->cache_id !== $this->cache_id if ($this->getCached()->cache_id !== $this->cache_id || $this->getCached()->compile_id !== $this->compile_id) {
|| $this->cached->compile_id !== $this->compile_id $this->getCached(true);
) {
$this->loadCached(true);
} }
$this->cached->render($this, $no_output_filter); $this->getCached()->render($this, $no_output_filter);
} else { } else {
if (!isset($this->compiled) || $this->compiled->compile_id !== $this->compile_id) { $compiled = $this->getCompiled();
$this->loadCompiled(true); if ($compiled->compile_id !== $this->compile_id) {
$compiled = $this->getCompiled(true);
} }
$this->compiled->render($this); $compiled->render($this);
} }
// display or fetch // display or fetch
if ($display) { if ($display) {
if ($this->caching && $this->smarty->cache_modified_check) { if ($this->caching && $this->smarty->cache_modified_check) {
$this->smarty->cacheModifiedCheck( $this->smarty->cacheModifiedCheck(
$this->cached, $this->getCached(),
$this, $this,
isset($content) ? $content : ob_get_clean() isset($content) ? $content : ob_get_clean()
); );
} else { } else {
if ((!$this->caching || $this->cached->has_nocache_code || $this->source->handler->recompiled) if ((!$this->caching || $this->getCached()->getNocacheCode() || $this->source->handler->recompiled)
&& !$no_output_filter && isset($this->smarty->registered_filters['output']) && !$no_output_filter && isset($this->smarty->registered_filters['output'])
) { ) {
echo $this->smarty->runOutputFilters(ob_get_clean(), $this); echo $this->smarty->runOutputFilters(ob_get_clean(), $this);
@@ -203,7 +216,7 @@ class Template extends TemplateBase {
} }
if ( if (
!$no_output_filter !$no_output_filter
&& (!$this->caching || $this->cached->has_nocache_code || $this->source->handler->recompiled) && (!$this->caching || $this->getCached()->getNocacheCode() || $this->source->handler->recompiled)
) { ) {
return $this->smarty->runOutputFilters(ob_get_clean(), $this); return $this->smarty->runOutputFilters(ob_get_clean(), $this);
@@ -216,12 +229,12 @@ class Template extends TemplateBase {
/** /**
* Runtime function to render sub-template * Runtime function to render sub-template
* *
* @param string $template template name * @param string $template_name template name
* @param mixed $cache_id cache id * @param mixed $cache_id cache id
* @param mixed $compile_id compile id * @param mixed $compile_id compile id
* @param integer $caching cache mode * @param integer $caching cache mode
* @param integer $cache_lifetime life time of cache data * @param integer $cache_lifetime life time of cache data
* @param array $data passed parameter template variables * @param array $extra_vars passed parameter template variables
* @param string $uid file dependency uid * @param string $uid file dependency uid
* @param string $content_func function name * @param string $content_func function name
* *
@@ -229,63 +242,57 @@ class Template extends TemplateBase {
* @throws \Smarty\Exception * @throws \Smarty\Exception
*/ */
public function _subTemplateRender( public function _subTemplateRender(
$template, $template_name,
$cache_id, $cache_id,
$compile_id, $compile_id,
$caching, $caching,
$cache_lifetime, $cache_lifetime,
$data, array $extra_vars,
$uid = null, $uid = null,
$content_func = null $content_func = null
) { ) {
$tpl = clone $this;
$tpl->parent = $this;
$smarty = &$this->smarty;
$_templateId = $smarty->_getTemplateId($template, $cache_id, $compile_id, $caching, $tpl);
// recursive call ?
if ((isset($tpl->templateId) ? $tpl->templateId : $tpl->_getTemplateId()) !== $_templateId) {
$tpl->templateId = $_templateId; $baseFilePath = $this->source && $this->source->filepath ? dirname($this->source->filepath) : null;
$tpl->template_resource = $template;
$tpl->cache_id = $cache_id; $tpl = $this->_getSmartyObj()->createTemplate($template_name, $cache_id, $compile_id, $this, $caching, $cache_lifetime, $baseFilePath);
$tpl->compile_id = $compile_id;
if (isset($uid)) { // copy variables
$tpl->tpl_vars = $this->tpl_vars;
$tpl->config_vars = $this->config_vars;
// recursive call ?
if ($tpl->getTemplateId() == $this->getTemplateId()) {
if (isset($uid) && $this->getCompiled()->file_dependency) {
// for inline templates we can get all resource information from file dependency // for inline templates we can get all resource information from file dependency
[$filepath, $timestamp, $type] = $tpl->compiled->file_dependency[$uid]; [$filepath, $timestamp, $type] = $this->getCompiled()->file_dependency[$uid];
$tpl->source = new Source($smarty, $filepath, $type, $filepath); $tpl->source = new Source($this->_getSmartyObj(), $filepath, $type, $filepath);
$tpl->source->filepath = $filepath; $tpl->source->filepath = $filepath;
$tpl->source->timestamp = $timestamp; $tpl->source->timestamp = $timestamp;
$tpl->source->exists = true; $tpl->source->exists = true;
$tpl->source->uid = $uid; $tpl->source->uid = $uid;
} else { } else {
$tpl->source = Source::load($tpl); $tpl->source = Source::load($tpl);
unset($tpl->compiled); $tpl->getCompiled(true); // @TODO this unset($tpl->compiled), there might be a bug here
} }
if ($caching !== 9999) { if ($caching !== \Smarty\Template::CACHING_NOCACHE_CODE) {
unset($tpl->cached); $tpl->getCached(true); // @TODO this unset($tpl->cached), there might be a bug here
} }
} else {
// on recursive calls force caching
$forceTplCache = true;
} }
$tpl->caching = $caching;
$tpl->cache_lifetime = $cache_lifetime;
if (!empty($data)) { if (!empty($extra_vars)) {
// set up variable values // set up variable values
foreach ($data as $_key => $_val) { foreach ($extra_vars as $_key => $_val) {
$tpl->assign($_key, $_val); $tpl->assign($_key, $_val);
} }
} }
if ($tpl->caching === 9999) { if ($tpl->caching === \Smarty\Template::CACHING_NOCACHE_CODE) {
if (!isset($tpl->compiled)) { if ($tpl->getCompiled()->getNocacheCode()) {
$tpl->loadCompiled(true); $this->getCached()->hashes[$tpl->getCompiled()->nocache_hash] = true;
}
if ($tpl->compiled->has_nocache_code) {
$this->cached->hashes[$tpl->compiled->nocache_hash] = true;
} }
} }
if (isset($uid)) { if (isset($uid)) {
$smarty = $this->_getSmartyObj();
if ($smarty->debugging) { if ($smarty->debugging) {
$smarty->getDebug()->start_template($tpl); $smarty->getDebug()->start_template($tpl);
$smarty->getDebug()->start_render($tpl); $smarty->getDebug()->start_render($tpl);
@@ -296,11 +303,14 @@ class Template extends TemplateBase {
$smarty->getDebug()->end_render($tpl); $smarty->getDebug()->end_render($tpl);
} }
} else { } else {
if (isset($tpl->compiled)) { $tpl->getCompiled()->render($tpl);
$tpl->compiled->render($tpl);
} else { // @TODO: this used to be like this. Might cause a bug.
$tpl->render(); // if (isset($tpl->compiled)) {
} // $tpl->getCompiled()->render($tpl);
// } else {
// $tpl->render();
// }
} }
} }
@@ -372,21 +382,21 @@ class Template extends TemplateBase {
if ($cache) { if ($cache) {
// CACHING_LIFETIME_SAVED cache expiry has to be validated here since otherwise we'd define the unifunc // CACHING_LIFETIME_SAVED cache expiry has to be validated here since otherwise we'd define the unifunc
if ($tpl->caching === \Smarty\Smarty::CACHING_LIFETIME_SAVED && $properties['cache_lifetime'] >= 0 if ($tpl->caching === \Smarty\Smarty::CACHING_LIFETIME_SAVED && $properties['cache_lifetime'] >= 0
&& (time() > ($tpl->cached->timestamp + $properties['cache_lifetime'])) && (time() > ($tpl->getCached()->timestamp + $properties['cache_lifetime']))
) { ) {
$is_valid = false; $is_valid = false;
} }
$tpl->cached->cache_lifetime = $properties['cache_lifetime']; $tpl->getCached()->cache_lifetime = $properties['cache_lifetime'];
$tpl->cached->valid = $is_valid; $tpl->getCached()->valid = $is_valid;
$generatedFile = $tpl->cached; $generatedFile = $tpl->getCached();
} else { } else {
$tpl->mustCompile = !$is_valid; $tpl->mustCompile = !$is_valid;
$generatedFile = $tpl->compiled; $generatedFile = $tpl->getCompiled();
$generatedFile->includes = $properties['includes'] ?? []; $generatedFile->includes = $properties['includes'] ?? [];
} }
if ($is_valid) { if ($is_valid) {
$generatedFile->unifunc = $properties['unifunc']; $generatedFile->unifunc = $properties['unifunc'];
$generatedFile->has_nocache_code = $properties['has_nocache_code']; $generatedFile->setNocacheCode($properties['has_nocache_code']);
$generatedFile->file_dependency = $properties['file_dependency']; $generatedFile->file_dependency = $properties['file_dependency'];
} }
return $is_valid && !function_exists($properties['unifunc']); return $is_valid && !function_exists($properties['unifunc']);
@@ -399,7 +409,7 @@ class Template extends TemplateBase {
* @throws \Exception * @throws \Exception
*/ */
public function compileTemplateSource() { public function compileTemplateSource() {
return $this->compiled->compileTemplateSource($this); return $this->getCompiled()->compileTemplateSource($this);
} }
/** /**
@@ -415,22 +425,18 @@ class Template extends TemplateBase {
// don't write cache file // don't write cache file
return false; return false;
} }
if (!isset($this->cached)) {
$this->loadCached();
}
$codeframe = $this->createCodeFrame($content, '', true); $codeframe = $this->createCodeFrame($content, '', true);
return $this->cached->writeCache($this, $codeframe); return $this->getCached()->writeCache($this, $codeframe);
} }
/** /**
* Get unique template id * Get unique template id
* *
* @return string * @return string
* @throws \Smarty\Exception
*/ */
public function _getTemplateId() { public function getTemplateId() {
return $this->templateId ?? $this->templateId = return $this->templateId ?? $this->templateId =
$this->smarty->_getTemplateId($this->template_resource, $this->cache_id, $this->compile_id); $this->smarty->generateUniqueTemplateId($this->template_resource, $this->cache_id, $this->compile_id);
} }
/** /**
@@ -443,32 +449,37 @@ class Template extends TemplateBase {
} }
/** /**
* Load compiled object * Return Compiled object
* *
* @param bool $force force new compiled object * @param bool $forceNew force new compiled object
*/ */
public function loadCompiled($force = false) { public function getCompiled($forceNew = false) {
if ($force || !isset($this->compiled)) { if ($forceNew || !isset($this->compiled)) {
$this->compiled = Compiled::load($this); $this->compiled = Compiled::load($this);
} }
return $this->compiled;
} }
/** /**
* Load cached object * Return Cached object
* *
* @param bool $force force new cached object * @param bool $forceNew force new cached object
* *
* @throws Exception * @throws Exception
*/ */
public function loadCached($force = false) { public function getCached($forceNew = false) {
if ($force || !isset($this->cached)) { if ($forceNew || !isset($this->cached)) {
$this->cached = new Cached($this); $this->cached = new Cached($this);
$this->cached->handler->populate($this->cached, $this); $this->cached->handler->populate($this->cached, $this);
// caching enabled ? if (!$this->isCachingEnabled()) {
if (!$this->caching || $this->source->handler->recompiled) {
$this->cached->valid = false; $this->cached->valid = false;
} }
} }
return $this->cached;
}
public function isCachingEnabled(): bool {
return $this->caching && !$this->source->handler->recompiled;
} }
/** /**
@@ -490,14 +501,13 @@ class Template extends TemplateBase {
} }
/** /**
* Load compiler object * Return Compiler object
*
* @throws \Smarty\Exception
*/ */
public function loadCompiler() { public function getCompiler() {
if (!isset($this->compiler)) { if (!isset($this->compiler)) {
$this->compiler = $this->source->createCompiler(); $this->compiler = $this->source->createCompiler();
} }
return $this->compiler;
} }
/** /**
@@ -506,102 +516,24 @@ class Template extends TemplateBase {
* @param string $content optional template content * @param string $content optional template content
* @param string $functions compiled template function and block code * @param string $functions compiled template function and block code
* @param bool $cache flag for cache file * @param bool $cache flag for cache file
* @param \Smarty\Compiler\Template $compiler * @param Compiler\Template|null $compiler
* *
* @return string * @return string
* @throws Exception
*/ */
public function createCodeFrame($content = '', $functions = '', $cache = false, \Smarty\Compiler\Template $compiler = null) { public function createCodeFrame($content = '', $functions = '', $cache = false, \Smarty\Compiler\Template $compiler = null) {
return $this->getCodeFrameCompiler()->create($content, $functions, $cache, $compiler); return $this->getCodeFrameCompiler()->create($content, $functions, $cache, $compiler);
} }
/**
* Handle unknown class methods
*
* @param string $name unknown method-name
* @param array $args argument array
*
* @return mixed
*/
public function __call($name, $args) {
// method of Smarty object?
if (method_exists($this->smarty, $name)) {
return call_user_func_array([$this->smarty, $name], $args);
}
// parent
return parent::__call($name, $args);
}
/**
* get Smarty property in template context
*
* @param string $property_name property name
*
* @return mixed|Cached
* @throws Exception
*
* @deprecated
* @TODO remove
*/
public function __get($property_name) {
switch ($property_name) {
case 'compiled':
$this->loadCompiled();
return $this->compiled;
case 'cached':
$this->loadCached();
return $this->cached;
case 'compiler':
$this->loadCompiler();
return $this->compiler;
default:
// Smarty property ?
if (property_exists($this->smarty, $property_name)) {
return $this->smarty->$property_name;
}
}
throw new Exception("template property '$property_name' does not exist.");
}
/**
* set Smarty property in template context
*
* @param string $property_name property name
* @param mixed $value value
*
* @throws Exception
*
*
* @deprecated
* @TODO remove
*/
public function __set($property_name, $value) {
switch ($property_name) {
case 'compiled':
case 'cached':
case 'compiler':
$this->$property_name = $value;
return;
default:
// Smarty property ?
if (property_exists($this->smarty, $property_name)) {
$this->smarty->$property_name = $value;
return;
}
}
throw new Exception("invalid template property '$property_name'.");
}
/** /**
* Template data object destructor * Template data object destructor
*/ */
public function __destruct() { public function __destruct() {
if ($this->smarty->cache_locking && isset($this->cached) && $this->cached->is_locked) { if ($this->smarty->cache_locking && $this->getCached()->is_locked) {
$this->cached->handler->releaseLock($this->smarty, $this->cached); $this->getCached()->handler->releaseLock($this->smarty, $this->getCached());
} }
} }
/** /**
* Returns if the current template must be compiled by the Smarty compiler * Returns if the current template must be compiled by the Smarty compiler
* It does compare the timestamps of template source and the compiled templates and checks the force compile * It does compare the timestamps of template source and the compiled templates and checks the force compile
@@ -622,8 +554,8 @@ class Template extends TemplateBase {
if ($this->mustCompile === null) { if ($this->mustCompile === null) {
$this->mustCompile = $this->smarty->force_compile $this->mustCompile = $this->smarty->force_compile
|| $this->source->handler->recompiled || $this->source->handler->recompiled
|| !$this->compiled->exists || !$this->getCompiled()->exists
|| ($this->compile_check && $this->compiled->getTimeStamp() < $this->source->getTimeStamp()); || ($this->compile_check && $this->getCompiled()->getTimeStamp() < $this->source->getTimeStamp());
} }
return $this->mustCompile; return $this->mustCompile;
} }
@@ -704,7 +636,7 @@ class Template extends TemplateBase {
{ {
$confObj = parent::configLoad($config_file, $sections); $confObj = parent::configLoad($config_file, $sections);
$this->compiled->file_dependency[ $confObj->source->uid ] = $this->getCompiled()->file_dependency[ $confObj->source->uid ] =
array($confObj->source->filepath, $confObj->source->getTimeStamp(), $confObj->source->type); array($confObj->source->filepath, $confObj->source->getTimeStamp(), $confObj->source->type);
return $confObj; return $confObj;
@@ -766,19 +698,22 @@ class Template extends TemplateBase {
if ($function === 2) { if ($function === 2) {
if ($this->caching) { if ($this->caching) {
// return cache status of template // return cache status of template
if (!isset($this->cached)) { $result = $this->getCached()->isCached($this);
$this->loadCached();
}
$result = $this->cached->isCached($this);
} else { } else {
return false; return false;
} }
} else { } else {
// After rendering a template, the tpl/config variables are reset, so the template can be re-used.
$savedTplVars = $this->tpl_vars; $savedTplVars = $this->tpl_vars;
$savedConfigVars = $this->config_vars; $savedConfigVars = $this->config_vars;
// Start output-buffering. @TODO keep all ob_* calls together
ob_start(); ob_start();
$result = $this->render(false, $function); $result = $this->render(false, $function);
// Restore the template to its previous state
$this->_cleanUp(); $this->_cleanUp();
$this->tpl_vars = $savedTplVars; $this->tpl_vars = $savedTplVars;
$this->config_vars = $savedConfigVars; $this->config_vars = $savedConfigVars;

View File

@@ -178,8 +178,8 @@ class Cached extends GeneratedPhpFile {
return $this->valid; return $this->valid;
} }
if ($this->valid && $_template->caching === \Smarty\Smarty::CACHING_LIFETIME_SAVED if ($this->valid && $_template->caching === \Smarty\Smarty::CACHING_LIFETIME_SAVED
&& $_template->cached->cache_lifetime >= 0 && $_template->getCached()->cache_lifetime >= 0
&& (time() > ($_template->cached->timestamp + $_template->cached->cache_lifetime)) && (time() > ($_template->getCached()->timestamp + $_template->getCached()->cache_lifetime))
) { ) {
$this->valid = false; $this->valid = false;
} }
@@ -266,10 +266,8 @@ class Cached extends GeneratedPhpFile {
*/ */
private function updateCache(Template $_template, $no_output_filter) { private function updateCache(Template $_template, $no_output_filter) {
ob_start(); ob_start();
if (!isset($_template->compiled)) {
$_template->loadCompiled(); $_template->getCompiled()->render($_template);
}
$_template->compiled->render($_template);
if ($_template->smarty->debugging) { if ($_template->smarty->debugging) {
$_template->smarty->getDebug()->start_cache($_template); $_template->smarty->getDebug()->start_cache($_template);
} }
@@ -277,10 +275,10 @@ class Cached extends GeneratedPhpFile {
$compile_check = (int)$_template->compile_check; $compile_check = (int)$_template->compile_check;
$_template->compile_check = \Smarty\Smarty::COMPILECHECK_OFF; $_template->compile_check = \Smarty\Smarty::COMPILECHECK_OFF;
if ($_template->_isSubTpl()) { if ($_template->_isSubTpl()) {
$_template->compiled->unifunc = $_template->parent->compiled->unifunc; $_template->getCompiled()->unifunc = $_template->parent->getCompiled()->unifunc;
} }
if (!$_template->cached->processed) { if (!$_template->getCached()->processed) {
$_template->cached->process($_template, true); $_template->getCached()->process($_template, true);
} }
$_template->compile_check = $compile_check; $_template->compile_check = $compile_check;
$this->renderTemplateCode($_template); $this->renderTemplateCode($_template);
@@ -301,10 +299,10 @@ class Cached extends GeneratedPhpFile {
$php_pattern = '/(<%|%>|<\?php|<\?|\?>|<script\s+language\s*=\s*[\"\']?\s*php\s*[\"\']?\s*>)/'; $php_pattern = '/(<%|%>|<\?php|<\?|\?>|<script\s+language\s*=\s*[\"\']?\s*php\s*[\"\']?\s*>)/';
$content = ob_get_clean(); $content = ob_get_clean();
$hash_array = $this->hashes; $hash_array = $this->hashes;
$hash_array[$_template->compiled->nocache_hash] = true; $hash_array[$_template->getCompiled()->nocache_hash] = true;
$hash_array = array_keys($hash_array); $hash_array = array_keys($hash_array);
$nocache_hash = '(' . implode('|', $hash_array) . ')'; $nocache_hash = '(' . implode('|', $hash_array) . ')';
$_template->cached->has_nocache_code = false; $_template->getCached()->setNocacheCode(false);
// get text between non-cached items // get text between non-cached items
$cache_split = $cache_split =
preg_split( preg_split(
@@ -341,13 +339,13 @@ class Cached extends GeneratedPhpFile {
$content .= $curr_split; $content .= $curr_split;
} }
if (isset($cache_parts[0][$curr_idx])) { if (isset($cache_parts[0][$curr_idx])) {
$_template->cached->has_nocache_code = true; $_template->getCached()->setNocacheCode(true);
$content .= $cache_parts[2][$curr_idx]; $content .= $cache_parts[2][$curr_idx];
} }
} }
if ( if (
!$no_output_filter !$no_output_filter
&& !$_template->cached->has_nocache_code && !$_template->getCached()->getNocacheCode()
) { ) {
$content = $_template->smarty->runOutputFilters($content, $_template); $content = $_template->smarty->runOutputFilters($content, $_template);
} }

View File

@@ -35,9 +35,7 @@ class Compiled extends GeneratedPhpFile {
*/ */
public static function load($_template) { public static function load($_template) {
$compiled = new Compiled(); $compiled = new Compiled();
if ($_template->source->handler->hasCompiledHandler) { if ($_template->source->handler->supportsCompiledTemplates()) {
$_template->source->handler->populateCompiledFilepath($compiled, $_template);
} else {
$compiled->populateCompiledFilepath($_template); $compiled->populateCompiledFilepath($_template);
} }
return $compiled; return $compiled;
@@ -48,7 +46,7 @@ class Compiled extends GeneratedPhpFile {
* *
* @param Template $_template template object * @param Template $_template template object
**/ **/
public function populateCompiledFilepath(Template $_template) { private function populateCompiledFilepath(Template $_template) {
$source = &$_template->source; $source = &$_template->source;
$smarty = &$_template->smarty; $smarty = &$_template->smarty;
$this->filepath = $smarty->getCompileDir(); $this->filepath = $smarty->getCompileDir();
@@ -105,15 +103,14 @@ class Compiled extends GeneratedPhpFile {
if (!$this->processed) { if (!$this->processed) {
$this->process($_template); $this->process($_template);
} }
if (isset($_template->cached)) {
$_template->cached->file_dependency = $_template->getCached()->file_dependency =
array_merge($_template->cached->file_dependency, $this->file_dependency); array_merge($_template->getCached()->file_dependency, $this->file_dependency);
}
$_template->getRenderedTemplateCode($this->unifunc); $_template->getRenderedTemplateCode($this->unifunc);
if ($_template->caching && $this->has_nocache_code) { if ($_template->caching && $this->getNocacheCode()) {
$_template->cached->hashes[$this->nocache_hash] = true; $_template->getCached()->hashes[$this->nocache_hash] = true;
} }
if ($_template->smarty->debugging) { if ($_template->smarty->debugging) {
$_template->smarty->getDebug()->end_render($_template); $_template->smarty->getDebug()->end_render($_template);
@@ -176,18 +173,14 @@ class Compiled extends GeneratedPhpFile {
// compile locking // compile locking
try { try {
// call compiler // call compiler
$_template->loadCompiler(); $this->write($_template, $_template->getCompiler()->compileTemplate($_template));
$this->write($_template, $_template->compiler->compileTemplate($_template));
} catch (\Exception $e) { } catch (\Exception $e) {
// restore old timestamp in case of error // restore old timestamp in case of error
if ($saved_timestamp && is_file($this->filepath)) { if ($saved_timestamp && is_file($this->filepath)) {
touch($this->filepath, $saved_timestamp); touch($this->filepath, $saved_timestamp);
} }
unset($_template->compiler);
throw $e; throw $e;
} }
// release compiler object to free memory
unset($_template->compiler);
} }
/** /**

View File

@@ -55,7 +55,7 @@ abstract class GeneratedPhpFile {
* *
* @var bool * @var bool
*/ */
public $has_nocache_code = false; private $has_nocache_code = false;
/** /**
* resource file dependency * resource file dependency
@@ -76,4 +76,18 @@ abstract class GeneratedPhpFile {
return $this->timestamp; return $this->timestamp;
} }
/**
* @return bool
*/
public function getNocacheCode(): bool {
return $this->has_nocache_code;
}
/**
* @param bool $has_nocache_code
*/
public function setNocacheCode(bool $has_nocache_code): void {
$this->has_nocache_code = $has_nocache_code;
}
} }

View File

@@ -183,7 +183,7 @@ abstract class TemplateBase extends Data {
* variables * variables
* @param null $name optional data block name * @param null $name optional data block name
* *
* @return DataObject data object * @return Data data object
* @throws Exception * @throws Exception
* @api Smarty::createData() * @api Smarty::createData()
* @link https://www.smarty.net/docs/en/api.create.data.tpl * @link https://www.smarty.net/docs/en/api.create.data.tpl
@@ -192,7 +192,7 @@ abstract class TemplateBase extends Data {
public function createData(Data $parent = null, $name = null) { public function createData(Data $parent = null, $name = null) {
/* @var Smarty $smarty */ /* @var Smarty $smarty */
$smarty = $this->_getSmartyObj(); $smarty = $this->_getSmartyObj();
$dataObj = new DataObject($parent, $smarty, $name); $dataObj = new Data($parent, $smarty, $name);
if ($smarty->debugging) { if ($smarty->debugging) {
$smarty->getDebug()->register_data($dataObj); $smarty->getDebug()->register_data($dataObj);
} }

View File

@@ -42,7 +42,7 @@ class CacheResourceFileTest extends CacheResourceTestCommon
$this->smarty->setUseSubDirs(true); $this->smarty->setUseSubDirs(true);
$tpl = $this->smarty->createTemplate('helloworld.tpl'); $tpl = $this->smarty->createTemplate('helloworld.tpl');
$this->assertEquals($this->buildCachedPath($tpl, true, null, null, 'helloworld.tpl', $type = 'file', $this->smarty->getTemplateDir(0), 'file') $this->assertEquals($this->buildCachedPath($tpl, true, null, null, 'helloworld.tpl', $type = 'file', $this->smarty->getTemplateDir(0), 'file')
, $tpl->cached->filepath); , $tpl->getCached()->filepath);
} }
/** /**
@@ -55,7 +55,7 @@ class CacheResourceFileTest extends CacheResourceTestCommon
$this->smarty->setUseSubDirs(true); $this->smarty->setUseSubDirs(true);
$tpl = $this->smarty->createTemplate('helloworld.tpl', 'foo|bar'); $tpl = $this->smarty->createTemplate('helloworld.tpl', 'foo|bar');
$this->assertEquals($this->buildCachedPath($tpl, true, 'foo|bar', null, 'helloworld.tpl', $type = 'file', $this->smarty->getTemplateDir(0), 'file') $this->assertEquals($this->buildCachedPath($tpl, true, 'foo|bar', null, 'helloworld.tpl', $type = 'file', $this->smarty->getTemplateDir(0), 'file')
, $tpl->cached->filepath); , $tpl->getCached()->filepath);
} }
/** /**
@@ -68,7 +68,7 @@ class CacheResourceFileTest extends CacheResourceTestCommon
$this->smarty->setUseSubDirs(true); $this->smarty->setUseSubDirs(true);
$tpl = $this->smarty->createTemplate('helloworld.tpl', null, 'blar'); $tpl = $this->smarty->createTemplate('helloworld.tpl', null, 'blar');
$this->assertEquals($this->buildCachedPath($tpl, true, null, 'blar', 'helloworld.tpl', $type = 'file', $this->smarty->getTemplateDir(0), 'file') $this->assertEquals($this->buildCachedPath($tpl, true, null, 'blar', 'helloworld.tpl', $type = 'file', $this->smarty->getTemplateDir(0), 'file')
, $tpl->cached->filepath); , $tpl->getCached()->filepath);
} }
/** /**
@@ -81,7 +81,7 @@ class CacheResourceFileTest extends CacheResourceTestCommon
$this->smarty->setUseSubDirs(true); $this->smarty->setUseSubDirs(true);
$tpl = $this->smarty->createTemplate('helloworld.tpl', 'foo|bar', 'blar'); $tpl = $this->smarty->createTemplate('helloworld.tpl', 'foo|bar', 'blar');
$this->assertEquals($this->buildCachedPath($tpl, true, 'foo|bar', 'blar', 'helloworld.tpl', $type = 'file', $this->smarty->getTemplateDir(0), 'file') $this->assertEquals($this->buildCachedPath($tpl, true, 'foo|bar', 'blar', 'helloworld.tpl', $type = 'file', $this->smarty->getTemplateDir(0), 'file')
, $tpl->cached->filepath); , $tpl->getCached()->filepath);
} }
/** /**
@@ -95,7 +95,7 @@ class CacheResourceFileTest extends CacheResourceTestCommon
$this->smarty->setUseSubDirs(true); $this->smarty->setUseSubDirs(true);
$tpl = $this->smarty->createTemplate('helloworld.tpl', 'foo|bar', 'blar'); $tpl = $this->smarty->createTemplate('helloworld.tpl', 'foo|bar', 'blar');
$this->writeCachedContent($tpl); $this->writeCachedContent($tpl);
$this->assertTrue(file_exists($tpl->cached->filepath)); $this->assertTrue(file_exists($tpl->getCached()->filepath));
$this->assertEquals(1, $this->smarty->clearAllCache()); $this->assertEquals(1, $this->smarty->clearAllCache());
} }
@@ -114,13 +114,13 @@ class CacheResourceFileTest extends CacheResourceTestCommon
$this->writeCachedContent($tpl2); $this->writeCachedContent($tpl2);
$tpl3 = $this->smarty->createTemplate('helloworld2.tpl', 'foo|bar', 'blar'); $tpl3 = $this->smarty->createTemplate('helloworld2.tpl', 'foo|bar', 'blar');
$this->writeCachedContent($tpl3); $this->writeCachedContent($tpl3);
$this->assertTrue(file_exists($tpl->cached->filepath)); $this->assertTrue(file_exists($tpl->getCached()->filepath));
$this->assertTrue(file_exists($tpl2->cached->filepath)); $this->assertTrue(file_exists($tpl2->getCached()->filepath));
$this->assertTrue(file_exists($tpl3->cached->filepath)); $this->assertTrue(file_exists($tpl3->getCached()->filepath));
$this->assertEquals(2, $this->smarty->clearCache(null, 'foo|bar')); $this->assertEquals(2, $this->smarty->clearCache(null, 'foo|bar'));
$this->assertFalse(file_exists($tpl->cached->filepath)); $this->assertFalse(file_exists($tpl->getCached()->filepath));
$this->assertTrue(file_exists($tpl2->cached->filepath)); $this->assertTrue(file_exists($tpl2->getCached()->filepath));
$this->assertFalse(file_exists($tpl3->cached->filepath)); $this->assertFalse(file_exists($tpl3->getCached()->filepath));
} }
public function testClearCacheCacheIdCompileId2() public function testClearCacheCacheIdCompileId2()
@@ -135,13 +135,13 @@ class CacheResourceFileTest extends CacheResourceTestCommon
$this->writeCachedContent($tpl2); $this->writeCachedContent($tpl2);
$tpl3 = $this->smarty->createTemplate('helloworld2.tpl', 'foo|bar', 'blar'); $tpl3 = $this->smarty->createTemplate('helloworld2.tpl', 'foo|bar', 'blar');
$this->writeCachedContent($tpl3); $this->writeCachedContent($tpl3);
$this->assertTrue(file_exists($tpl->cached->filepath)); $this->assertTrue(file_exists($tpl->getCached()->filepath));
$this->assertTrue(file_exists($tpl2->cached->filepath)); $this->assertTrue(file_exists($tpl2->getCached()->filepath));
$this->assertTrue(file_exists($tpl3->cached->filepath)); $this->assertTrue(file_exists($tpl3->getCached()->filepath));
$this->assertEquals(2, $this->smarty->clearCache('helloworld.tpl')); $this->assertEquals(2, $this->smarty->clearCache('helloworld.tpl'));
$this->assertFalse(file_exists($tpl->cached->filepath)); $this->assertFalse(file_exists($tpl->getCached()->filepath));
$this->assertFalse(file_exists($tpl2->cached->filepath)); $this->assertFalse(file_exists($tpl2->getCached()->filepath));
$this->assertTrue(file_exists($tpl3->cached->filepath)); $this->assertTrue(file_exists($tpl3->getCached()->filepath));
} }
public function testClearCacheCacheIdCompileId2Sub() public function testClearCacheCacheIdCompileId2Sub()
@@ -156,13 +156,13 @@ class CacheResourceFileTest extends CacheResourceTestCommon
$this->writeCachedContent($tpl2); $this->writeCachedContent($tpl2);
$tpl3 = $this->smarty->createTemplate('helloworld2.tpl', 'foo|bar', 'blar'); $tpl3 = $this->smarty->createTemplate('helloworld2.tpl', 'foo|bar', 'blar');
$this->writeCachedContent($tpl3); $this->writeCachedContent($tpl3);
$this->assertTrue(file_exists($tpl->cached->filepath)); $this->assertTrue(file_exists($tpl->getCached()->filepath));
$this->assertTrue(file_exists($tpl2->cached->filepath)); $this->assertTrue(file_exists($tpl2->getCached()->filepath));
$this->assertTrue(file_exists($tpl3->cached->filepath)); $this->assertTrue(file_exists($tpl3->getCached()->filepath));
$this->assertEquals(2, $this->smarty->clearCache('helloworld.tpl')); $this->assertEquals(2, $this->smarty->clearCache('helloworld.tpl'));
$this->assertFalse(file_exists($tpl->cached->filepath)); $this->assertFalse(file_exists($tpl->getCached()->filepath));
$this->assertFalse(file_exists($tpl2->cached->filepath)); $this->assertFalse(file_exists($tpl2->getCached()->filepath));
$this->assertTrue(file_exists($tpl3->cached->filepath)); $this->assertTrue(file_exists($tpl3->getCached()->filepath));
} }
public function testClearCacheCacheIdCompileId3() public function testClearCacheCacheIdCompileId3()
@@ -177,13 +177,13 @@ class CacheResourceFileTest extends CacheResourceTestCommon
$this->writeCachedContent($tpl2); $this->writeCachedContent($tpl2);
$tpl3 = $this->smarty->createTemplate('helloworld2.tpl', 'foo|bar', 'blar'); $tpl3 = $this->smarty->createTemplate('helloworld2.tpl', 'foo|bar', 'blar');
$this->writeCachedContent($tpl3); $this->writeCachedContent($tpl3);
$this->assertTrue(file_exists($tpl->cached->filepath)); $this->assertTrue(file_exists($tpl->getCached()->filepath));
$this->assertTrue(file_exists($tpl2->cached->filepath)); $this->assertTrue(file_exists($tpl2->getCached()->filepath));
$this->assertTrue(file_exists($tpl3->cached->filepath)); $this->assertTrue(file_exists($tpl3->getCached()->filepath));
$this->assertEquals(1, $this->smarty->clearCache('helloworld.tpl', null, 'blar2')); $this->assertEquals(1, $this->smarty->clearCache('helloworld.tpl', null, 'blar2'));
$this->assertTrue(file_exists($tpl->cached->filepath)); $this->assertTrue(file_exists($tpl->getCached()->filepath));
$this->assertFalse(file_exists($tpl2->cached->filepath)); $this->assertFalse(file_exists($tpl2->getCached()->filepath));
$this->assertTrue(file_exists($tpl3->cached->filepath)); $this->assertTrue(file_exists($tpl3->getCached()->filepath));
} }
public function testClearCacheCacheIdCompileId3Sub() public function testClearCacheCacheIdCompileId3Sub()
@@ -198,13 +198,13 @@ class CacheResourceFileTest extends CacheResourceTestCommon
$this->writeCachedContent($tpl2); $this->writeCachedContent($tpl2);
$tpl3 = $this->smarty->createTemplate('helloworld2.tpl', 'foo|bar', 'blar'); $tpl3 = $this->smarty->createTemplate('helloworld2.tpl', 'foo|bar', 'blar');
$this->writeCachedContent($tpl3); $this->writeCachedContent($tpl3);
$this->assertTrue(file_exists($tpl->cached->filepath)); $this->assertTrue(file_exists($tpl->getCached()->filepath));
$this->assertTrue(file_exists($tpl2->cached->filepath)); $this->assertTrue(file_exists($tpl2->getCached()->filepath));
$this->assertTrue(file_exists($tpl3->cached->filepath)); $this->assertTrue(file_exists($tpl3->getCached()->filepath));
$this->assertEquals(1, $this->smarty->clearCache('helloworld.tpl', null, 'blar2')); $this->assertEquals(1, $this->smarty->clearCache('helloworld.tpl', null, 'blar2'));
$this->assertTrue(file_exists($tpl->cached->filepath)); $this->assertTrue(file_exists($tpl->getCached()->filepath));
$this->assertFalse(file_exists($tpl2->cached->filepath)); $this->assertFalse(file_exists($tpl2->getCached()->filepath));
$this->assertTrue(file_exists($tpl3->cached->filepath)); $this->assertTrue(file_exists($tpl3->getCached()->filepath));
} }
public function testClearCacheCacheIdCompileId4() public function testClearCacheCacheIdCompileId4()
@@ -219,13 +219,13 @@ class CacheResourceFileTest extends CacheResourceTestCommon
$this->writeCachedContent($tpl2); $this->writeCachedContent($tpl2);
$tpl3 = $this->smarty->createTemplate('helloworld2.tpl', 'foo|bar', 'blar'); $tpl3 = $this->smarty->createTemplate('helloworld2.tpl', 'foo|bar', 'blar');
$this->writeCachedContent($tpl3); $this->writeCachedContent($tpl3);
$this->assertTrue(file_exists($tpl->cached->filepath)); $this->assertTrue(file_exists($tpl->getCached()->filepath));
$this->assertTrue(file_exists($tpl2->cached->filepath)); $this->assertTrue(file_exists($tpl2->getCached()->filepath));
$this->assertTrue(file_exists($tpl3->cached->filepath)); $this->assertTrue(file_exists($tpl3->getCached()->filepath));
$this->assertEquals(1, $this->smarty->clearCache('helloworld.tpl', null, 'blar2')); $this->assertEquals(1, $this->smarty->clearCache('helloworld.tpl', null, 'blar2'));
$this->assertTrue(file_exists($tpl->cached->filepath)); $this->assertTrue(file_exists($tpl->getCached()->filepath));
$this->assertFalse(file_exists($tpl2->cached->filepath)); $this->assertFalse(file_exists($tpl2->getCached()->filepath));
$this->assertTrue(file_exists($tpl3->cached->filepath)); $this->assertTrue(file_exists($tpl3->getCached()->filepath));
} }
public function testClearCacheCacheIdCompileId4Sub() public function testClearCacheCacheIdCompileId4Sub()
@@ -240,13 +240,13 @@ class CacheResourceFileTest extends CacheResourceTestCommon
$this->writeCachedContent($tpl2); $this->writeCachedContent($tpl2);
$tpl3 = $this->smarty->createTemplate('helloworld2.tpl', 'foo|bar', 'blar'); $tpl3 = $this->smarty->createTemplate('helloworld2.tpl', 'foo|bar', 'blar');
$this->writeCachedContent($tpl3); $this->writeCachedContent($tpl3);
$this->assertTrue(file_exists($tpl->cached->filepath)); $this->assertTrue(file_exists($tpl->getCached()->filepath));
$this->assertTrue(file_exists($tpl2->cached->filepath)); $this->assertTrue(file_exists($tpl2->getCached()->filepath));
$this->assertTrue(file_exists($tpl3->cached->filepath)); $this->assertTrue(file_exists($tpl3->getCached()->filepath));
$this->assertEquals(1, $this->smarty->clearCache('helloworld.tpl', null, 'blar2')); $this->assertEquals(1, $this->smarty->clearCache('helloworld.tpl', null, 'blar2'));
$this->assertTrue(file_exists($tpl->cached->filepath)); $this->assertTrue(file_exists($tpl->getCached()->filepath));
$this->assertFalse(file_exists($tpl2->cached->filepath)); $this->assertFalse(file_exists($tpl2->getCached()->filepath));
$this->assertTrue(file_exists($tpl3->cached->filepath)); $this->assertTrue(file_exists($tpl3->getCached()->filepath));
} }
public function testClearCacheCacheIdCompileId5() public function testClearCacheCacheIdCompileId5()
@@ -261,13 +261,13 @@ class CacheResourceFileTest extends CacheResourceTestCommon
$this->writeCachedContent($tpl2); $this->writeCachedContent($tpl2);
$tpl3 = $this->smarty->createTemplate('helloworld2.tpl', 'foo|bar', 'blar'); $tpl3 = $this->smarty->createTemplate('helloworld2.tpl', 'foo|bar', 'blar');
$this->writeCachedContent($tpl3); $this->writeCachedContent($tpl3);
$this->assertTrue(file_exists($tpl->cached->filepath)); $this->assertTrue(file_exists($tpl->getCached()->filepath));
$this->assertTrue(file_exists($tpl2->cached->filepath)); $this->assertTrue(file_exists($tpl2->getCached()->filepath));
$this->assertTrue(file_exists($tpl3->cached->filepath)); $this->assertTrue(file_exists($tpl3->getCached()->filepath));
$this->assertEquals(2, $this->smarty->clearCache(null, null, 'blar')); $this->assertEquals(2, $this->smarty->clearCache(null, null, 'blar'));
$this->assertFalse(file_exists($tpl->cached->filepath)); $this->assertFalse(file_exists($tpl->getCached()->filepath));
$this->assertTrue(file_exists($tpl2->cached->filepath)); $this->assertTrue(file_exists($tpl2->getCached()->filepath));
$this->assertFalse(file_exists($tpl3->cached->filepath)); $this->assertFalse(file_exists($tpl3->getCached()->filepath));
} }
public function testClearCacheCacheIdCompileId5Sub() public function testClearCacheCacheIdCompileId5Sub()
@@ -282,13 +282,13 @@ class CacheResourceFileTest extends CacheResourceTestCommon
$this->writeCachedContent($tpl2); $this->writeCachedContent($tpl2);
$tpl3 = $this->smarty->createTemplate('helloworld2.tpl', 'foo|bar', 'blar'); $tpl3 = $this->smarty->createTemplate('helloworld2.tpl', 'foo|bar', 'blar');
$this->writeCachedContent($tpl3); $this->writeCachedContent($tpl3);
$this->assertTrue(file_exists($tpl->cached->filepath)); $this->assertTrue(file_exists($tpl->getCached()->filepath));
$this->assertTrue(file_exists($tpl2->cached->filepath)); $this->assertTrue(file_exists($tpl2->getCached()->filepath));
$this->assertTrue(file_exists($tpl3->cached->filepath)); $this->assertTrue(file_exists($tpl3->getCached()->filepath));
$this->assertEquals(2, $this->smarty->clearCache(null, null, 'blar')); $this->assertEquals(2, $this->smarty->clearCache(null, null, 'blar'));
$this->assertFalse(file_exists($tpl->cached->filepath)); $this->assertFalse(file_exists($tpl->getCached()->filepath));
$this->assertTrue(file_exists($tpl2->cached->filepath)); $this->assertTrue(file_exists($tpl2->getCached()->filepath));
$this->assertFalse(file_exists($tpl3->cached->filepath)); $this->assertFalse(file_exists($tpl3->getCached()->filepath));
} }
public function testClearCacheCacheFile() public function testClearCacheCacheFile()
@@ -305,15 +305,15 @@ class CacheResourceFileTest extends CacheResourceTestCommon
$this->writeCachedContent($tpl3); $this->writeCachedContent($tpl3);
$tpl4 = $this->smarty->createTemplate('helloworld2.tpl'); $tpl4 = $this->smarty->createTemplate('helloworld2.tpl');
$this->writeCachedContent($tpl4); $this->writeCachedContent($tpl4);
$this->assertTrue(file_exists($tpl->cached->filepath)); $this->assertTrue(file_exists($tpl->getCached()->filepath));
$this->assertTrue(file_exists($tpl2->cached->filepath)); $this->assertTrue(file_exists($tpl2->getCached()->filepath));
$this->assertTrue(file_exists($tpl3->cached->filepath)); $this->assertTrue(file_exists($tpl3->getCached()->filepath));
$this->assertTrue(file_exists($tpl4->cached->filepath)); $this->assertTrue(file_exists($tpl4->getCached()->filepath));
$this->assertEquals(3, $this->smarty->clearCache('helloworld.tpl')); $this->assertEquals(3, $this->smarty->clearCache('helloworld.tpl'));
$this->assertFalse(file_exists($tpl->cached->filepath)); $this->assertFalse(file_exists($tpl->getCached()->filepath));
$this->assertFalse(file_exists($tpl2->cached->filepath)); $this->assertFalse(file_exists($tpl2->getCached()->filepath));
$this->assertFalse(file_exists($tpl3->cached->filepath)); $this->assertFalse(file_exists($tpl3->getCached()->filepath));
$this->assertTrue(file_exists($tpl4->cached->filepath)); $this->assertTrue(file_exists($tpl4->getCached()->filepath));
} }
public function testClearCacheCacheFileSub() public function testClearCacheCacheFileSub()
@@ -330,15 +330,15 @@ class CacheResourceFileTest extends CacheResourceTestCommon
$this->writeCachedContent($tpl3); $this->writeCachedContent($tpl3);
$tpl4 = $this->smarty->createTemplate('helloworld2.tpl'); $tpl4 = $this->smarty->createTemplate('helloworld2.tpl');
$this->writeCachedContent($tpl4); $this->writeCachedContent($tpl4);
$this->assertTrue(file_exists($tpl->cached->filepath)); $this->assertTrue(file_exists($tpl->getCached()->filepath));
$this->assertTrue(file_exists($tpl2->cached->filepath)); $this->assertTrue(file_exists($tpl2->getCached()->filepath));
$this->assertTrue(file_exists($tpl3->cached->filepath)); $this->assertTrue(file_exists($tpl3->getCached()->filepath));
$this->assertTrue(file_exists($tpl4->cached->filepath)); $this->assertTrue(file_exists($tpl4->getCached()->filepath));
$this->assertEquals(3, $this->smarty->clearCache('helloworld.tpl')); $this->assertEquals(3, $this->smarty->clearCache('helloworld.tpl'));
$this->assertFalse(file_exists($tpl->cached->filepath)); $this->assertFalse(file_exists($tpl->getCached()->filepath));
$this->assertFalse(file_exists($tpl2->cached->filepath)); $this->assertFalse(file_exists($tpl2->getCached()->filepath));
$this->assertFalse(file_exists($tpl3->cached->filepath)); $this->assertFalse(file_exists($tpl3->getCached()->filepath));
$this->assertTrue(file_exists($tpl4->cached->filepath)); $this->assertTrue(file_exists($tpl4->getCached()->filepath));
} }
/** /**

View File

@@ -47,9 +47,8 @@ class CacheResourceCustomMemcacheTest extends CacheResourceTestCommon
$this->smarty->caching = true; $this->smarty->caching = true;
$this->smarty->cache_lifetime = 1000; $this->smarty->cache_lifetime = 1000;
$tpl = $this->smarty->createTemplate('helloworld.tpl'); $tpl = $this->smarty->createTemplate('helloworld.tpl');
$tpl->loadCached();
$sha1 = $tpl->source->uid . '#helloworld_tpl##'; $sha1 = $tpl->source->uid . '#helloworld_tpl##';
$this->assertEquals($sha1, $tpl->cached->filepath); $this->assertEquals($sha1, $tpl->getCached()->filepath);
} }
/** /**
@@ -60,9 +59,8 @@ class CacheResourceCustomMemcacheTest extends CacheResourceTestCommon
$this->smarty->caching = true; $this->smarty->caching = true;
$this->smarty->cache_lifetime = 1000; $this->smarty->cache_lifetime = 1000;
$tpl = $this->smarty->createTemplate('helloworld.tpl', 'foo|bar'); $tpl = $this->smarty->createTemplate('helloworld.tpl', 'foo|bar');
$tpl->loadCached();
$sha1 = $tpl->source->uid . '#helloworld_tpl#foo|bar#'; $sha1 = $tpl->source->uid . '#helloworld_tpl#foo|bar#';
$this->assertEquals($sha1, $tpl->cached->filepath); $this->assertEquals($sha1, $tpl->getCached()->filepath);
} }
/** /**
@@ -73,9 +71,8 @@ class CacheResourceCustomMemcacheTest extends CacheResourceTestCommon
$this->smarty->caching = true; $this->smarty->caching = true;
$this->smarty->cache_lifetime = 1000; $this->smarty->cache_lifetime = 1000;
$tpl = $this->smarty->createTemplate('helloworld.tpl', null, 'blar'); $tpl = $this->smarty->createTemplate('helloworld.tpl', null, 'blar');
$tpl->loadCached();
$sha1 = $tpl->source->uid . '#helloworld_tpl##blar'; $sha1 = $tpl->source->uid . '#helloworld_tpl##blar';
$this->assertEquals($sha1, $tpl->cached->filepath); $this->assertEquals($sha1, $tpl->getCached()->filepath);
} }
/** /**
@@ -86,8 +83,7 @@ class CacheResourceCustomMemcacheTest extends CacheResourceTestCommon
$this->smarty->caching = true; $this->smarty->caching = true;
$this->smarty->cache_lifetime = 1000; $this->smarty->cache_lifetime = 1000;
$tpl = $this->smarty->createTemplate('helloworld.tpl', 'foo|bar', 'blar'); $tpl = $this->smarty->createTemplate('helloworld.tpl', 'foo|bar', 'blar');
$tpl->loadCached();
$sha1 = $tpl->source->uid . '#helloworld_tpl#foo|bar#blar'; $sha1 = $tpl->source->uid . '#helloworld_tpl#foo|bar#blar';
$this->assertEquals($sha1, $tpl->cached->filepath); $this->assertEquals($sha1, $tpl->getCached()->filepath);
} }
} }

View File

@@ -45,7 +45,7 @@ abstract class CacheResourceTestCommon extends PHPUnit_Smarty
$this->smarty->cache_lifetime = 1000; $this->smarty->cache_lifetime = 1000;
$this->smarty->setUseSubDirs(true); $this->smarty->setUseSubDirs(true);
$tpl = $this->smarty->createTemplate('helloworld.tpl'); $tpl = $this->smarty->createTemplate('helloworld.tpl');
$this->assertEquals($this->buildCachedPath($tpl), $tpl->cached->filepath); $this->assertEquals($this->buildCachedPath($tpl), $tpl->getCached()->filepath);
} }
/** /**
@@ -56,7 +56,7 @@ abstract class CacheResourceTestCommon extends PHPUnit_Smarty
$this->smarty->caching = true; $this->smarty->caching = true;
$this->smarty->cache_lifetime = 1000; $this->smarty->cache_lifetime = 1000;
$tpl = $this->smarty->createTemplate('helloworld.tpl', 'foo|bar'); $tpl = $this->smarty->createTemplate('helloworld.tpl', 'foo|bar');
$this->assertEquals($this->buildCachedPath($tpl, true, 'foo|bar'), $tpl->cached->filepath); $this->assertEquals($this->buildCachedPath($tpl, true, 'foo|bar'), $tpl->getCached()->filepath);
} }
/** /**
@@ -67,7 +67,7 @@ abstract class CacheResourceTestCommon extends PHPUnit_Smarty
$this->smarty->caching = true; $this->smarty->caching = true;
$this->smarty->cache_lifetime = 1000; $this->smarty->cache_lifetime = 1000;
$tpl = $this->smarty->createTemplate('helloworld.tpl', null, 'blar'); $tpl = $this->smarty->createTemplate('helloworld.tpl', null, 'blar');
$this->assertEquals($this->buildCachedPath($tpl, true, null, 'blar'), $tpl->cached->filepath); $this->assertEquals($this->buildCachedPath($tpl, true, null, 'blar'), $tpl->getCached()->filepath);
} }
/** /**
@@ -78,7 +78,7 @@ abstract class CacheResourceTestCommon extends PHPUnit_Smarty
$this->smarty->caching = true; $this->smarty->caching = true;
$this->smarty->cache_lifetime = 1000; $this->smarty->cache_lifetime = 1000;
$tpl = $this->smarty->createTemplate('helloworld.tpl', 'foo|bar', 'blar'); $tpl = $this->smarty->createTemplate('helloworld.tpl', 'foo|bar', 'blar');
$this->assertEquals($this->buildCachedPath($tpl, true, 'foo|bar', 'blar'), $tpl->cached->filepath); $this->assertEquals($this->buildCachedPath($tpl, true, 'foo|bar', 'blar'), $tpl->getCached()->filepath);
} }
/** /**
@@ -91,7 +91,7 @@ abstract class CacheResourceTestCommon extends PHPUnit_Smarty
$this->smarty->cache_lifetime = 1000; $this->smarty->cache_lifetime = 1000;
$tpl = $this->smarty->createTemplate('helloworld.tpl', 'foo|bar', 'blar'); $tpl = $this->smarty->createTemplate('helloworld.tpl', 'foo|bar', 'blar');
$tpl->writeCachedContent('hello world'); $tpl->writeCachedContent('hello world');
$this->assertEquals('hello world', $tpl->cached->handler->getCachedContent($tpl)); $this->assertEquals('hello world', $tpl->getCached()->handler->getCachedContent($tpl));
// Custom CacheResources may return -1 if they can't tell the number of deleted elements // Custom CacheResources may return -1 if they can't tell the number of deleted elements
//$this->assertEquals(-1, $this->smarty->clearAllCache()); //$this->assertEquals(-1, $this->smarty->clearAllCache());
} }
@@ -112,15 +112,15 @@ abstract class CacheResourceTestCommon extends PHPUnit_Smarty
$tpl3 = $this->smarty->createTemplate('helloworld2.tpl', 'foo|bar', 'blar'); $tpl3 = $this->smarty->createTemplate('helloworld2.tpl', 'foo|bar', 'blar');
$tpl3->writeCachedContent('hello world 3'); $tpl3->writeCachedContent('hello world 3');
// test cached content // test cached content
$this->assertEquals('hello world 1', $tpl->cached->handler->getCachedContent($tpl)); $this->assertEquals('hello world 1', $tpl->getCached()->handler->getCachedContent($tpl));
$this->assertEquals('hello world 2', $tpl->cached->handler->getCachedContent($tpl2)); $this->assertEquals('hello world 2', $tpl->getCached()->handler->getCachedContent($tpl2));
$this->assertEquals('hello world 3', $tpl->cached->handler->getCachedContent($tpl3)); $this->assertEquals('hello world 3', $tpl->getCached()->handler->getCachedContent($tpl3));
// test number of deleted caches // test number of deleted caches
$this->doClearCacheAssertion(2, $this->smarty->clearCache(null, 'foo|bar')); $this->doClearCacheAssertion(2, $this->smarty->clearCache(null, 'foo|bar'));
// test that caches are deleted properly // test that caches are deleted properly
$this->assertNull($tpl->cached->handler->getCachedContent($tpl)); $this->assertNull($tpl->getCached()->handler->getCachedContent($tpl));
$this->assertEquals('hello world 2', $tpl->cached->handler->getCachedContent($tpl2)); $this->assertEquals('hello world 2', $tpl->getCached()->handler->getCachedContent($tpl2));
$this->assertNull($tpl->cached->handler->getCachedContent($tpl3)); $this->assertNull($tpl->getCached()->handler->getCachedContent($tpl3));
} }
public function testClearCacheCacheIdCompileId2() public function testClearCacheCacheIdCompileId2()
@@ -136,15 +136,15 @@ abstract class CacheResourceTestCommon extends PHPUnit_Smarty
$tpl3 = $this->smarty->createTemplate('helloworld2.tpl', 'foo|bar', 'blar'); $tpl3 = $this->smarty->createTemplate('helloworld2.tpl', 'foo|bar', 'blar');
$tpl3->writeCachedContent('hello world'); $tpl3->writeCachedContent('hello world');
// test cached content // test cached content
$this->assertEquals('hello world', $tpl->cached->handler->getCachedContent($tpl)); $this->assertEquals('hello world', $tpl->getCached()->handler->getCachedContent($tpl));
$this->assertEquals('hello world', $tpl->cached->handler->getCachedContent($tpl2)); $this->assertEquals('hello world', $tpl->getCached()->handler->getCachedContent($tpl2));
$this->assertEquals('hello world', $tpl->cached->handler->getCachedContent($tpl3)); $this->assertEquals('hello world', $tpl->getCached()->handler->getCachedContent($tpl3));
// test number of deleted caches // test number of deleted caches
$this->doClearCacheAssertion(2, $this->smarty->clearCache('helloworld.tpl')); $this->doClearCacheAssertion(2, $this->smarty->clearCache('helloworld.tpl'));
// test that caches are deleted properly // test that caches are deleted properly
$this->assertNull($tpl->cached->handler->getCachedContent($tpl)); $this->assertNull($tpl->getCached()->handler->getCachedContent($tpl));
$this->assertNull($tpl->cached->handler->getCachedContent($tpl2)); $this->assertNull($tpl->getCached()->handler->getCachedContent($tpl2));
$this->assertEquals('hello world', $tpl->cached->handler->getCachedContent($tpl3)); $this->assertEquals('hello world', $tpl->getCached()->handler->getCachedContent($tpl3));
} }
public function testClearCacheCacheIdCompileId2Sub() public function testClearCacheCacheIdCompileId2Sub()
@@ -160,15 +160,15 @@ abstract class CacheResourceTestCommon extends PHPUnit_Smarty
$tpl3 = $this->smarty->createTemplate('helloworld2.tpl', 'foo|bar', 'blar'); $tpl3 = $this->smarty->createTemplate('helloworld2.tpl', 'foo|bar', 'blar');
$tpl3->writeCachedContent('hello world'); $tpl3->writeCachedContent('hello world');
// test cached content // test cached content
$this->assertEquals('hello world', $tpl->cached->handler->getCachedContent($tpl)); $this->assertEquals('hello world', $tpl->getCached()->handler->getCachedContent($tpl));
$this->assertEquals('hello world', $tpl->cached->handler->getCachedContent($tpl2)); $this->assertEquals('hello world', $tpl->getCached()->handler->getCachedContent($tpl2));
$this->assertEquals('hello world', $tpl->cached->handler->getCachedContent($tpl3)); $this->assertEquals('hello world', $tpl->getCached()->handler->getCachedContent($tpl3));
// test number of deleted caches // test number of deleted caches
$this->doClearCacheAssertion(2, $this->smarty->clearCache('helloworld.tpl')); $this->doClearCacheAssertion(2, $this->smarty->clearCache('helloworld.tpl'));
// test that caches are deleted properly // test that caches are deleted properly
$this->assertNull($tpl->cached->handler->getCachedContent($tpl)); $this->assertNull($tpl->getCached()->handler->getCachedContent($tpl));
$this->assertNull($tpl->cached->handler->getCachedContent($tpl2)); $this->assertNull($tpl->getCached()->handler->getCachedContent($tpl2));
$this->assertEquals('hello world', $tpl->cached->handler->getCachedContent($tpl3)); $this->assertEquals('hello world', $tpl->getCached()->handler->getCachedContent($tpl3));
} }
public function testClearCacheCacheIdCompileId3() public function testClearCacheCacheIdCompileId3()
@@ -184,15 +184,15 @@ abstract class CacheResourceTestCommon extends PHPUnit_Smarty
$tpl3 = $this->smarty->createTemplate('helloworld2.tpl', 'foo|bar', 'blar'); $tpl3 = $this->smarty->createTemplate('helloworld2.tpl', 'foo|bar', 'blar');
$tpl3->writeCachedContent('hello world'); $tpl3->writeCachedContent('hello world');
// test cached content // test cached content
$this->assertEquals('hello world', $tpl->cached->handler->getCachedContent($tpl)); $this->assertEquals('hello world', $tpl->getCached()->handler->getCachedContent($tpl));
$this->assertEquals('hello world', $tpl->cached->handler->getCachedContent($tpl2)); $this->assertEquals('hello world', $tpl->getCached()->handler->getCachedContent($tpl2));
$this->assertEquals('hello world', $tpl->cached->handler->getCachedContent($tpl3)); $this->assertEquals('hello world', $tpl->getCached()->handler->getCachedContent($tpl3));
// test number of deleted caches // test number of deleted caches
$this->doClearCacheAssertion(1, $this->smarty->clearCache('helloworld.tpl', null, 'blar2')); $this->doClearCacheAssertion(1, $this->smarty->clearCache('helloworld.tpl', null, 'blar2'));
// test that caches are deleted properly // test that caches are deleted properly
$this->assertEquals('hello world', $tpl->cached->handler->getCachedContent($tpl)); $this->assertEquals('hello world', $tpl->getCached()->handler->getCachedContent($tpl));
$this->assertNull($tpl->cached->handler->getCachedContent($tpl2)); $this->assertNull($tpl->getCached()->handler->getCachedContent($tpl2));
$this->assertEquals('hello world', $tpl->cached->handler->getCachedContent($tpl3)); $this->assertEquals('hello world', $tpl->getCached()->handler->getCachedContent($tpl3));
} }
public function testClearCacheCacheIdCompileId3Sub() public function testClearCacheCacheIdCompileId3Sub()
@@ -208,15 +208,15 @@ abstract class CacheResourceTestCommon extends PHPUnit_Smarty
$tpl3 = $this->smarty->createTemplate('helloworld2.tpl', 'foo|bar', 'blar'); $tpl3 = $this->smarty->createTemplate('helloworld2.tpl', 'foo|bar', 'blar');
$tpl3->writeCachedContent('hello world'); $tpl3->writeCachedContent('hello world');
// test cached content // test cached content
$this->assertEquals('hello world', $tpl->cached->handler->getCachedContent($tpl)); $this->assertEquals('hello world', $tpl->getCached()->handler->getCachedContent($tpl));
$this->assertEquals('hello world', $tpl->cached->handler->getCachedContent($tpl2)); $this->assertEquals('hello world', $tpl->getCached()->handler->getCachedContent($tpl2));
$this->assertEquals('hello world', $tpl->cached->handler->getCachedContent($tpl3)); $this->assertEquals('hello world', $tpl->getCached()->handler->getCachedContent($tpl3));
// test number of deleted caches // test number of deleted caches
$this->doClearCacheAssertion(1, $this->smarty->clearCache('helloworld.tpl', null, 'blar2')); $this->doClearCacheAssertion(1, $this->smarty->clearCache('helloworld.tpl', null, 'blar2'));
// test that caches are deleted properly // test that caches are deleted properly
$this->assertEquals('hello world', $tpl->cached->handler->getCachedContent($tpl)); $this->assertEquals('hello world', $tpl->getCached()->handler->getCachedContent($tpl));
$this->assertNull($tpl->cached->handler->getCachedContent($tpl2)); $this->assertNull($tpl->getCached()->handler->getCachedContent($tpl2));
$this->assertEquals('hello world', $tpl->cached->handler->getCachedContent($tpl3)); $this->assertEquals('hello world', $tpl->getCached()->handler->getCachedContent($tpl3));
} }
public function testClearCacheCacheIdCompileId4() public function testClearCacheCacheIdCompileId4()
@@ -232,15 +232,15 @@ abstract class CacheResourceTestCommon extends PHPUnit_Smarty
$tpl3 = $this->smarty->createTemplate('helloworld2.tpl', 'foo|bar', 'blar'); $tpl3 = $this->smarty->createTemplate('helloworld2.tpl', 'foo|bar', 'blar');
$tpl3->writeCachedContent('hello world'); $tpl3->writeCachedContent('hello world');
// test cached content // test cached content
$this->assertEquals('hello world', $tpl->cached->handler->getCachedContent($tpl)); $this->assertEquals('hello world', $tpl->getCached()->handler->getCachedContent($tpl));
$this->assertEquals('hello world', $tpl->cached->handler->getCachedContent($tpl2)); $this->assertEquals('hello world', $tpl->getCached()->handler->getCachedContent($tpl2));
$this->assertEquals('hello world', $tpl->cached->handler->getCachedContent($tpl3)); $this->assertEquals('hello world', $tpl->getCached()->handler->getCachedContent($tpl3));
// test number of deleted caches // test number of deleted caches
$this->doClearCacheAssertion(1, $this->smarty->clearCache('helloworld.tpl', null, 'blar2')); $this->doClearCacheAssertion(1, $this->smarty->clearCache('helloworld.tpl', null, 'blar2'));
// test that caches are deleted properly // test that caches are deleted properly
$this->assertEquals('hello world', $tpl->cached->handler->getCachedContent($tpl)); $this->assertEquals('hello world', $tpl->getCached()->handler->getCachedContent($tpl));
$this->assertNull($tpl->cached->handler->getCachedContent($tpl2)); $this->assertNull($tpl->getCached()->handler->getCachedContent($tpl2));
$this->assertEquals('hello world', $tpl->cached->handler->getCachedContent($tpl3)); $this->assertEquals('hello world', $tpl->getCached()->handler->getCachedContent($tpl3));
} }
public function testClearCacheCacheIdCompileId4Sub() public function testClearCacheCacheIdCompileId4Sub()
@@ -256,15 +256,15 @@ abstract class CacheResourceTestCommon extends PHPUnit_Smarty
$tpl3 = $this->smarty->createTemplate('helloworld2.tpl', 'foo|bar', 'blar'); $tpl3 = $this->smarty->createTemplate('helloworld2.tpl', 'foo|bar', 'blar');
$tpl3->writeCachedContent('hello world'); $tpl3->writeCachedContent('hello world');
// test cached content // test cached content
$this->assertEquals('hello world', $tpl->cached->handler->getCachedContent($tpl)); $this->assertEquals('hello world', $tpl->getCached()->handler->getCachedContent($tpl));
$this->assertEquals('hello world', $tpl->cached->handler->getCachedContent($tpl2)); $this->assertEquals('hello world', $tpl->getCached()->handler->getCachedContent($tpl2));
$this->assertEquals('hello world', $tpl->cached->handler->getCachedContent($tpl3)); $this->assertEquals('hello world', $tpl->getCached()->handler->getCachedContent($tpl3));
// test number of deleted caches // test number of deleted caches
$this->doClearCacheAssertion(1, $this->smarty->clearCache('helloworld.tpl', null, 'blar2')); $this->doClearCacheAssertion(1, $this->smarty->clearCache('helloworld.tpl', null, 'blar2'));
// test that caches are deleted properly // test that caches are deleted properly
$this->assertEquals('hello world', $tpl->cached->handler->getCachedContent($tpl)); $this->assertEquals('hello world', $tpl->getCached()->handler->getCachedContent($tpl));
$this->assertNull($tpl->cached->handler->getCachedContent($tpl2)); $this->assertNull($tpl->getCached()->handler->getCachedContent($tpl2));
$this->assertEquals('hello world', $tpl->cached->handler->getCachedContent($tpl3)); $this->assertEquals('hello world', $tpl->getCached()->handler->getCachedContent($tpl3));
} }
public function testClearCacheCacheIdCompileId5() public function testClearCacheCacheIdCompileId5()
@@ -280,15 +280,15 @@ abstract class CacheResourceTestCommon extends PHPUnit_Smarty
$tpl3 = $this->smarty->createTemplate('helloworld2.tpl', 'foo|bar', 'blar'); $tpl3 = $this->smarty->createTemplate('helloworld2.tpl', 'foo|bar', 'blar');
$tpl3->writeCachedContent('hello world'); $tpl3->writeCachedContent('hello world');
// test cached content // test cached content
$this->assertEquals('hello world', $tpl->cached->handler->getCachedContent($tpl)); $this->assertEquals('hello world', $tpl->getCached()->handler->getCachedContent($tpl));
$this->assertEquals('hello world', $tpl->cached->handler->getCachedContent($tpl2)); $this->assertEquals('hello world', $tpl->getCached()->handler->getCachedContent($tpl2));
$this->assertEquals('hello world', $tpl->cached->handler->getCachedContent($tpl3)); $this->assertEquals('hello world', $tpl->getCached()->handler->getCachedContent($tpl3));
// test number of deleted caches // test number of deleted caches
$this->doClearCacheAssertion(2, $this->smarty->clearCache(null, null, 'blar')); $this->doClearCacheAssertion(2, $this->smarty->clearCache(null, null, 'blar'));
// test that caches are deleted properly // test that caches are deleted properly
$this->assertNull($tpl->cached->handler->getCachedContent($tpl)); $this->assertNull($tpl->getCached()->handler->getCachedContent($tpl));
$this->assertEquals('hello world', $tpl->cached->handler->getCachedContent($tpl2)); $this->assertEquals('hello world', $tpl->getCached()->handler->getCachedContent($tpl2));
$this->assertNull($tpl->cached->handler->getCachedContent($tpl3)); $this->assertNull($tpl->getCached()->handler->getCachedContent($tpl3));
} }
public function testClearCacheCacheIdCompileId5Sub() public function testClearCacheCacheIdCompileId5Sub()
@@ -304,15 +304,15 @@ abstract class CacheResourceTestCommon extends PHPUnit_Smarty
$tpl3 = $this->smarty->createTemplate('helloworld2.tpl', 'foo|bar', 'blar'); $tpl3 = $this->smarty->createTemplate('helloworld2.tpl', 'foo|bar', 'blar');
$tpl3->writeCachedContent('hello world'); $tpl3->writeCachedContent('hello world');
// test cached content // test cached content
$this->assertEquals('hello world', $tpl->cached->handler->getCachedContent($tpl)); $this->assertEquals('hello world', $tpl->getCached()->handler->getCachedContent($tpl));
$this->assertEquals('hello world', $tpl->cached->handler->getCachedContent($tpl2)); $this->assertEquals('hello world', $tpl->getCached()->handler->getCachedContent($tpl2));
$this->assertEquals('hello world', $tpl->cached->handler->getCachedContent($tpl3)); $this->assertEquals('hello world', $tpl->getCached()->handler->getCachedContent($tpl3));
// test number of deleted caches // test number of deleted caches
$this->doClearCacheAssertion(2, $this->smarty->clearCache(null, null, 'blar')); $this->doClearCacheAssertion(2, $this->smarty->clearCache(null, null, 'blar'));
// test that caches are deleted properly // test that caches are deleted properly
$this->assertNull($tpl->cached->handler->getCachedContent($tpl)); $this->assertNull($tpl->getCached()->handler->getCachedContent($tpl));
$this->assertEquals('hello world', $tpl->cached->handler->getCachedContent($tpl2)); $this->assertEquals('hello world', $tpl->getCached()->handler->getCachedContent($tpl2));
$this->assertNull($tpl->cached->handler->getCachedContent($tpl3)); $this->assertNull($tpl->getCached()->handler->getCachedContent($tpl3));
} }
public function testClearCacheCacheFile() public function testClearCacheCacheFile()
@@ -330,17 +330,17 @@ abstract class CacheResourceTestCommon extends PHPUnit_Smarty
$tpl4 = $this->smarty->createTemplate('helloworld2.tpl'); $tpl4 = $this->smarty->createTemplate('helloworld2.tpl');
$tpl4->writeCachedContent('hello world'); $tpl4->writeCachedContent('hello world');
// test cached content // test cached content
$this->assertEquals('hello world', $tpl->cached->handler->getCachedContent($tpl)); $this->assertEquals('hello world', $tpl->getCached()->handler->getCachedContent($tpl));
$this->assertEquals('hello world', $tpl->cached->handler->getCachedContent($tpl2)); $this->assertEquals('hello world', $tpl->getCached()->handler->getCachedContent($tpl2));
$this->assertEquals('hello world', $tpl->cached->handler->getCachedContent($tpl3)); $this->assertEquals('hello world', $tpl->getCached()->handler->getCachedContent($tpl3));
$this->assertEquals('hello world', $tpl->cached->handler->getCachedContent($tpl4)); $this->assertEquals('hello world', $tpl->getCached()->handler->getCachedContent($tpl4));
// test number of deleted caches // test number of deleted caches
$this->doClearCacheAssertion(3, $this->smarty->clearCache('helloworld.tpl')); $this->doClearCacheAssertion(3, $this->smarty->clearCache('helloworld.tpl'));
// test that caches are deleted properly // test that caches are deleted properly
$this->assertNull($tpl->cached->handler->getCachedContent($tpl)); $this->assertNull($tpl->getCached()->handler->getCachedContent($tpl));
$this->assertNull($tpl->cached->handler->getCachedContent($tpl2)); $this->assertNull($tpl->getCached()->handler->getCachedContent($tpl2));
$this->assertNull($tpl->cached->handler->getCachedContent($tpl3)); $this->assertNull($tpl->getCached()->handler->getCachedContent($tpl3));
$this->assertEquals('hello world', $tpl->cached->handler->getCachedContent($tpl4)); $this->assertEquals('hello world', $tpl->getCached()->handler->getCachedContent($tpl4));
} }
/** /**
@@ -359,19 +359,19 @@ abstract class CacheResourceTestCommon extends PHPUnit_Smarty
$tpl3 = $this->smarty->createTemplate('helloworld.tpl', 'buh|blar'); $tpl3 = $this->smarty->createTemplate('helloworld.tpl', 'buh|blar');
$tpl3->writeCachedContent('hello world'); $tpl3->writeCachedContent('hello world');
// test cached content // test cached content
$this->assertEquals('hello world', $tpl->cached->handler->getCachedContent($tpl)); $this->assertEquals('hello world', $tpl->getCached()->handler->getCachedContent($tpl));
$this->assertEquals('hello world', $tpl->cached->handler->getCachedContent($tpl2)); $this->assertEquals('hello world', $tpl->getCached()->handler->getCachedContent($tpl2));
$this->assertEquals('hello world', $tpl->cached->handler->getCachedContent($tpl3)); $this->assertEquals('hello world', $tpl->getCached()->handler->getCachedContent($tpl3));
sleep(10); sleep(10);
$tpl4 = $this->smarty->createTemplate('helloworld2.tpl'); $tpl4 = $this->smarty->createTemplate('helloworld2.tpl');
$tpl4->writeCachedContent('hello world'); $tpl4->writeCachedContent('hello world');
// test number of deleted caches // test number of deleted caches
$this->doClearCacheAssertion(3,$this->smarty->clearAllCache(5)); $this->doClearCacheAssertion(3,$this->smarty->clearAllCache(5));
// test that caches are deleted properly // test that caches are deleted properly
$this->assertNull($tpl->cached->handler->getCachedContent($tpl)); $this->assertNull($tpl->getCached()->handler->getCachedContent($tpl));
$this->assertNull($tpl->cached->handler->getCachedContent($tpl2)); $this->assertNull($tpl->getCached()->handler->getCachedContent($tpl2));
$this->assertNull($tpl->cached->handler->getCachedContent($tpl3)); $this->assertNull($tpl->getCached()->handler->getCachedContent($tpl3));
$this->assertEquals('hello world', $tpl->cached->handler->getCachedContent($tpl4)); $this->assertEquals('hello world', $tpl->getCached()->handler->getCachedContent($tpl4));
} }
public function testClearCacheCacheFileSub() public function testClearCacheCacheFileSub()
@@ -389,17 +389,17 @@ abstract class CacheResourceTestCommon extends PHPUnit_Smarty
$tpl4 = $this->smarty->createTemplate('helloworld2.tpl'); $tpl4 = $this->smarty->createTemplate('helloworld2.tpl');
$tpl4->writeCachedContent('hello world'); $tpl4->writeCachedContent('hello world');
// test cached content // test cached content
$this->assertEquals('hello world', $tpl->cached->handler->getCachedContent($tpl)); $this->assertEquals('hello world', $tpl->getCached()->handler->getCachedContent($tpl));
$this->assertEquals('hello world', $tpl->cached->handler->getCachedContent($tpl2)); $this->assertEquals('hello world', $tpl->getCached()->handler->getCachedContent($tpl2));
$this->assertEquals('hello world', $tpl->cached->handler->getCachedContent($tpl3)); $this->assertEquals('hello world', $tpl->getCached()->handler->getCachedContent($tpl3));
$this->assertEquals('hello world', $tpl->cached->handler->getCachedContent($tpl4)); $this->assertEquals('hello world', $tpl->getCached()->handler->getCachedContent($tpl4));
// test number of deleted caches // test number of deleted caches
$this->doClearCacheAssertion(3, $this->smarty->clearCache('helloworld.tpl')); $this->doClearCacheAssertion(3, $this->smarty->clearCache('helloworld.tpl'));
// test that caches are deleted properly // test that caches are deleted properly
$this->assertNull($tpl->cached->handler->getCachedContent($tpl)); $this->assertNull($tpl->getCached()->handler->getCachedContent($tpl));
$this->assertNull($tpl->cached->handler->getCachedContent($tpl2)); $this->assertNull($tpl->getCached()->handler->getCachedContent($tpl2));
$this->assertNull($tpl->cached->handler->getCachedContent($tpl3)); $this->assertNull($tpl->getCached()->handler->getCachedContent($tpl3));
$this->assertEquals('hello world', $tpl->cached->handler->getCachedContent($tpl4)); $this->assertEquals('hello world', $tpl->getCached()->handler->getCachedContent($tpl4));
} }
/** /**
* Test caching * Test caching
@@ -430,9 +430,9 @@ abstract class CacheResourceTestCommon extends PHPUnit_Smarty
$this->assertEquals($t,$tpl->source->getTimeStamp(), $testName . ' - source touch'); $this->assertEquals($t,$tpl->source->getTimeStamp(), $testName . ' - source touch');
} }
if ($lockTime) { if ($lockTime) {
$tpl->cached->handler->acquireLock($this->smarty, $tpl->cached); $tpl->getCached()->handler->acquireLock($this->smarty, $tpl->getCached());
$tpl->cached->handler->lockTime = $lockTime; $tpl->getCached()->handler->lockTime = $lockTime;
$tpl->cached->is_locked = false; $tpl->getCached()->is_locked = false;
} }
$start = time(); $start = time();
if (isset($isCached)) { if (isset($isCached)) {
@@ -440,9 +440,9 @@ abstract class CacheResourceTestCommon extends PHPUnit_Smarty
if ($lockTimeout) { if ($lockTimeout) {
$time = time() - $start; $time = time() - $start;
$this->assertTrue($time >= $tmin && $time <= $tmax, $testName . ' - isCached() - lock time'); $this->assertTrue($time >= $tmin && $time <= $tmax, $testName . ' - isCached() - lock time');
$this->assertEquals(!$isCached, $tpl->cached->handler->hasLock($this->smarty, $tpl->cached), $testName . ' - isCached() - lock status'); $this->assertEquals(!$isCached, $tpl->getCached()->handler->hasLock($this->smarty, $tpl->getCached()), $testName . ' - isCached() - lock status');
} else { } else {
$this->assertFalse($tpl->cached->handler->hasLock($this->smarty, $tpl->cached), $testName . ' - isCached() - unexpected lock'); $this->assertFalse($tpl->getCached()->handler->hasLock($this->smarty, $tpl->getCached()), $testName . ' - isCached() - unexpected lock');
} }
} }
$this->assertEquals("cache resource test:{$testNumber} compiled:{$compileTestNumber} rendered:{$renderTestNumber}", $this->smarty->fetch($tpl), $testName . ' - fetch() failure'); $this->assertEquals("cache resource test:{$testNumber} compiled:{$compileTestNumber} rendered:{$renderTestNumber}", $this->smarty->fetch($tpl), $testName . ' - fetch() failure');
@@ -450,7 +450,7 @@ abstract class CacheResourceTestCommon extends PHPUnit_Smarty
$time = time() - $start; $time = time() - $start;
$this->assertTrue($time >= $tmin && $time <= $tmax, $testName . ' - fetch() - lock time'); $this->assertTrue($time >= $tmin && $time <= $tmax, $testName . ' - fetch() - lock time');
} }
$this->assertFalse($tpl->cached->handler->hasLock($this->smarty, $tpl->cached, $testName . ' - lock not removed')); $this->assertFalse($tpl->getCached()->handler->hasLock($this->smarty, $tpl->getCached(), $testName . ' - lock not removed'));
} }
public function data(){ public function data(){

View File

@@ -27,19 +27,6 @@ class Smarty_Resource_AmbiguousPlugin extends FilePlugin
$this->segment = $segment; $this->segment = $segment;
} }
/**
* modify resource_name according to resource handlers specifications
*
* @param Smarty $smarty Smarty instance
* @param string $resource_name resource_name to make unique
*
* @return string unique resource name
*/
public function buildUniqueResourceName(Smarty $smarty, $resource_name, $isConfig = false)
{
return get_class($this) . '#' . $this->segment . '#' . $resource_name;
}
/** /**
* populate Source Object with meta data from Resource * populate Source Object with meta data from Resource
* *

View File

@@ -56,6 +56,7 @@ if (MysqlResourceEnable == true) {
/** /**
* test must compile * test must compile
* @group slow
*/ */
public function testMustCompile2() public function testMustCompile2()
{ {
@@ -97,7 +98,7 @@ if (MysqlResourceEnable == true) {
{ {
//$this->smarty->addPluginsDir("./PHPunitplugins/"); //$this->smarty->addPluginsDir("./PHPunitplugins/");
$tpl = $this->smarty->createTemplate('mysqltest:test.tpl'); $tpl = $this->smarty->createTemplate('mysqltest:test.tpl');
$this->assertEquals($this->buildCompiledPath($tpl, false, false, null, 'test.tpl', 'mysqltest', $this->smarty->getTemplateDir(0)), $tpl->compiled->filepath); $this->assertEquals($this->buildCompiledPath($tpl, false, false, null, 'test.tpl', 'mysqltest', $this->smarty->getTemplateDir(0)), $tpl->getCompiled()->filepath);
} }
public function testResourcePluginMysqlCompiledFilepathCache() public function testResourcePluginMysqlCompiledFilepathCache()
@@ -107,7 +108,7 @@ if (MysqlResourceEnable == true) {
$this->smarty->setForceCompile(true); $this->smarty->setForceCompile(true);
$this->smarty->fetch('mysqltest:test.tpl'); $this->smarty->fetch('mysqltest:test.tpl');
$tpl = $this->smarty->createTemplate('mysqltest:test.tpl'); $tpl = $this->smarty->createTemplate('mysqltest:test.tpl');
$this->assertEquals($this->buildCompiledPath($tpl, false, true, null, 'test.tpl', 'mysqltest', $this->smarty->getTemplateDir(0)), $tpl->compiled->filepath); $this->assertEquals($this->buildCompiledPath($tpl, false, true, null, 'test.tpl', 'mysqltest', $this->smarty->getTemplateDir(0)), $tpl->getCompiled()->filepath);
$this->smarty->caching = false; $this->smarty->caching = false;
} }

View File

@@ -108,7 +108,7 @@ class EvalResourceTest extends PHPUnit_Smarty
public function testGetCompiledFilepath() public function testGetCompiledFilepath()
{ {
$tpl = $this->smarty->createTemplate('eval:hello world'); $tpl = $this->smarty->createTemplate('eval:hello world');
$this->assertFalse($tpl->compiled->filepath); $this->assertNull($tpl->getCompiled()->filepath);
} }
/** /**
@@ -117,7 +117,7 @@ class EvalResourceTest extends PHPUnit_Smarty
public function testGetCompiledTimestamp() public function testGetCompiledTimestamp()
{ {
$tpl = $this->smarty->createTemplate('eval:hello world'); $tpl = $this->smarty->createTemplate('eval:hello world');
$this->assertFalse($tpl->compiled->getTimeStamp()); $this->assertFalse($tpl->getCompiled()->getTimeStamp());
} }
/** /**

View File

@@ -146,6 +146,7 @@ class ExtendsResourceTest extends PHPUnit_Smarty
/** /**
* test grandchild/child/parent dependency test3 * test grandchild/child/parent dependency test3
* @group slow
*/ */
public function testCompileBlockGrandChildMustCompile_021_3() public function testCompileBlockGrandChildMustCompile_021_3()
{ {

View File

@@ -106,7 +106,7 @@ class FileResourceTest extends PHPUnit_Smarty
{ {
$tpl = $this->smarty->createTemplate('helloworld.tpl'); $tpl = $this->smarty->createTemplate('helloworld.tpl');
$this->assertEquals($this->buildCompiledPath($tpl, false, false, null, 'helloworld.tpl', 'file', $this->smarty->getTemplateDir(0)) $this->assertEquals($this->buildCompiledPath($tpl, false, false, null, 'helloworld.tpl', 'file', $this->smarty->getTemplateDir(0))
, $tpl->compiled->filepath , $tpl->getCompiled()->filepath
); );
} }
@@ -117,8 +117,8 @@ class FileResourceTest extends PHPUnit_Smarty
{ {
$tpl = $this->smarty->createTemplate('helloworld.tpl'); $tpl = $this->smarty->createTemplate('helloworld.tpl');
// create dummy compiled file // create dummy compiled file
file_put_contents($tpl->compiled->filepath, '<?php ?>'); file_put_contents($tpl->getCompiled()->filepath, '<?php ?>');
touch($tpl->compiled->filepath, $tpl->source->getTimeStamp()); touch($tpl->getCompiled()->filepath, $tpl->source->getTimeStamp());
} }
/** /**
@@ -127,9 +127,9 @@ class FileResourceTest extends PHPUnit_Smarty
public function testGetCompiledTimestamp() public function testGetCompiledTimestamp()
{ {
$tpl = $this->smarty->createTemplate('helloworld.tpl'); $tpl = $this->smarty->createTemplate('helloworld.tpl');
$this->assertTrue(is_integer($tpl->compiled->getTimeStamp())); $this->assertTrue(is_integer($tpl->getCompiled()->getTimeStamp()));
$this->assertEquals(10, strlen($tpl->compiled->getTimeStamp())); $this->assertEquals(10, strlen($tpl->getCompiled()->getTimeStamp()));
$this->assertEquals($tpl->compiled->getTimeStamp(), $tpl->source->getTimeStamp()); $this->assertEquals($tpl->getCompiled()->getTimeStamp(), $tpl->source->getTimeStamp());
} }
public function testMustCompileExisting() public function testMustCompileExisting()
@@ -146,17 +146,17 @@ class FileResourceTest extends PHPUnit_Smarty
} }
/** /**
* @doesNotPerformAssertions * @group slow
*/ */
public function testMustCompileTouchedSourcePrepare() public function testMustCompileTouchedSource()
{ {
// touch to prepare next test // touch to prepare next test
sleep(2); sleep(2);
$tpl = $this->smarty->createTemplate('helloworld.tpl'); $tpl = $this->smarty->createTemplate('helloworld.tpl');
touch($tpl->source->filepath); touch($tpl->source->filepath);
}
public function testMustCompileTouchedSource() $this->setUp();
{
$tpl = $this->smarty->createTemplate('helloworld.tpl'); $tpl = $this->smarty->createTemplate('helloworld.tpl');
$this->assertTrue($tpl->mustCompile()); $this->assertTrue($tpl->mustCompile());
// clean up for next tests // clean up for next tests
@@ -167,7 +167,7 @@ class FileResourceTest extends PHPUnit_Smarty
{ {
$tpl = $this->smarty->createTemplate('helloworld.tpl'); $tpl = $this->smarty->createTemplate('helloworld.tpl');
$tpl->compileTemplateSource(); $tpl->compileTemplateSource();
$this->assertTrue(file_exists($tpl->compiled->filepath)); $this->assertTrue(file_exists($tpl->getCompiled()->filepath));
} }
public function testGetCachedFilepath() public function testGetCachedFilepath()
@@ -176,7 +176,7 @@ class FileResourceTest extends PHPUnit_Smarty
$this->smarty->cache_lifetime = 1000; $this->smarty->cache_lifetime = 1000;
$tpl = $this->smarty->createTemplate('helloworld.tpl'); $tpl = $this->smarty->createTemplate('helloworld.tpl');
$this->assertEquals($this->buildCachedPath($tpl, false, null, null, 'helloworld.tpl', 'file', $this->smarty->getTemplateDir(0), 'file') $this->assertEquals($this->buildCachedPath($tpl, false, null, null, 'helloworld.tpl', 'file', $this->smarty->getTemplateDir(0), 'file')
, $tpl->cached->filepath , $tpl->getCached()->filepath
); );
} }
@@ -188,8 +188,8 @@ class FileResourceTest extends PHPUnit_Smarty
$this->smarty->caching = true; $this->smarty->caching = true;
$this->smarty->cache_lifetime = 1000; $this->smarty->cache_lifetime = 1000;
$tpl = $this->smarty->createTemplate('helloworld.tpl'); $tpl = $this->smarty->createTemplate('helloworld.tpl');
$this->assertTrue(is_integer($tpl->cached->timestamp)); $this->assertTrue(is_integer($tpl->getCached()->timestamp));
$this->assertEquals(10, strlen($tpl->cached->timestamp)); $this->assertEquals(10, strlen($tpl->getCached()->timestamp));
} }

View File

@@ -101,7 +101,7 @@ class FileResourceIndexedTest extends PHPUnit_Smarty
public function testGetCompiledFilepath() public function testGetCompiledFilepath()
{ {
$tpl = $this->smarty->createTemplate('[foo]dirname.tpl'); $tpl = $this->smarty->createTemplate('[foo]dirname.tpl');
$this->assertEquals($this->buildCompiledPath($tpl, false, false, null, 'dirname.tpl', 'file', $this->smarty->getTemplateDir('foo')), $tpl->compiled->filepath); $this->assertEquals($this->buildCompiledPath($tpl, false, false, null, 'dirname.tpl', 'file', $this->smarty->getTemplateDir('foo')), $tpl->getCompiled()->filepath);
} }
public function testGetCachedFilepath() public function testGetCachedFilepath()
@@ -110,6 +110,6 @@ class FileResourceIndexedTest extends PHPUnit_Smarty
$this->smarty->cache_lifetime = 1000; $this->smarty->cache_lifetime = 1000;
$tpl = $this->smarty->createTemplate('[foo]dirname.tpl'); $tpl = $this->smarty->createTemplate('[foo]dirname.tpl');
$this->assertEquals($this->buildCachedPath($tpl, false, null, null, 'dirname.tpl', 'file', $this->smarty->getTemplateDir('foo')) $this->assertEquals($this->buildCachedPath($tpl, false, null, null, 'dirname.tpl', 'file', $this->smarty->getTemplateDir('foo'))
, $tpl->cached->filepath); , $tpl->getCached()->filepath);
} }
} }

View File

@@ -62,7 +62,7 @@ class ResourcePluginTest extends PHPUnit_Smarty
$tpl = $this->smarty->createTemplate('db2:test.tpl'); $tpl = $this->smarty->createTemplate('db2:test.tpl');
$expected = realpath('./templates_c/' . sha1('db2:test.tpl') . '.db2.test.tpl.php'); $expected = realpath('./templates_c/' . sha1('db2:test.tpl') . '.db2.test.tpl.php');
$this->assertFalse(!!$expected); $this->assertFalse(!!$expected);
$this->assertFalse($tpl->compiled->filepath); $this->assertNull($tpl->getCompiled()->filepath);
} }
/** /**

View File

@@ -97,7 +97,7 @@ class StreamResourceTest extends PHPUnit_Smarty
public function testGetCompiledFilepath() public function testGetCompiledFilepath()
{ {
$tpl = $this->smarty->createTemplate('global:mytest'); $tpl = $this->smarty->createTemplate('global:mytest');
$this->assertFalse($tpl->compiled->filepath); $this->assertNull($tpl->getCompiled()->filepath);
} }
/** /**
@@ -106,7 +106,7 @@ class StreamResourceTest extends PHPUnit_Smarty
public function testGetCompiledTimestamp() public function testGetCompiledTimestamp()
{ {
$tpl = $this->smarty->createTemplate('global:mytest'); $tpl = $this->smarty->createTemplate('global:mytest');
$this->assertFalse($tpl->compiled->getTimeStamp()); $this->assertFalse($tpl->getCompiled()->getTimeStamp());
} }
/** /**

View File

@@ -110,7 +110,7 @@ class StringResourceTest extends PHPUnit_Smarty
public function testGetCompiledFilepath() public function testGetCompiledFilepath()
{ {
$tpl = $this->smarty->createTemplate('string:hello world'); $tpl = $this->smarty->createTemplate('string:hello world');
$this->assertEquals($this->buildCompiledPath($tpl, false, false, null, 'hello world', 'string', $this->smarty->getTemplateDir(0)), $tpl->compiled->filepath); $this->assertEquals($this->buildCompiledPath($tpl, false, false, null, 'hello world', 'string', $this->smarty->getTemplateDir(0)), $tpl->getCompiled()->filepath);
} }
/** /**
@@ -119,7 +119,7 @@ class StringResourceTest extends PHPUnit_Smarty
public function testGetCompiledTimestamp() public function testGetCompiledTimestamp()
{ {
$tpl = $this->smarty->createTemplate('string:hello world'); $tpl = $this->smarty->createTemplate('string:hello world');
$this->assertFalse($tpl->compiled->getTimeStamp()); $this->assertFalse($tpl->getCompiled()->getTimeStamp());
} }
/** /**
@@ -137,7 +137,7 @@ class StringResourceTest extends PHPUnit_Smarty
public function testGetCachedTimestamp() public function testGetCachedTimestamp()
{ {
$tpl = $this->smarty->createTemplate('string:hello world'); $tpl = $this->smarty->createTemplate('string:hello world');
$this->assertFalse($tpl->cached->timestamp); $this->assertFalse($tpl->getCached()->timestamp);
} }
/** /**

View File

@@ -68,7 +68,7 @@ class ClearCompiledTest extends PHPUnit_Smarty
foreach ($compile_ids as $compile_id) { foreach ($compile_ids as $compile_id) {
$tpl = $this->getSmartyObj()->createTemplate($template, null, $compile_id); $tpl = $this->getSmartyObj()->createTemplate($template, null, $compile_id);
$tpl->fetch(); $tpl->fetch();
$this->_files[$template . '#' . $compile_id] = substr($tpl->compiled->filepath, $directory_length); $this->_files[$template . '#' . $compile_id] = substr($tpl->getCompiled()->filepath, $directory_length);
} }
} }

View File

@@ -608,9 +608,6 @@ class CompileBlockExtendsTest extends PHPUnit_Smarty
/** /**
* test grandchild/child/parent dependency test2 * test grandchild/child/parent dependency test2
*
*
*
* @group slow * @group slow
*/ */
public function testCompileBlockGrandChildMustCompile_021_2() public function testCompileBlockGrandChildMustCompile_021_2()
@@ -642,9 +639,6 @@ class CompileBlockExtendsTest extends PHPUnit_Smarty
/** /**
* test grandchild/child/parent dependency test3 * test grandchild/child/parent dependency test3
*
*
*
* @group slow * @group slow
*/ */
public function testCompileBlockGrandChildMustCompile_021_3() public function testCompileBlockGrandChildMustCompile_021_3()
@@ -689,9 +683,6 @@ class CompileBlockExtendsTest extends PHPUnit_Smarty
/** /**
* test grandchild/child/parent dependency test4 * test grandchild/child/parent dependency test4
*
*
*
* @group slow * @group slow
*/ */
public function testCompileBlockGrandChildMustCompile_021_4() public function testCompileBlockGrandChildMustCompile_021_4()

View File

@@ -97,7 +97,7 @@ class ScopeTest extends PHPUnit_Smarty
$i++, $i++,
], ],
[ [
'{append var=foo value=\'newvar\' scope=smarty}', true, '{append var=foo value=\'newvar\' scope=global}', true,
'#testAppendScope_3.tpl:$foo =\'data\'' . '#testAppendScope_3.tpl:$foo =\'data\'' .
'#scope_include.tpl:$foo =\'data\'' . '#scope_include.tpl:$foo =\'data\'' .
'#scope_tag.tpl:$foo =\'data\'' . '#scope_tag.tpl:$foo =\'data\'' .
@@ -118,10 +118,10 @@ class ScopeTest extends PHPUnit_Smarty
{ {
$file = "testAssignScope_{$testNumber}.tpl"; $file = "testAssignScope_{$testNumber}.tpl";
$this->makeTemplateFile($file, $code . '{checkvar var=foo}'); $this->makeTemplateFile($file, $code . '{checkvar var=foo}');
$this->smarty->assignGlobal('file', $file);
$this->smarty->assign('foo', 'smarty'); $this->smarty->assign('foo', 'global');
$this->smarty->assignGlobal('foo', 'global');
$data = $this->smarty->createData($useSmarty ? $this->smarty : null); $data = $this->smarty->createData($useSmarty ? $this->smarty : null);
$data->assign('file', $file);
$data->assign('foo', 'data'); $data->assign('foo', 'data');
$tpl = $this->smarty->createTemplate('scope_tag.tpl', $data); $tpl = $this->smarty->createTemplate('scope_tag.tpl', $data);
@@ -141,32 +141,41 @@ class ScopeTest extends PHPUnit_Smarty
* result * result
* test name * test name
*/ */
return array(array('{$foo = \'newvar\'}', true, return [
':$foo =\'newvar\'#scope_include.tpl:$foo =\'data\'#scope_tag.tpl:$foo =\'data\'#data:$foo =\'data\'#Smarty:$foo =\'smarty\'#global:$foo =\'global\'', ['{$foo = \'newvar\'}', true,
'', $i ++,), array('{assign var=foo value=\'newvar\'}', true, ':$foo =\'newvar\'#scope_include.tpl:$foo =\'data\'#scope_tag.tpl:$foo =\'data\'#data:$foo =\'data\'#global:$foo =\'global\'',
':$foo =\'newvar\'#scope_include.tpl:$foo =\'data\'#scope_tag.tpl:$foo =\'data\'#data:$foo =\'data\'#Smarty:$foo =\'smarty\'#global:$foo =\'global\'', 'default', $i++,],
'', $i ++,), array('{$foo = \'newvar\' scope=local}', true, ['{assign var=foo value=\'newvar\'}', true,
':$foo =\'newvar\'#scope_include.tpl:$foo =\'data\'#scope_tag.tpl:$foo =\'data\'#data:$foo =\'data\'#Smarty:$foo =\'smarty\'#global:$foo =\'global\'', ':$foo =\'newvar\'#scope_include.tpl:$foo =\'data\'#scope_tag.tpl:$foo =\'data\'#data:$foo =\'data\'#global:$foo =\'global\'',
'', $i ++,), 'assign tag', $i++,],
array('{assign var=foo value=\'newvar\' scope=local}', true, ['{$foo = \'newvar\' scope=local}', true,
':$foo =\'newvar\'#scope_include.tpl:$foo =\'data\'#scope_tag.tpl:$foo =\'data\'#data:$foo =\'data\'#Smarty:$foo =\'smarty\'#global:$foo =\'global\'', ':$foo =\'newvar\'#scope_include.tpl:$foo =\'data\'#scope_tag.tpl:$foo =\'data\'#data:$foo =\'data\'#global:$foo =\'global\'',
'', $i ++,), array('{$foo = \'newvar\' scope=parent}', true, 'local', $i++,],
':$foo =\'newvar\'#scope_include.tpl:$foo =\'newvar\'#scope_tag.tpl:$foo =\'data\'#data:$foo =\'data\'#Smarty:$foo =\'smarty\'#global:$foo =\'global\'', ['{assign var=foo value=\'newvar\' scope=local}', true,
'', $i ++,), array('{assign var=foo value=\'newvar\' scope=parent}', true, ':$foo =\'newvar\'#scope_include.tpl:$foo =\'data\'#scope_tag.tpl:$foo =\'data\'#data:$foo =\'data\'#global:$foo =\'global\'',
':$foo =\'newvar\'#scope_include.tpl:$foo =\'newvar\'#scope_tag.tpl:$foo =\'data\'#data:$foo =\'data\'#Smarty:$foo =\'smarty\'#global:$foo =\'global\'', 'assign tag local', $i++,],
'', $i ++,), ['{$foo = \'newvar\' scope=parent}', true,
array('{$foo = \'newvar\' scope=tpl_root}', true, ':$foo =\'newvar\'#scope_include.tpl:$foo =\'newvar\'#scope_tag.tpl:$foo =\'data\'#data:$foo =\'data\'#global:$foo =\'global\'',
':$foo =\'newvar\'#scope_include.tpl:$foo =\'newvar\'#scope_tag.tpl:$foo =\'newvar\'#data:$foo =\'data\'#Smarty:$foo =\'smarty\'#global:$foo =\'global\'', 'parent', $i++,],
'', $i ++,), array('{$foo = \'newvar\' scope=global}', true, ['{assign var=foo value=\'newvar\' scope=parent}', true,
':$foo =\'newvar\'#scope_include.tpl:$foo =\'newvar\'#scope_tag.tpl:$foo =\'newvar\'#data:$foo =\'data\'#Smarty:$foo =\'smarty\'#global:$foo =\'newvar\'', ':$foo =\'newvar\'#scope_include.tpl:$foo =\'newvar\'#scope_tag.tpl:$foo =\'data\'#data:$foo =\'data\'#global:$foo =\'global\'',
'', $i ++,), array('{$foo = \'newvar\' scope=root}', true, 'assign tag parent', $i++,],
':$foo =\'newvar\'#scope_include.tpl:$foo =\'newvar\'#scope_tag.tpl:$foo =\'newvar\'#data:$foo =\'newvar\'#Smarty:$foo =\'smarty\'#global:$foo =\'global\'', ['{$foo = \'newvar\' scope=tpl_root}', true,
'', $i ++,), ':$foo =\'newvar\'#scope_include.tpl:$foo =\'newvar\'#scope_tag.tpl:$foo =\'newvar\'#data:$foo =\'data\'#global:$foo =\'global\'',
array('{$foo = \'newvar\' scope=root}', false, 'tpl_root', $i++,],
':$foo =\'newvar\'#scope_include.tpl:$foo =\'newvar\'#scope_tag.tpl:$foo =\'newvar\'#data:$foo =\'newvar\'#Smarty:$foo =\'smarty\'#global:$foo =\'global\'', ['{$foo = \'newvar\' scope=global}', true,
'no smarty', $i ++,), array('{$foo = \'newvar\' scope=smarty}', false, ':$foo =\'data\'#scope_include.tpl:$foo =\'data\'#scope_tag.tpl:$foo =\'data\'#data:$foo =\'data\'#global:$foo =\'newvar\'',
':$foo =\'newvar\'#scope_include.tpl:$foo =\'newvar\'#scope_tag.tpl:$foo =\'newvar\'#data:$foo =\'data\'#Smarty:$foo =\'newvar\'#global:$foo =\'global\'', 'global', $i++,],
'no smarty', $i ++,),); ['{$foo = \'newvar\' scope=root}', true,
':$foo =\'newvar\'#scope_include.tpl:$foo =\'newvar\'#scope_tag.tpl:$foo =\'newvar\'#data:$foo =\'newvar\'#global:$foo =\'global\'',
'root', $i++,],
['{$foo = \'newvar\' scope=root}', false,
':$foo =\'newvar\'#scope_include.tpl:$foo =\'newvar\'#scope_tag.tpl:$foo =\'newvar\'#data:$foo =\'newvar\'#global:$foo =\'global\'',
'root, no smarty', $i++,],
['{$foo = \'newvar\' scope=global}', false,
':$foo =\'data\'#scope_include.tpl:$foo =\'data\'#scope_tag.tpl:$foo =\'data\'#data:$foo =\'data\'#global:$foo =\'newvar\'',
'global, no smarty', $i++,],
];
} }
/** /**
@@ -196,13 +205,13 @@ class ScopeTest extends PHPUnit_Smarty
* result * result
*/ */
return array(array('b1', 'test_scope_assignbar.tpl', return array(array('b1', 'test_scope_assignbar.tpl',
'#test_scope_assignbar.tpl:$foo =\'b1\'#Smarty:$foo =\'smarty\'#global:$foo =\'b1\'',), '#test_scope_assignbar.tpl:$foo =\'b1\'#global:$foo =\'b1\'',),
array('b2', 'test_scope_assignbar.tpl', array('b2', 'test_scope_assignbar.tpl',
'#test_scope_assignbar.tpl:$foo =\'b2\'#Smarty:$foo =\'smarty\'#global:$foo =\'b2\'',), '#test_scope_assignbar.tpl:$foo =\'b2\'#global:$foo =\'b2\'',),
array('b1', 'test_scope_assignnocache.tpl', array('b1', 'test_scope_assignnocache.tpl',
'#test_scope_assignnocache.tpl:$foo =\'b1\'#Smarty:$foo =\'smarty\'#global:$foo =\'b1\'',), '#test_scope_assignnocache.tpl:$foo =\'b1\'#global:$foo =\'b1\'',),
array('b2', 'test_scope_assignnocache.tpl', array('b2', 'test_scope_assignnocache.tpl',
'#test_scope_assignnocache.tpl:$foo =\'b2\'#Smarty:$foo =\'smarty\'#global:$foo =\'b2\'',),); '#test_scope_assignnocache.tpl:$foo =\'b2\'#global:$foo =\'b2\'',),);
} }
/** /**
@@ -216,14 +225,10 @@ class ScopeTest extends PHPUnit_Smarty
{ {
$file = "testIncludeScope_{$testNumber}.tpl"; $file = "testIncludeScope_{$testNumber}.tpl";
$this->makeTemplateFile($file, $code); $this->makeTemplateFile($file, $code);
$this->smarty->assignGlobal('file', $file); $this->smarty->assign('foo', 'global');
$this->smarty->assign('foo', 'smarty');
$this->smarty->assignGlobal('foo', 'global');
$data = $this->smarty->createData($useSmarty ? $this->smarty : null); $data = $this->smarty->createData($useSmarty ? $this->smarty : null);
$data->assign('foo', 'data'); $data->assign('foo', 'data');
if (!$useSmarty) { $data->assign('file', $file);
$testName .= 'no smarty';
}
$tpl = $this->smarty->createTemplate('test_scope.tpl', $data); $tpl = $this->smarty->createTemplate('test_scope.tpl', $data);
$this->assertEquals($result, $this->smarty->fetch($tpl), "test - {$code} - {$testName}"); $this->assertEquals($result, $this->smarty->fetch($tpl), "test - {$code} - {$testName}");
} }
@@ -234,44 +239,46 @@ class ScopeTest extends PHPUnit_Smarty
public function dataTestIncludeScope() public function dataTestIncludeScope()
{ {
$i = 0; $i = 0;
return array(/* return [
/*
* Code * Code
* use Smarty object * use Smarty object
* result * result
* test name * test name
*/ */
array('{include \'test_scope_assign.tpl\'}', true, ['{include \'test_scope_assign.tpl\'}', true,
'#test_scope_assign.tpl:$foo =\'newvar\'#testIncludeScope_' . $i . '#test_scope_assign.tpl:$foo =\'newvar\'#testIncludeScope_' . $i .
'.tpl:$foo =\'data\'#test_scope.tpl:$foo =\'data\'#data:$foo =\'data\'#Smarty:$foo =\'smarty\'#global:$foo =\'global\'', '.tpl:$foo =\'data\'#test_scope.tpl:$foo =\'data\'#data:$foo =\'data\'#global:$foo =\'global\'',
'', $i ++), array('{include \'test_scope_assign.tpl\' scope=parent}', true, 'basic', $i++],
['{include \'test_scope_assign.tpl\' scope=parent}', true,
'#test_scope_assign.tpl:$foo =\'newvar\'#testIncludeScope_' . $i . '#test_scope_assign.tpl:$foo =\'newvar\'#testIncludeScope_' . $i .
'.tpl:$foo =\'newvar\'#test_scope.tpl:$foo =\'data\'#data:$foo =\'data\'#Smarty:$foo =\'smarty\'#global:$foo =\'global\'', '.tpl:$foo =\'newvar\'#test_scope.tpl:$foo =\'data\'#data:$foo =\'data\'#global:$foo =\'global\'',
'', $i ++), 'parent scope', $i++],
array('{include \'test_scope_assign.tpl\' scope=tpl_root}', true, ['{include \'test_scope_assign.tpl\' scope=tpl_root}', true,
'#test_scope_assign.tpl:$foo =\'newvar\'#testIncludeScope_' . $i . '#test_scope_assign.tpl:$foo =\'newvar\'#testIncludeScope_' . $i .
'.tpl:$foo =\'newvar\'#test_scope.tpl:$foo =\'newvar\'#data:$foo =\'data\'#Smarty:$foo =\'smarty\'#global:$foo =\'global\'', '.tpl:$foo =\'newvar\'#test_scope.tpl:$foo =\'newvar\'#data:$foo =\'data\'#global:$foo =\'global\'',
'', $i ++), array('{include \'test_scope_assign.tpl\' scope=root}', true, 'tpl_root scope', $i++],
['{include \'test_scope_assign.tpl\' scope=root}', true,
'#test_scope_assign.tpl:$foo =\'newvar\'#testIncludeScope_' . $i . '#test_scope_assign.tpl:$foo =\'newvar\'#testIncludeScope_' . $i .
'.tpl:$foo =\'newvar\'#test_scope.tpl:$foo =\'newvar\'#data:$foo =\'newvar\'#Smarty:$foo =\'smarty\'#global:$foo =\'global\'', '.tpl:$foo =\'newvar\'#test_scope.tpl:$foo =\'newvar\'#data:$foo =\'newvar\'#global:$foo =\'global\'',
'', $i ++), array('{include \'test_scope_assign.tpl\' scope=root}', false, 'root scope', $i++],
'#test_scope_assign.tpl:$foo =\'newvar\'#testIncludeScope_' . ['{include \'test_scope_assign.tpl\' scope=root}', false,
$i .
'.tpl:$foo =\'newvar\'#test_scope.tpl:$foo =\'newvar\'#data:$foo =\'newvar\'#Smarty:$foo =\'smarty\'#global:$foo =\'global\'',
'', $i ++),
array('{include \'test_scope_assign.tpl\' scope=smarty}', true,
'#test_scope_assign.tpl:$foo =\'newvar\'#testIncludeScope_' . $i . '#test_scope_assign.tpl:$foo =\'newvar\'#testIncludeScope_' . $i .
'.tpl:$foo =\'newvar\'#test_scope.tpl:$foo =\'newvar\'#data:$foo =\'data\'#Smarty:$foo =\'newvar\'#global:$foo =\'global\'', '.tpl:$foo =\'newvar\'#test_scope.tpl:$foo =\'newvar\'#data:$foo =\'newvar\'#global:$foo =\'global\'',
'', $i ++), array('{include \'test_scope_assign.tpl\' scope=global}', true, 'root scope / no smarty', $i++],
['{include \'test_scope_assign.tpl\' scope=global}', true,
'#test_scope_assign.tpl:$foo =\'newvar\'#testIncludeScope_' . $i . '#test_scope_assign.tpl:$foo =\'newvar\'#testIncludeScope_' . $i .
'.tpl:$foo =\'newvar\'#test_scope.tpl:$foo =\'newvar\'#data:$foo =\'data\'#Smarty:$foo =\'smarty\'#global:$foo =\'newvar\'', '.tpl:$foo =\'newvar\'#test_scope.tpl:$foo =\'newvar\'#data:$foo =\'data\'#global:$foo =\'global\'',
'', $i ++), 'global scope', $i++],
array('{include \'test_scope_pluginassign.tpl\' scope=global}', true, ['{include \'test_scope_pluginassign.tpl\' scope=global}', true,
'#test_scope_pluginassign.tpl:$foo =\'newvar\'#testIncludeScope_' . $i . '#test_scope_pluginassign.tpl:$foo =\'newvar\'#testIncludeScope_' . $i .
'.tpl:$foo =\'newvar\'#test_scope.tpl:$foo =\'newvar\'#data:$foo =\'data\'#Smarty:$foo =\'smarty\'#global:$foo =\'newvar\'', '.tpl:$foo =\'newvar\'#test_scope.tpl:$foo =\'newvar\'#data:$foo =\'data\'#global:$foo =\'newvar\'',
'', $i ++), array('{include \'test_scope_assign_noscope.tpl\' scope=root}', true, 'pluginassign global', $i++],
['{include \'test_scope_assign_noscope.tpl\' scope=root}', true,
'#test_scope_assign_noscope.tpl:$foo =\'newvar\'#testIncludeScope_' . $i . '#test_scope_assign_noscope.tpl:$foo =\'newvar\'#testIncludeScope_' . $i .
'.tpl:$foo =\'data\'#test_scope.tpl:$foo =\'data\'#data:$foo =\'data\'#Smarty:$foo =\'smarty\'#global:$foo =\'global\'', '.tpl:$foo =\'data\'#test_scope.tpl:$foo =\'data\'#data:$foo =\'data\'#global:$foo =\'global\'',
'', $i ++),); 'noscope root', $i++],
];
} }
/** /**
@@ -310,21 +317,21 @@ class ScopeTest extends PHPUnit_Smarty
* test name * test name
*/ */
return array(array('{config_load \'template.conf\'}', true, return array(array('{config_load \'template.conf\'}', true,
':$foo =\'newvar\'#scope_include.tpl:$foo =\'data\'#scope_tag.tpl:$foo =\'data\'#data:$foo =\'data\'#Smarty:$foo =\'smarty\'', ':$foo =\'newvar\'#scope_include.tpl:$foo =\'data\'#scope_tag.tpl:$foo =\'data\'#data:$foo =\'data\'',
'', $i ++,), array('{config_load \'template.conf\' scope=local}', true, '', $i ++,), array('{config_load \'template.conf\' scope=local}', true,
':$foo =\'newvar\'#scope_include.tpl:$foo =\'data\'#scope_tag.tpl:$foo =\'data\'#data:$foo =\'data\'#Smarty:$foo =\'smarty\'', ':$foo =\'newvar\'#scope_include.tpl:$foo =\'data\'#scope_tag.tpl:$foo =\'data\'#data:$foo =\'data\'',
'', $i ++,), array('{config_load \'template.conf\' scope=parent}', true, '', $i ++,), array('{config_load \'template.conf\' scope=parent}', true,
':$foo =\'newvar\'#scope_include.tpl:$foo =\'newvar\'#scope_tag.tpl:$foo =\'data\'#data:$foo =\'data\'#Smarty:$foo =\'smarty\'', ':$foo =\'newvar\'#scope_include.tpl:$foo =\'newvar\'#scope_tag.tpl:$foo =\'data\'#data:$foo =\'data\'',
'', $i ++,), '', $i ++,),
array('{config_load \'template.conf\' scope=tpl_root}', true, array('{config_load \'template.conf\' scope=tpl_root}', true,
':$foo =\'newvar\'#scope_include.tpl:$foo =\'newvar\'#scope_tag.tpl:$foo =\'newvar\'#data:$foo =\'data\'#Smarty:$foo =\'smarty\'', ':$foo =\'newvar\'#scope_include.tpl:$foo =\'newvar\'#scope_tag.tpl:$foo =\'newvar\'#data:$foo =\'data\'',
'', $i ++,), array('{config_load \'template.conf\' scope=root}', true, '', $i ++,), array('{config_load \'template.conf\' scope=root}', true,
':$foo =\'newvar\'#scope_include.tpl:$foo =\'newvar\'#scope_tag.tpl:$foo =\'newvar\'#data:$foo =\'newvar\'#Smarty:$foo =\'smarty\'', ':$foo =\'newvar\'#scope_include.tpl:$foo =\'newvar\'#scope_tag.tpl:$foo =\'newvar\'#data:$foo =\'newvar\'',
'', $i ++,), array('{config_load \'template.conf\' scope=root}', false, '', $i ++,), array('{config_load \'template.conf\' scope=root}', false,
':$foo =\'newvar\'#scope_include.tpl:$foo =\'newvar\'#scope_tag.tpl:$foo =\'newvar\'#data:$foo =\'newvar\'#Smarty:$foo =\'smarty\'', ':$foo =\'newvar\'#scope_include.tpl:$foo =\'newvar\'#scope_tag.tpl:$foo =\'newvar\'#data:$foo =\'newvar\'',
'no smarty', $i ++,), 'no smarty', $i ++,),
array('{config_load \'template.conf\' scope=smarty}', false, array('{config_load \'template.conf\' scope=global}', false,
':$foo =\'newvar\'#scope_include.tpl:$foo =\'newvar\'#scope_tag.tpl:$foo =\'newvar\'#data:$foo =\'data\'#Smarty:$foo =\'newvar\'', ':$foo =\'newvar\'#scope_include.tpl:$foo =\'newvar\'#scope_tag.tpl:$foo =\'newvar\'#data:$foo =\'data\'#global:$foo =\'newvar\'',
'no smarty', $i ++,),); 'no smarty', $i ++,),);
} }

View File

@@ -6,7 +6,6 @@
*/ */
use Smarty\DataObject;
use Smarty\Template; use Smarty\Template;
/** /**
@@ -20,7 +19,7 @@ use Smarty\Template;
function smarty_function_checkconfigvar($params, $template) function smarty_function_checkconfigvar($params, $template)
{ {
$output = ''; $output = '';
$types = array('template', 'data', 'smarty'); $types = array('template', 'data', 'global');
if (isset($params['types'])) { if (isset($params['types'])) {
$types = (array)$params['types']; $types = (array)$params['types'];
} }
@@ -29,20 +28,20 @@ function smarty_function_checkconfigvar($params, $template)
while ($ptr) { while ($ptr) {
if (in_array('template', $types) && $ptr instanceof Template) { if (in_array('template', $types) && $ptr instanceof Template) {
$output .= "#{$ptr->source->name}:\${$var} ="; $output .= "#{$ptr->source->name}:\${$var} =";
$output .= isset($ptr->config_vars[$var]) ? preg_replace('/\s/', '', var_export($ptr->config_vars[$var], true)) : 'null'; $output .= $ptr->hasConfigVariable($var) ? preg_replace('/\s/', '', var_export($ptr->getConfigVariable($var), true)) : 'null';
$ptr = $ptr->parent; $ptr = $ptr->parent;
} elseif (in_array('data', $types) && $ptr instanceof DataObject) { } elseif (in_array('data', $types) && !($ptr instanceof Template || $ptr instanceof Smarty)) {
$output .= "#data:\${$var} ="; $output .= "#data:\${$var} =";
$output .= isset($ptr->config_vars[$var]) ? preg_replace('/\s/', '', var_export($ptr->config_vars[$var], true)) : 'null'; $output .= $ptr->hasConfigVariable($var) ? preg_replace('/\s/', '', var_export($ptr->getConfigVariable($var), true)) : 'null';
$ptr = $ptr->parent; $ptr = $ptr->parent;
} else { } else {
$ptr = null; $ptr = null;
} }
} }
if (in_array('smarty', $types)) { if (in_array('global', $types)) {
$output .= "#Smarty:\${$var} ="; $output .= "#global:\${$var} =";
$output .= isset($template->smarty->config_vars[ $var ]) ? $output .= $template->smarty->hasConfigVariable($var) ?
preg_replace('/\s/', '', var_export($template->smarty->config_vars[ $var ], true)) : 'null'; preg_replace('/\s/', '', var_export($template->smarty->getConfigVariable($var), true)) : 'null';
} }
return $output; return $output;
} }

View File

@@ -6,7 +6,6 @@
*/ */
use Smarty\DataObject;
use Smarty\Template; use Smarty\Template;
/** /**
@@ -37,7 +36,7 @@ function smarty_function_checkvar($params, \Smarty\Template $template)
$i ++; $i ++;
} }
$ptr = $ptr->parent; $ptr = $ptr->parent;
} elseif (in_array('data', $types) && $ptr instanceof DataObject) { } elseif (in_array('data', $types) && !($ptr instanceof Template || $ptr instanceof Smarty)) {
$output .= "#data:\${$var} ="; $output .= "#data:\${$var} =";
$output .= $ptr->hasVariable($var) ? preg_replace('/\s/', '', var_export($ptr->getValue($var), true)) : '>unassigned<'; $output .= $ptr->hasVariable($var) ? preg_replace('/\s/', '', var_export($ptr->getValue($var), true)) : '>unassigned<';
$ptr = $ptr->parent; $ptr = $ptr->parent;