Skip to content

{function}

{function} 用于在模板中创建函数并像插件函数一样调用它们。与编写生成表现内容的插件相比,将其保留在模板中通常是更易管理的选择。它还简化了数据遍历,例如深度嵌套的菜单。

注意

模板函数是全局定义的。由于 Smarty 编译器是单通道编译器,{call} 标签必须用于调用在给定模板外部定义的模板函数。否则,你可以在模板中直接使用 {funcname ...} 来使用函数。

属性

属性名称 是否必须 描述
name 模板函数的名称
[var ...] 传递给模板函数的默认变量值
  • {function} 标签必须有 name 属性,该属性包含模板函数的名称。可以使用这个名称的标签来调用模板函数。

  • 默认的变量值可以作为属性传递给模板函数。就像在 PHP 函数声明中,你只能使用标量值作为默认值。当调用模板函数时,可以覆盖默认值。

  • 你可以在模板函数内部使用调用模板中的所有变量。在模板函数内部对变量的更改或新创建的变量具有局部作用域,并且在模板函数执行后在调用模板中不可见。

注意

当调用模板函数时,你可以传递任意数量的参数。参数变量不必在 {funcname ...} 标签中声明,除非你要使用默认值。默认值必须是标量,不能是变量。在调用模板时必须传递变量。

示例

{* 定义函数 *}
{function name=menu level=0}
{function menu level=0}          {* 简写 *}
  <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}

{* 创建一个数组进行演示 *}
{$menu = ['item1','item2','item3' => ['item3-1','item3-2','item3-3' =>
['item3-3-1','item3-3-2']],'item4']}

{* 通过函数运行数组 *}
{menu data=$menu}

将生成以下输出

* item1
* item2
* item3
      o item3-1
      o item3-2
      o item3-3
            + item3-3-1
            + item3-3-2
* item4

另请参见 {call}