頁面整體快取,但部分需動態內容(如廣告條、即時時間、用戶資訊)不應被快取。Smarty 提供三種機制實現局部動態。
{insert} 標籤模板 index.tpl:
<div>{insert name="get_current_time"}</div>
PHP:
function insert_get_current_time($params, &$smarty) {
return date("Y-m-d H:i:s");
}
$smarty = new Smarty();
$smarty->caching = true;
if (!$smarty->is_cached('index.tpl')) {
// 只在未快取時執行的邏輯(如資料庫查詢)
}
$smarty->display('index.tpl');
特點:函數名固定格式 insert_名稱,參數可選,每次顯示皆執行。
register_function 註冊自訂函數模板:
<div>{current_time}</div>
PHP:
function smarty_function_current_time($params, &$smarty) {
return date("Y-m-d H:i:s");
}
$smarty = new Smarty();
$smarty->caching = true;
// 第三參數 false 表示不快取輸出
$smarty->register_function('current_time', 'smarty_function_current_time', false);
if (!$smarty->is_cached('index.tpl')) { /* ... */ }
$smarty->display('index.tpl');
特點:以插件形式註冊,標籤名自訂,cacheable=false 強制動態執行。
register_block 區塊函數適用於整段區塊動態(如廣告輪播區):
function smarty_block_dynamic_ads($params, $content, &$smarty, &$repeat) {
if ($repeat) return; // 只執行一次
// 取得廣告內容
return get_ads_html();
}
$smarty->register_block('dynamic_ads', 'smarty_block_dynamic_ads', false);
模板:
{dynamic_ads}{/dynamic_ads}
{insert name="func" arg1="val1"} → $params['arg1'] 可取得。&$smarty 可存取 Smarty 物件所有屬性方法。| 方法 | 適用場景 | 標籤語法 | 快取控制 |
|---|---|---|---|
{insert} | 單一動態值 | {insert name="xxx"} | 內建不快取 |
register_function | 自訂函數標籤 | {func_name} | 註冊時指定 cacheable=false |
register_block | 整段區塊動態 | {block_name}...{/block_name} | 註冊時指定 cacheable=false |