Smarty简介
为何使用Smarty?
使用案例和工作流
语法对比
模板继承
最佳实践
速成课程
{函数}
用于在模板中创建函数,并像插件函数一样调用它们。与其编写生成展示内容的插件相比,将其保留在模板中通常是一种更易于管理的选择。它还可以简化遍历数据,例如层级很深的菜单。
模板函数被定义为全局函数。由于 Smarty 编译器是单次传递编译器,所以{call}
标记必须用于调用从给定模板中外部定义的模板函数。否则,您可以在模板中直接使用函数,例如{funcname ...}
。
{函数}
标记必须具有name
属性,其中包含模板函数的名称。具有此名称的标签可用于调用模板函数。
可以将变量的默认值作为属性传递给模板函数。与 PHP 函数声明一样,您只能使用标量值作为默认值。当调用模板函数时,可以覆盖默认值。
您可以在模板函数中使用来自调用模板的所有变量。在模板函数中对变量进行更改或创建新变量具有局部作用域,并且在执行模板函数后调用模板中不可见。
属性
属性名称 | 类型 | 是否必须 | 默认值 | 描述 |
---|---|---|---|---|
名称 | 字符串 | 是 | 不适用 | 模板函数的名称 |
[var ...] | [var type] | 否 | 不适用 | 传递给模板函数的局部默认变量值 |
可以在调用模板函数时向其传递任意数量的参数。除非希望使用默认值,否则不得在{funcname ...}
标记中声明参数变量。默认值必须为标量,并且不能是变量。必须在调用模板时传递变量。
示例7.43 递归菜单{函数}示例
{* define the function *} {function name=menu level=0} {function menu level=0} {* short-hand *} <ul class="level{$level}"> {foreach $data as $entry} {if is_array($entry)} <li>{$entry@key}</li> {menu data=$entry level=$level+1} {else} <li>{$entry}</li> {/if} {/foreach} </ul> {/function} {* create an array to demonstrate *} {$menu = ['item1','item2','item3' => ['item3-1','item3-2','item3-3' => ['item3-3-1','item3-3-2']],'item4']} {* run the array through the function *} {menu data=$menu}
将生成以下输出
* item1 * item2 * item3 o item3-1 o item3-2 o item3-3 + item3-3-1 + item3-3-2 * item4
另请参见 {call}