Fixed cacheability of block plugins.

This commit is contained in:
Simon Wisselink
2023-01-19 23:29:10 +01:00
parent 27dd3e4c57
commit 390f34318d
9 changed files with 80 additions and 14 deletions

19
src/BlockHandler/Base.php Normal file
View File

@@ -0,0 +1,19 @@
<?php
namespace Smarty\BlockHandler;
use Smarty\Template;
abstract class Base implements BlockHandlerInterface {
/**
* @var bool
*/
protected $cacheable = true;
abstract public function handle($params, $content, Template $template, &$repeat);
public function isCacheable(): bool {
return $this->cacheable;
}
}

View File

@@ -6,4 +6,5 @@ use Smarty\Template;
interface BlockHandlerInterface { interface BlockHandlerInterface {
public function handle($params, $content, Template $template, &$repeat); public function handle($params, $content, Template $template, &$repeat);
public function isCacheable(): bool;
} }

View File

@@ -4,12 +4,13 @@ namespace Smarty\BlockHandler;
use Smarty\Template; use Smarty\Template;
class BlockPluginWrapper implements BlockHandlerInterface { class BlockPluginWrapper extends Base {
private $callback; private $callback;
public function __construct($callback) { public function __construct($callback, bool $cacheable = true) {
$this->callback = $callback; $this->callback = $callback;
$this->cacheable = $cacheable;
} }
public function handle($params, $content, Template $template, &$repeat) { public function handle($params, $content, Template $template, &$repeat) {

View File

@@ -107,4 +107,7 @@ class TextFormat implements BlockHandlerInterface {
} }
} }
public function isCacheable(): bool {
return true;
}
} }

View File

@@ -13,6 +13,7 @@ namespace Smarty\Compile;
use Smarty\Compiler\Template; use Smarty\Compiler\Template;
use Smarty\CompilerException; use Smarty\CompilerException;
use Smarty\Exception; use Smarty\Exception;
use Smarty\Smarty;
/** /**
* Smarty Internal Plugin Compile Block Plugin Class * Smarty Internal Plugin Compile Block Plugin Class
@@ -61,6 +62,18 @@ class BlockCompiler extends Base {
return $output; return $output;
} }
/**
* Returns true if this block is cacheable.
*
* @param Smarty $smarty
* @param $function
*
* @return bool
*/
protected function blockIsCacheable(\Smarty\Smarty $smarty, $function): bool {
return $smarty->getBlockHandler($function)->isCacheable();
}
/** /**
* Returns the code used for the isset check * Returns the code used for the isset check
* *
@@ -101,6 +114,10 @@ class BlockCompiler extends Base {
unset($_attr['nocache']); unset($_attr['nocache']);
$_params = 'array(' . implode(',', $this->formatParamsArray($_attr)) . ')'; $_params = 'array(' . implode(',', $this->formatParamsArray($_attr)) . ')';
if (!$this->blockIsCacheable($compiler->getSmarty(), $function)) {
$compiler->tag_nocache = true;
}
// compile code // compile code
$output = "<?php \$_block_repeat=true; $output = "<?php \$_block_repeat=true;
if (!" . $this->getIsCallableCode($tag, $function) .") {\nthrow new \\Smarty\\Exception('block tag \'{$tag}\' not callable or registered');\n}\n if (!" . $this->getIsCallableCode($tag, $function) .") {\nthrow new \\Smarty\\Exception('block tag \'{$tag}\' not callable or registered');\n}\n

View File

@@ -18,4 +18,12 @@ class DefaultHandlerBlockCompiler extends BlockCompiler {
return "\$_smarty_tpl->getSmarty()->getRuntime('DefaultPluginHandler')->getCallback(" . return "\$_smarty_tpl->getSmarty()->getRuntime('DefaultPluginHandler')->getCallback(" .
var_export($function, true) . ", 'block')"; var_export($function, true) . ", 'block')";
} }
/**
* @inheritDoc
*/
protected function blockIsCacheable(\Smarty\Smarty $smarty, $function): bool {
return true;
}
} }

View File

@@ -34,4 +34,11 @@ class ObjectMethodBlockCompiler extends BlockCompiler {
return "{$callbackObject}->{$function}"; return "{$callbackObject}->{$function}";
} }
/**
* @inheritDoc
*/
protected function blockIsCacheable(\Smarty\Smarty $smarty, $function): bool {
return true;
}
} }

View File

@@ -57,8 +57,9 @@ class BCPluginsAdapter extends Base {
return null; return null;
} }
$callback = $plugin[0]; $callback = $plugin[0];
$cacheable = (bool) $plugin[1] ?? true;
return new BlockPluginWrapper($callback); return new BlockPluginWrapper($callback, $cacheable);
} }
public function getModifierCallback(string $modifierName) { public function getModifierCallback(string $modifierName) {

View File

@@ -152,10 +152,16 @@ class RegisterBlockTest extends PHPUnit_Smarty
{ {
$this->smarty->caching = 1; $this->smarty->caching = 1;
$this->smarty->cache_lifetime = 1000; $this->smarty->cache_lifetime = 1000;
$this->smarty->assign('x', 4); $this->smarty->registerPlugin(Smarty::PLUGIN_BLOCK, 'testblock', 'myblockcache', false);
$this->smarty->assign('y', 40);
$this->smarty->assign('z', 400); $this->smarty->assign('x', 3);
$this->smarty->registerPlugin(Smarty::PLUGIN_BLOCK, 'testblock', 'myblockcache', false); $this->smarty->assign('y', 30);
$this->smarty->assign('z', 300);
$this->assertEquals('3 30 300', $this->smarty->fetch('test_register_block.tpl'));
$this->smarty->assign('x', 4);
$this->smarty->assign('y', 40);
$this->smarty->assign('z', 400);
$this->assertEquals('3 40 300', $this->smarty->fetch('test_register_block.tpl')); $this->assertEquals('3 40 300', $this->smarty->fetch('test_register_block.tpl'));
} }
@@ -209,20 +215,23 @@ class RegisterBlockTest extends PHPUnit_Smarty
$this->assertEquals('3 30 300', $this->smarty->fetch('test_register_block.tpl')); $this->assertEquals('3 30 300', $this->smarty->fetch('test_register_block.tpl'));
} }
/**
*
*
*
*/
public function testRegisterBlockCaching4Wrapper() public function testRegisterBlockCaching4Wrapper()
{ {
$this->cleanDirs();
$this->smarty->caching = 1; $this->smarty->caching = 1;
$this->smarty->cache_lifetime = 1000; $this->smarty->cache_lifetime = 1000;
$this->smarty->registerPlugin('block', 'testblock', 'myblockcache');
$this->smarty->assign('x', 3);
$this->smarty->assign('y', 30);
$this->smarty->assign('z', 300);
$this->assertEquals('3 30 300', $this->smarty->fetch('test_register_block.tpl'));
$this->smarty->assign('x', 4); $this->smarty->assign('x', 4);
$this->smarty->assign('y', 40); $this->smarty->assign('y', 40);
$this->smarty->assign('z', 400); $this->smarty->assign('z', 400);
$this->smarty->registerPlugin('block', 'testblock', 'myblockcache', false); $this->assertEquals('3 30 300', $this->smarty->fetch('test_register_block.tpl'));
$this->assertEquals('3 40 300', $this->smarty->fetch('test_register_block.tpl'));
} }
/** /**