Smarty 的 {capture} 函數是模板開發中的利器,它能攔截區塊輸出內容並存入變數,而非直接顯示。這在需要動態生成內容、重複使用片段或結構化輸出時極為實用。本文深入解析 capture 的三種核心用法,並提供可直接套用的程式碼範例。
| 模式 | 關鍵屬性 | 存取方式 | 適用場景 |
|---|---|---|---|
| 名稱捕獲 | name | {$smarty.capture.名稱} | 簡單片段複用、跨區塊調用 |
| 指定變數 | assign | {$變數名} | 邏輯判斷後輸出、變數傳遞 |
| 陣列累加 | append | {$陣列名} (配合 foreach) | 動態收集列表、迴圈內容聚合 |
{* 模式 1:名稱捕獲 *}
{capture name="banner"}aaaaaa{/capture}
{$smarty.capture.banner}
<hr />
{* 模式 2:指定變數捕獲 *}
{capture assign="foo"}bbbbbb{/capture}
{$foo}
<hr />
{* 模式 3:陣列累加捕獲 *}
{capture append="arr"}hello{/capture}
{capture append="arr"}world{/capture}
{foreach $arr as $value}
{$value}
{/foreach}
使用 name 屬性指定捕獲名稱,內容存放於 $smarty.capture.名稱 中。特點是全域可存取,適合在不同區塊間共享內容。
使用 assign 直接指定目標變數名,內容存入 $變數名。此法更直觀,變數作用域限於當前模板,適合邏輯控制流程中使用。
使用 append 將多次捕獲內容依序推入陣列。搭配 foreach 迴圈輸出,極適合動態生成選單、清單等結構化資料。
{capture} 巢狀,內層捕獲不會干擾外層。{if} 判斷,只在特定條件下捕獲內容。assign 模式比 name 模式略快,因避免了 $smarty.capture 陣列查找。掌握 capture 三種模式,能讓 Smarty 模板邏輯更靈活、程式碼更乾淨。依據使用情境選擇適當模式:跨區塊共用用 name、邏輯控制用 assign、動態列表用 append。