Smarty 3 版本移除了舊版的 register_function(),改用統一的 registerPlugin() 方法註冊自訂函數、修飾器、區塊函數等擴充功能。本文以「重複輸出指定內容」為例,完整展示從 PHP 端撰寫函數邏輯、註冊外掛、到模板端呼叫的完整流程,並說明參數傳遞與回傳值處理的關鍵細節。
在模板中呼叫 {test times="4" con="hello world" size="3" color="green"},輸出 4 次指定字串,並套用字體大小與顏色樣式。
<?php
require_once("./libs/Smarty.class.php");
$smarty = new Smarty();
/**
* 自訂函數邏輯
* @param array $params 模板傳入的參數陣列
* @return string 輸出內容
*/
function test($params) {
$str = "";
for ($i = 0; $i < $params['times']; $i++) {
$str .= "<font size='{$params['size']}' color='{$params['color']}'>{$params['con']}</font>";
}
return $str;
}
// 註冊外掛:類型 function、模板呼叫名稱 test、PHP 函數名稱 test
$smarty->registerPlugin("function", "test", "test");
$smarty->display("temp.tpl");
?>
<html>
<h2>Smarty 自訂函數的使用</h2>
{test times="3" con="hello world" size="3" color="green"}
</html>
$smarty->registerPlugin(
"function", // 外掛類型:function(函數) / modifier(修飾器) / block(區塊函數)
"test", // 模板中呼叫的名稱 {test ...}
"test" // PHP 端實際函數名稱 function test($params) {}
);
第二、三參數可不同名,建立對應關係即可。
times="3" con="hello" → $params['times']=3, $params['con']='hello'(int)$params['times']{test ...} 標籤位置function test($params) {
// 設定預設值
$times = isset($params['times']) ? (int)$params['times'] : 1;
$con = isset($params['con']) ? $params['con'] : '';
$size = isset($params['size']) ? (int)$params['size'] : 3;
$color = isset($params['color']) ? $params['color'] : 'black';
$str = "";
for ($i = 0; $i < $times; $i++) {
$str .= "<font size='{$size}' color='{$color}'>{$con}</font>";
}
return $str;
}
| 錯誤現象 | 原因 | 解決方案 |
|---|---|---|
| 模板報錯 "unknown tag" | 未註冊或註冊名稱不符 | 檢查 registerPlugin 第二參數與模板呼叫名稱一致 |
| 輸出內容為空 | 函數用 echo 而非 return | 改用 return 回傳字串 |
| 參數無法取得 | 屬性名稱大小寫不匹配 | 統一使用小寫屬性名 |
| Smarty 3.1.8+ 報錯 | 使用舊版 register_function | 必須改用 registerPlugin |
Smarty 3 的 registerPlugin() 提供統一、強大的擴充機制。自訂函數讓模板能封裝重複輸出邏輯、整合第三方庫、實現複雜格式化等功能。核心要訣:函數接收參數陣列、處理邏輯、回傳字串,配合預設值處理與型別轉換,即可開發出健壯易用的模板擴充功能。