什么是 Smarty?
为什么要使用它?
用例和工作流程
语法对比
模板继承
最佳实践
速成教程
如果通常启用缓存,则页面的整个最终输出都会被缓存起来。但是 Smarty3 提供了几个选项来将输出部分排除在缓存之外。
确保当页面从缓存中载入时,在非缓存部分中使用的所有变量也从 PHP 分配。
使用{nocache}
和{/nocache}
标签可以轻松地将较大的模板部分排除在缓存之外。
示例 15.10 阻止模板部分被缓存
Today's date is {nocache} {$smarty.now|date_format} {/nocache}
以上代码会在缓存页面上输出当前日期。
通过将 "nocache" 选项标志添加到标签,可以禁用单个标签的缓存。
你可以将变量assign()
指定为不可缓存。任何使用此变量的标签都将在无缓存模式下自动执行。
如果标签在无缓存模式下执行,则必须确保该标签使用的所有其他变量也从 PHP 分配(当页面从缓存中载入时)。
已分配变量的无缓存状态会影响编译后的模板代码。如果更改状态,则必须手动删除现有的已编译缓存模板文件以强制重新编译。
示例 15.12 无缓存变量
// assign $foo as nocahe variable $smarty->assign('foo',time(),true); Dynamic time value is {$foo}
在注册插件时可以声明其可缓存性。registerPlugin()
的第三个参数称为$cacheable
,其默认值为TRUE
。
使用 $cacheable=false
注册插件时,每次显示页面都会调用该插件,即使页面来自缓存。该插件函数的行为有点像 {insert}
函数。
$cacheable
状态将影响已编译的模板代码。如果更改状态,则必须手动删除现有的已编译缓存的模板文件以强制重新编译。
与 {insert}
相反,默认情况下,插件的属性不会缓存。可以使用第四个参数 $cache_attrs
声明将它们缓存起来。$cache_attrs
是应该缓存的属性名称数组,因此,每次从缓存中获取时,插件函数都会获取页面写入缓存时的时间值。
示例 15.13. 防止插件输出被缓存
<?php $smarty->setCaching(Smarty::CACHING_LIFETIME_CURRENT); function remaining_seconds($params, $smarty) { $remain = $params['endtime'] - time(); if($remain >= 0){ return $remain . ' second(s)'; }else{ return 'done'; } } $smarty->registerPlugin('function','remaining', 'remaining_seconds', false, array('endtime')); if (!$smarty->isCached('index.tpl')) { // fetch $obj from db and assign... $smarty->assignByRef('obj', $obj); } $smarty->display('index.tpl'); ?>
其中 index.tpl
为
Time Remaining: {remaining endtime=$obj->endtime}
每次显示页面时,剩余时间 $obj
结束的时间秒数都会更改,即使页面已缓存。由于 endtime 属性已缓存,因此只有在页面写入缓存时才需要从数据库中提取对象,但在后续页面请求中则不需要。
示例 15.14. 防止模板的整个段落被缓存
index.php: <?php $smarty->setCaching(Smarty::CACHING_LIFETIME_CURRENT); function smarty_block_dynamic($param, $content, $smarty) { return $content; } $smarty->registerPlugin('block','dynamic', 'smarty_block_dynamic', false); $smarty->display('index.tpl'); ?>
其中 index.tpl
为
Page created: {'0'|date_format:'%D %H:%M:%S'} {dynamic} Now is: {'0'|date_format:'%D %H:%M:%S'} ... do other stuff ... {/dynamic}
重新加载页面时,您会注意到两个日期不同。一个是 “动态”,另一个是 “静态”。您可以在 {dynamic}...{/dynamic}
之间执行任何操作,并确保不会像页面其余部分一样被缓存。
上述示例仅演示动态块插件的工作原理。有关如何使用内置 {nocache}
和 {/nocache}
标记禁用模板段落缓存的信息,请参见 Cacheability of Template Section
。