Removed deprecated extends_recursion property and fix bug in CodeFrame compiler due to use of clone.

This commit is contained in:
Simon Wisselink
2023-01-06 21:43:48 +01:00
parent 1f87cebb93
commit b2e11ee2b8
7 changed files with 34 additions and 95 deletions

View File

@@ -2,6 +2,10 @@
namespace Smarty\Resource; namespace Smarty\Resource;
use Smarty\Exception;
use Smarty\Template;
use Smarty\Template\Source;
/** /**
* Smarty Internal Plugin Resource Extends * Smarty Internal Plugin Resource Extends
* *
@@ -24,12 +28,12 @@ class ExtendsPlugin extends BasePlugin
/** /**
* populate Source Object with metadata from Resource * populate Source Object with metadata from Resource
* *
* @param \Smarty\Template\Source $source source object * @param Source $source source object
* @param \Smarty\Template $_template template object * @param Template|null $_template template object
* *
* @throws \Smarty\Exception * @throws Exception
*/ */
public function populate(\Smarty\Template\Source $source, \Smarty\Template $_template = null) public function populate(Source $source, Template $_template = null)
{ {
$uid = ''; $uid = '';
$sources = array(); $sources = array();
@@ -37,8 +41,7 @@ class ExtendsPlugin extends BasePlugin
$smarty = &$source->smarty; $smarty = &$source->smarty;
$exists = true; $exists = true;
foreach ($components as $component) { foreach ($components as $component) {
/* @var \Smarty\Template\Source $_s */ $_s = Source::load(null, $smarty, $component);
$_s = \Smarty\Template\Source::load(null, $smarty, $component);
if ($_s->type === 'php') { if ($_s->type === 'php') {
throw new \Smarty\Exception("Resource type {$_s->type} cannot be used with the extends resource type"); throw new \Smarty\Exception("Resource type {$_s->type} cannot be used with the extends resource type");
} }
@@ -60,12 +63,12 @@ class ExtendsPlugin extends BasePlugin
/** /**
* populate Source Object with timestamp and exists from Resource * populate Source Object with timestamp and exists from Resource
* *
* @param \Smarty\Template\Source $source source object * @param Source $source source object
*/ */
public function populateTimestamp(\Smarty\Template\Source $source) public function populateTimestamp(Source $source)
{ {
$source->exists = true; $source->exists = true;
/* @var \Smarty\Template\Source $_s */ /* @var Source $_s */
foreach ($source->components as $_s) { foreach ($source->components as $_s) {
$source->exists = $source->exists && $_s->exists; $source->exists = $source->exists && $_s->exists;
} }
@@ -75,19 +78,19 @@ class ExtendsPlugin extends BasePlugin
/** /**
* Load template's source from files into current template object * Load template's source from files into current template object
* *
* @param \Smarty\Template\Source $source source object * @param Source $source source object
* *
* @return string template source * @return string template source
* @throws \Smarty\Exception if source cannot be loaded * @throws \Smarty\Exception if source cannot be loaded
*/ */
public function getContent(\Smarty\Template\Source $source) public function getContent(Source $source)
{ {
if (!$source->exists) { if (!$source->exists) {
throw new \Smarty\Exception("Unable to load template '{$source->type}:{$source->name}'"); throw new \Smarty\Exception("Unable to load template '{$source->type}:{$source->name}'");
} }
$_components = array_reverse($source->components); $_components = array_reverse($source->components);
$_content = ''; $_content = '';
/* @var \Smarty\Template\Source $_s */ /* @var Source $_s */
foreach ($_components as $_s) { foreach ($_components as $_s) {
// read content // read content
$_content .= $_s->getContent(); $_content .= $_s->getContent();
@@ -98,11 +101,11 @@ class ExtendsPlugin extends BasePlugin
/** /**
* Determine basename for compiled filename * Determine basename for compiled filename
* *
* @param \Smarty\Template\Source $source source object * @param Source $source source object
* *
* @return string resource's basename * @return string resource's basename
*/ */
public function getBasename(\Smarty\Template\Source $source) public function getBasename(Source $source)
{ {
return str_replace(':', '.', basename($source->filepath)); return str_replace(':', '.', basename($source->filepath));
} }

View File

@@ -9,7 +9,7 @@
*/ */
namespace Smarty\Resource; namespace Smarty\Resource;
use Smarty\Smarty;
use Smarty\Template; use Smarty\Template;
use Smarty\Template\Source; use Smarty\Template\Source;
use Smarty\Exception; use Smarty\Exception;

View File

@@ -112,9 +112,7 @@ class InheritanceRuntime {
ob_end_clean(); ob_end_clean();
$this->state = 2; $this->state = 2;
} }
if (isset($template) && (($tpl->parent->_isTplObj() && $tpl->parent->source->type !== 'extends') if (isset($template)) {
|| $tpl->smarty->extends_recursion)
) {
$tpl->_subTemplateRender( $tpl->_subTemplateRender(
$template, $template,
$tpl->cache_id, $tpl->cache_id,

View File

@@ -224,15 +224,6 @@ class Smarty extends \Smarty\TemplateBase
*/ */
public $merge_compiled_includes = false; public $merge_compiled_includes = false;
/*
* flag for behaviour when extends: resource and {extends} tag are used simultaneous
* if false disable execution of {extends} in templates called by extends resource.
* (behaviour as versions < 3.1.28)
*
* @var boolean
*/
public $extends_recursion = true;
/** /**
* force cache file creation * force cache file creation
* *
@@ -1026,8 +1017,7 @@ class Smarty extends \Smarty\TemplateBase
$this->_normalizeTemplateConfig(false); $this->_normalizeTemplateConfig(false);
} }
$_templateId = $this->_getTemplateId($template, $cache_id, $compile_id); $_templateId = $this->_getTemplateId($template, $cache_id, $compile_id);
$tpl = null; if ($this->caching && isset(\Smarty\Template::$isCacheTplObj[ $_templateId ])) {
if ($this->caching && isset(\Smarty\Template::$isCacheTplObj[ $_templateId ])) {
$tpl = $do_clone ? clone \Smarty\Template::$isCacheTplObj[ $_templateId ] : $tpl = $do_clone ? clone \Smarty\Template::$isCacheTplObj[ $_templateId ] :
\Smarty\Template::$isCacheTplObj[ $_templateId ]; \Smarty\Template::$isCacheTplObj[ $_templateId ];
$tpl->inheritance = null; $tpl->inheritance = null;

View File

@@ -119,10 +119,6 @@ class Template extends TemplateBase {
* @var callback[] * @var callback[]
*/ */
public $endRenderCallbacks = []; public $endRenderCallbacks = [];
/**
* @var \Smarty\Compiler\CodeFrame
*/
private $codeFrameCompiler;
/** /**
* Create template data object * Create template data object
@@ -165,8 +161,6 @@ class Template extends TemplateBase {
if ($smarty->security_policy && method_exists($smarty->security_policy, 'registerCallBacks')) { if ($smarty->security_policy && method_exists($smarty->security_policy, 'registerCallBacks')) {
$smarty->security_policy->registerCallBacks($this); $smarty->security_policy->registerCallBacks($this);
} }
$this->codeFrameCompiler = new \Smarty\Compiler\CodeFrame($this);
} }
/** /**
@@ -613,7 +607,7 @@ class Template extends TemplateBase {
* @return string * @return string
*/ */
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->codeFrameCompiler->create($content, $functions, $cache, $compiler); return $this->getFrameCompiler()->create($content, $functions, $cache, $compiler);
} }
/** /**
@@ -895,4 +889,8 @@ class Template extends TemplateBase {
$i++; $i++;
} }
} }
private function getFrameCompiler(): Compiler\CodeFrame {
return new \Smarty\Compiler\CodeFrame($this);
}
} }

View File

@@ -64,8 +64,7 @@ class Compiled extends ResourceBase {
(int)$smarty->config_overwrite * 4; (int)$smarty->config_overwrite * 4;
} else { } else {
$this->filepath .= (int)$smarty->merge_compiled_includes + (int)$smarty->escape_html * 2 + $this->filepath .= (int)$smarty->merge_compiled_includes + (int)$smarty->escape_html * 2 +
(($smarty->merge_compiled_includes && $source->type === 'extends') ? (($smarty->merge_compiled_includes && $source->type === 'extends') ? 4 : 0);
(int)$smarty->extends_recursion * 4 : 0);
} }
$this->filepath .= '.' . $source->type; $this->filepath .= '.' . $source->type;
$basename = $source->handler->getBasename($source); $basename = $source->handler->getBasename($source);

View File

@@ -10,10 +10,6 @@ use Smarty\Template;
/** /**
* class for extends resource tests * class for extends resource tests
*
*
*
*
*/ */
class ExtendsResourceTest extends PHPUnit_Smarty class ExtendsResourceTest extends PHPUnit_Smarty
{ {
@@ -48,9 +44,15 @@ class ExtendsResourceTest extends PHPUnit_Smarty
$this->smarty->compile_id = 1; $this->smarty->compile_id = 1;
} }
$result = $this->smarty->fetch('extends:003_parent.tpl|003_child_prepend.tpl'); $result = $this->smarty->fetch('extends:003_parent.tpl|003_child_prepend.tpl');
$this->assertStringContainsString("prepend - Default Title", $result, $testName . ' - content'); $this->assertStringContainsString(
$this->assertStringContainsString("test:{$testNumber} compiled:{$compileTestNumber} rendered:{$renderTestNumber}", $result, $testName . ' - fetch() failure'); "prepend - Default Title", $result, $testName . ' - content');
$this->assertStringContainsString(
"test:{$testNumber} compiled:{$compileTestNumber} rendered:{$renderTestNumber}",
$result,
$testName . ' - fetch() failure'
);
} }
/** /**
* test child/parent template chain with apppend * test child/parent template chain with apppend
* @dataProvider data * @dataProvider data
@@ -240,57 +242,6 @@ class ExtendsResourceTest extends PHPUnit_Smarty
array(true, true, 8, 7, 7, 'caching, merge - exits'), array(true, true, 8, 7, 7, 'caching, merge - exits'),
); );
} }
/**
* test relative includes in {block}
* @dataProvider data2
*/
public function testCompileBlockExtendsRecursion_034($extends_recursion, $merge, $testNumber, $compileTestNumber,
$renderTestNumber, $testName)
{
if (!property_exists($this->smarty, 'extends_recursion')) {
$this->markTestSkipped('no extends_recursion');
} else {
$this->smarty->registerFilter('pre', array($this, 'compiledPrefilter'));
$this->smarty->assign('test', $testNumber);
$this->smarty->setExtendsRecursion($extends_recursion);
$this->smarty->setMergeCompiledIncludes($merge);
$cid = 0;
if ($merge) {
$cid = 1;
}
if ($extends_recursion) {
$cid += 2;
}
$this->smarty->setCompileId($cid);
$result = $this->smarty->fetch('extends:034_parent.tpl|034_grandchild.tpl');
$this->assertStringContainsString('grandchild - grandchild', $result, $testName . ' - grand');
$this->assertStringContainsString('parent - parent', $result, $testName . ' - grand');
$this->assertStringContainsString($extends_recursion ? 'child - child' : 'child - parent', $result,
$testName . ' - grand');
$this->assertStringContainsString("test:{$testNumber} compiled:{$compileTestNumber} rendered:{$renderTestNumber}",
$result, $testName . ' - fetch() failure');
}
}
public function data2(){
return array(
/*
* extends_recursion
* merging
* test nr
* result compile nr
* result render nr
* text
*/
array(false, false, 1, 1, 1, 'no EXTENDS; no merge - new'),
array(false, false, 2, 1, 2, 'no EXTENDS; no merge - exits'),
array(true, false, 3, 3, 3, 'EXTENDS; no merge - new'),
array(true, false, 4, 3, 4, 'EXTENDS; no merge - exits'),
array(false, true, 5, 5, 5, 'no EXTENDS; merge - new'),
array(false, true, 6, 5, 6, 'no EXTENDS; merge - exits'),
array(true, true, 7, 7, 7, 'EXTENDS; merge - new'),
array(true, true, 8, 7, 8, 'EXTENDS; merge - exits'),
);
}
} }