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
如何在使用 $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