W3Cschool
恭喜您成為首批注冊用戶
獲得88經驗值獎勵
通常情況下,開啟緩存可以讓整個最終輸出的頁面被緩存下來。 然而,Smarty 3提供了幾種在輸出緩存中控制部分區(qū)域不進行緩存的方法。
注意在不緩存的區(qū)域內使用的全部變量,在頁面每次加載時都會從PHP里重新賦值。
模板內的一塊區(qū)域可以很容易地通過 {nocache}
和{/nocache}
標簽來設置不進行緩存。
Example 15.10. 使模板的一塊區(qū)域不進行緩存
今天是: {nocache} {$smarty.now|date_format} {/nocache}
上面的代碼將在一個緩存的頁面上輸出當前日期時間。
控制單個標簽不進行緩存,可以為其加入"nocache"的屬性。
Example 15.11. 讓標簽內容不進行緩存
今天是: {$smarty.now|date_format nocache}
你可以通過assign()
來控制變量值不進行緩存。
如果一個變量被設置了不緩存,那么它在頁面每次加載時都會從PHP里重新賦值。
變量不緩存的設置,會在編譯后的代碼中起效。所以如果你重新設置了某個變量不緩存,那么你需要刪除已經存在的編譯和緩存文件,使得模板可以重新編譯并起效。
Example 15.12. 控制變量不緩存
// 賦值$foo,并將其設置成不緩存的變量 $smarty->assign('foo',time(),true); 動態(tài)的時間值是: {$foo}
你可以在注冊一個插件時,同時控制插件的緩存。 registerPlugin()
的第三個參數是$cacheable
,其默認是TRUE
。
當你注冊一個插件時,同時設置$cacheable=false
, 那么插件會在每次頁面顯示的時候都被調用,即使頁面整體已經被緩存了。 插件函數的這個行為和{insert}
很相似。
插件不緩存的設置,會在編譯后的代碼中起效。所以如果你重新設置了某個插件不緩存,那么你需要刪除已經存在的編譯和緩存文件,使得模板可以重新編譯并起效。
對比{insert}
也可以默認讓插件不進行緩存。 它們可以通過第四個參數$cache_attrs
來定義進行緩存。 $cache_attrs
定義了一個需要進行緩存的屬性數組, 然后這些屬性會被寫入緩存,以供插件每次執(zhí)行的時候直接讀取。
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. 使模板內一部分區(qū)域不緩存
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
的內容:
頁面創(chuàng)建于: {'0'|date_format:'%D %H:%M:%S'} {dynamic} 現在時間是: {'0'|date_format:'%D %H:%M:%S'} ... 做些其他事情 ... {/dynamic}
刷新頁面后你可以發(fā)現兩個日期的不同。一個是“動態(tài)的”,另一個是“靜態(tài)的”。 你可以像上面的代碼一樣把任何東西放{dynamic}...{/dynamic}
標簽內,來使其不緩存。
上面的例子是展示了動態(tài)的區(qū)塊插件是如何工作的。 參見如何通過{nocache}
和 {/nocache}
標簽來進行模板區(qū)域緩存控制
。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯系方式:
更多建議: