Smarty FAQ建议了一种处理可缓存片段的方法,但它需要每个页面控制器预先做大量的工作,而不是正确地封装。
我们想要达到这样一个阶段,我们可以这样做:
<div id="header">
{our_categories}
{our_subcategories category=$current_category}
</div>our_前缀函数的输出应该是完全可缓存的,只依赖于命名参数(如果有的话)。如果我们在多个模板中引用了{our_categories},那么它们都应该引用相同的缓存内容。
(可能值得一提的是,我们尝试使用{insert name="..."}并编写我们自己的函数,但结果是不可缓存的,我们最终只能手动重新调整HTML,而不是从Smarty的模板处理中受益。)
我们在这方面的第一个破解是使用了一个自定义函数smarty_function_our_categories,但是缓存出现了严重的错误。下面是我们的函数:
function smarty_function_our_categories($params, &$smarty) {
$smarty->caching = 2;
$smarty->cache_lifetime = 3600; # 1 hour
if (!$smarty->is_cached(...)) {
// ... do db access to fetch data for template...
$smarty->assign(....);
}
return $smarty->fetch(...);
}问题是:在一个函数中调用$smarty->fetch()会让smarty感到困惑,让它忘记了哪些模板有插入标签,哪些没有。最终的结果是,Smarty在提供缓存内容时忘记了替换某些标记(它放在那里的标记是:“用一些非缓存{insert ...}调用的结果替换它)。”在我们的例子中,这表现在我们的网站显示了几个md5校验和和一个php序列化的内存,而我们的主菜单应该在那里-这不是很好。
我们假设我们在构建组件的方式上犯了一个错误,所以问题最终变成:
如何使用Smarty安全地创建缓存组件以呈现自身?
发布于 2009-10-15 09:21:56
您不应该从Smarty函数内部更改缓存参数。插件输出的结果是否可缓存是在您注册插件时定义的。
http://www.smarty.net/manual/en/caching.cacheable.php
要在可缓存模板中创建不可缓存的内容,只需使用{dynamic}块,如下所示:
//Registering dynamic non-caching block with Smarty
$template->register_block('dynamic', 'smarty_block_dynamic', false);
function smarty_block_dynamic($param, $content, &$smarty) {
return $content;
} https://stackoverflow.com/questions/1560229
复制相似问题