Smarty控制插件輸出緩衝

Controlling Cacheability of Plugins' Output控制插件輸出的緩衝能力

自從Smarty-2.6.0插件以來,如果註冊它們,則插件的緩存能力能夠被重新聲明的。register_block,register_compiler_function 和register_function的第3個參數就是$ cacheable , 並且它的值默認爲true。當然,在2.6.0版本之前它的默認值也是這樣的。

當用$cacheable=false來這冊一個插件,則每次這個頁面被輸出的時候,這個插件就會被使用,即使這個頁面來自緩存。這個插件函數的行爲有點像這個函數insert。

和{insert}相反,插件的屬性默認是不緩存的。通過使用第四個參數 $cache_attrs ,它們能夠被重新聲明爲緩存的。 $cache_attrs 是一個屬性名字的數組,可以被緩存,所以每次當它被從緩存中取出的時候,這個插件函數獲得值-----因爲這個頁面會被寫入用來緩存。

Example 14-10. Preventing a plugin's output from being cached

例14-10.阻止插件從緩存中輸出

index.php:

require('Smarty.class.php');
$smarty = new Smarty;
$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')) {
// fetch $obj from db and assign...
$smarty->assign_by_ref('obj', $obj);
}

$smarty->display('index.tpl');
// by www.yiibai.com/smarty

index.tpl:

Time Remaining: {remain endtime=$obj->endtime}

直到$obj運行結束,時間的秒數在每一個頁面輸出的時候會改變,即使這個頁面被緩存。只要結束時間屬性被緩存,當頁面被寫入到緩存但是沒有對這個頁面接着的請求的時候對象只是不得不重新從數據庫裏取出而已。

Example 14-11. Preventing a whole passage of a template from being cached

例14-11.阻止一個模板文件的 整篇被緩存

index.php:

require('Smarty.class.php');
$smarty = new Smarty;
$smarty->caching = true;

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}之間作任何事情,並且保證它將不會像剩下的頁面一樣被緩存。