首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Smarty缓存组件

Smarty缓存组件
EN

Stack Overflow用户
提问于 2009-10-13 13:24:44
回答 1查看 1.6K关注 0票数 1

Smarty FAQ建议了一种处理可缓存片段的方法,但它需要每个页面控制器预先做大量的工作,而不是正确地封装。

我们想要达到这样一个阶段,我们可以这样做:

代码语言:javascript
复制
<div id="header">
  {our_categories}
  {our_subcategories category=$current_category}
</div>

our_前缀函数的输出应该是完全可缓存的,只依赖于命名参数(如果有的话)。如果我们在多个模板中引用了{our_categories},那么它们都应该引用相同的缓存内容。

(可能值得一提的是,我们尝试使用{insert name="..."}并编写我们自己的函数,但结果是不可缓存的,我们最终只能手动重新调整HTML,而不是从Smarty的模板处理中受益。)

我们在这方面的第一个破解是使用了一个自定义函数smarty_function_our_categories,但是缓存出现了严重的错误。下面是我们的函数:

代码语言:javascript
复制
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安全地创建缓存组件以呈现自身?

EN

回答 1

Stack Overflow用户

发布于 2009-10-15 09:21:56

您不应该从Smarty函数内部更改缓存参数。插件输出的结果是否可缓存是在您注册插件时定义的。

http://www.smarty.net/manual/en/caching.cacheable.php

要在可缓存模板中创建不可缓存的内容,只需使用{dynamic}块,如下所示:

代码语言:javascript
复制
//Registering dynamic non-caching block with Smarty
$template->register_block('dynamic', 'smarty_block_dynamic', false); 
function smarty_block_dynamic($param, $content, &$smarty) { 
    return $content; 
} 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1560229

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档