控制插件输出的可缓存性

    自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}之间做任何事情,并可以保证这些内容不会和页面的其他内容一样被缓存。