What is Smarty?
Why use it?
Use Cases and Work Flow
Syntax Comparison
Template Inheritance
Best Practices
Crash Course
You may use the Smarty logo according to the trademark notice.
For sponsorship, advertising, news or other inquiries, contact us at:
通常情况下,开启缓存可以让整个最终输出的页面被缓存下来。 然而,Smarty 3提供了几种在输出缓存中控制部分区域不进行缓存的方法。
注意在不缓存的区域内使用的全部变量,在页面每次加载时都会从PHP里重新赋值。
模板内的一块区域可以很容易地通过
{nocache}
和{/nocache}
标签来设置不进行缓存。
Example 15.10. 使模板的一块区域不进行缓存
今天是: {nocache} {$smarty.now|date_format} {/nocache}
上面的代码将在一个缓存的页面上输出当前日期时间。
控制单个标签不进行缓存,可以为其加入"nocache"的属性。
你可以通过assign()
来控制变量值不进行缓存。
如果一个变量被设置了不缓存,那么它在页面每次加载时都会从PHP里重新赋值。
变量不缓存的设置,会在编译后的代码中起效。所以如果你重新设置了某个变量不缓存,那么你需要删除已经存在的编译和缓存文件,使得模板可以重新编译并起效。
你可以在注册一个插件时,同时控制插件的缓存。
registerPlugin()
的第三个参数是$cacheable
,其默认是TRUE
。
当你注册一个插件时,同时设置$cacheable=false
,
那么插件会在每次页面显示的时候都被调用,即使页面整体已经被缓存了。
插件函数的这个行为和{insert}
很相似。
插件不缓存的设置,会在编译后的代码中起效。所以如果你重新设置了某个插件不缓存,那么你需要删除已经存在的编译和缓存文件,使得模板可以重新编译并起效。
对比{insert}
也可以默认让插件不进行缓存。
它们可以通过第四个参数$cache_attrs
来定义进行缓存。
$cache_attrs
定义了一个需要进行缓存的属性数组,
然后这些属性会被写入缓存,以供插件每次执行的时候直接读取。
Example 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')) { // 从db获取$obj 并赋值... $smarty->assignByRef('obj', $obj); } $smarty->display('index.tpl'); ?>
模板index.tpl
内容是:
时间还有: {remaining endtime=$obj->endtime}
即使页面被缓存了,$obj
的倒计时也还是会在每次页面刷新的时候改变。
endtime属性仅在第一次页面显示的时候,被从db里面读取出来并写入到模板,然后就一直是直接从缓存内读取了。
Example 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
的内容:
页面创建于: {'0'|date_format:'%D %H:%M:%S'} {dynamic} 现在时间是: {'0'|date_format:'%D %H:%M:%S'} ... 做些其他事情 ... {/dynamic}
刷新页面后你可以发现两个日期的不同。一个是“动态的”,另一个是“静态的”。
你可以像上面的代码一样把任何东西放{dynamic}...{/dynamic}
标签内,来使其不缓存。
上面的例子是展示了动态的区块插件是如何工作的。
参见如何通过{nocache}
和 {/nocache}
标签来进行模板区域缓存控制
。