Smarty 设计初衷是分离业务逻辑与展示逻辑,但实际开发中偶尔需要在模板中直接使用 PHP 函数。本文系统梳理 Smarty 调用 PHP 内置函数、修饰符语法、数组处理特殊语法及自定义函数注册的完整用法。
Smarty 使用 | 管道符调用修饰符,本质上映射为 PHP 函数调用:
{'param1'|functionName:'param2':'param3'}
等同于 PHP:
echo functionName('param1', 'param2', 'param3');
{* 字符串截取 *}
{'1234567'|substr:'1':'2'} {* 输出: 23 *}
{* 字符串替换,注意参数顺序 *}
{'a'|str_replace:'A':'abcd'} {* 输出: Abcd *}
当对数组调用 count、end 等函数时,直接使用 {$arr|count} 会返回字符串 "Array" 而非长度。需加 @ 前缀:
{* 正确获取数组长度 *}
{$arr|@count}
{* 获取数组最后一个元素 *}
{$arr|@end}
Smarty 解析修饰符时,检测到 @ 前缀会将数组作为整体传递给函数,而非遍历数组元素逐个调用。测试结论:
@@ 均可复杂逻辑建议封装为自定义函数并注册,而非在模板中拼接多个修饰符。
<?php
/**
* 中英文混合字符串截取(按字符数而非字节数)
* @param array $params 包含 text, length 键
* @return string
*/
function SmartyLen($params) {
extract($params); // 导入 text, length 变量
$len = strlen($text);
$max = $length;
for ($i = 0; $i < $length; $i++) {
$chr = substr($text, $i, 1);
if (ord($chr) > 0x80) { // 双字节字符
$length++;
$i++;
$len--;
}
}
$str = substr($text, 0, $length);
if ($len > $max) $str .= "...";
return $str;
}
?>
$smarty->register_function('len', "SmartyLen");
{len text="测试内容" length="10"}
注意:参数名必须与函数内 extract($params) 期望的变量名一致。
Smarty 3.x 对比 2.x 增强了 registerPlugin 统一注册接口,推荐使用:
$smarty->registerPlugin('function', 'len', 'SmartyLen');