Smarty 模板引擎 - 使用 $smarty->fetch 时 Unload/Disallow 个插件

Smarty Template Engine - Unload/Disallow plugins while using $smarty->fetch

如何在使用 $smarty->fetch('mytemplate.tpl') 方法时从模板中卸载或禁止 smarty 核心插件

例如模板 mytemplate.tpl 包含 {html_options}{html_table}

当使用 $smarty->fetch('mytemplate.tpl') 时,只有 {html_options} 应该被 smarty 解析,但是 {html_table} 不是

从插件文件夹中删除 function.html_table.php 不是一个选项,因为它仍在被另一个 $smarty->fetch() 调用使用

一种可能的解决方案是从 Smarty_Security class 扩展并使用方法

启用安全性

$smarty->enableSecurity($instanceOfClass)

调用 fetch 方法后,disableSecurity 方法会再次重新启用所有 plugins/tags/modifiers

不幸的是,当使用 enableSecurity 并使用禁用函数时会抛出异常

另一种方法是使用 [=15] 将所有 tags/variables/... =] 调用前 $smarty->fetch([...])

示例

# negate regular expression pattern to allow only the below tags
$pattern = "/\{(?!allowedTag1|allowedTag2).*?\}/";
$replacement = '{literal}[=10=]{/literal}';

$content = preg_replace($pattern, $replacement, $content);
$smarty->fetch("string:" . $content);

有关安全 class 的更多详细信息:http://www.smarty.net/docs/en/advanced.features.tpl