將模板片段輸出捕獲到變量,避免重複渲染、實現內容復用。
{capture name="header"}
<header>
<h1>{$site_title}</h1>
<nav>...</nav>
</header>
{/capture}
<div class="layout">
{$smarty.capture.header}
<main>{$content}</main>
{$smarty.capture.header} {* 復用 *}
</div>
name 時默認為 default{$smarty.capture.name}.clone(),但僅捕獲輸出文本直接在模板載入 .conf / .ini 配置,省去 PHP assign() 步驟。
pageTitle = "配置加載測試"
bodyBgColor = "#f5f5f5"
logo = "logo.png"
width = 120
height = 60
{config_load file="site.conf"}
<html>
<head><title>{#pageTitle#}</title></head>
<body bgcolor="{#bodyBgColor#}">
<img src="{#logo#}" width="{#width#}" height="{#height#}">
</body>
</html>
注意:配置文件需放在 Smarty 設定的 $config_dir 目錄(默認 ./configs/),變量用 {#var#} 訪問。
特殊業務需求下在模板執行 PHP 代碼,強烈不推薦常規使用,破壞模板分離原則。
{php}
global $db;
$rows = $db->query("SELECT * FROM notices LIMIT 5");
foreach ($rows as $row) {
echo "<div class='notice'>{$row['title']}</div>";
}
{/php}
替代方案:控制器預處理數據 assign('notices', $notices),模板用 {foreach} 渲染。
移除標籤間的空白字符(換行、縮進、多餘空格),減小傳輸體積、加快傳輸。
{strip}
<div class="card">
<h3>標題</h3>
<p>內容內容內容</p>
</div>
{/strip}
{* 輸出:標題
內容內容內容
*}
<pre>、<textarea> 等標籤內容$smarty->compile_check = false 可進一步提升性能類似 file_get_contents(),可將文件內容讀取到模板變量。
{fetch file="./data/announcement.txt" assign="announce"}
{if is_array($announce)}
<b>數組格式</b>
{else}
<div class="announce">{$announce}</div>
{/if}
assign 指定賦值變量名,省略則直接輸出{* 定義在 PHP 中:define('APP_VER', '2.1.0'); *}
版本:{$smarty.const.APP_VER}
{* 系統常量 *}
PHP版本:{$smarty.const.PHP_VERSION}
文件路徑:{$smarty.const.__FILE__}
無需 assign(),模板直接訪問所有已定義常量。
| 技巧 | 核心用途 | 推薦指數 | 注意事項 |
|---|---|---|---|
| capture | 片段復用、延遲輸出 | ⭐⭐⭐⭐⭐ | 避免過度嵌套 |
| config_load | 配置分離、多語言 | ⭐⭐⭐⭐ | 配置文件路徑配置 |
| php | 極特殊業務邏輯 | ⭐ | 破壞分層,慎用 |
| strip | HTML壓縮、傳輸優化 | ⭐⭐⭐⭐⭐ | 生產環境推薦開啟 |
| fetch | 靜態文件內嵌 | ⭐⭐ | I/O性能影響 |
| 常量訪問 | 版本號、配置常量展示 | ⭐⭐⭐ | 僅讀、無邏輯 |