控制插件输出的可缓存性
自Smarty-2.6.0以来,插件的可缓存性可以在注册它们时加以声明。register_block(),register_compiler_function() 和register_function()的第三个参数是$cacheable,而其缺省为TRUE,也就是Smarty 2.6.0版本之前插件的行为。
如果注册插件时,设置$cacheable=false,那么该页面显示时每次都要调用该插件,即使该页面来自缓存。插件函数的行为有点象{insert}函数。
与{insert}不同的是,插件的属性缺省时不被缓存。然后要将它们加以缓存时,可以使用第四个参数$cache_attrs。$cache_attrs是一个数组,包含了应该缓存的属性名。因此,插件函数每次从缓存中提取它们时,如同页面被写入缓存时那样。
例子14-10. 防止一个插件的输出被缓存
<?php $smarty->caching = true;
function remaining_seconds($params, &$smarty) { $remain = $params['endtime'] - time(); if($remain >= 0){ return $remain . ' second(s)'; }else{ return 'done'; } }
$smarty->register_function('remaining', 'remaining_seconds', false, array('endtime'));
if (!$smarty->is_cached('index.tpl')) {
// 从数据库中获得$obj并赋值
$smarty->assign_by_ref('obj', $obj); }
$smarty->display('index.tpl'); ?>
|
而index.tpl为:
Time Remaining: {remaining endtime=$obj->endtime} |
即使该页面是被缓存的,但是每次显示该页面时,到达$obj终止时间的秒数还是会改变。由于endtime属性是被缓存了,只有在将页面写入缓存时要从数据库中提取对象,而不是以后对该页面的请求时。
|
例子14-11. 组织模板的整个一段进行缓存
index.php:
<?php $smarty->caching = 1;
function smarty_block_dynamic($param, $content, &$smarty) { return $content; } $smarty->register_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}之间做任何事情,并可以保证这些内容不会和页面的其他内容一样被缓存。