{% macro %}

{%macro%}标签允许您在模板中定义自定义函数,类似于常规编程语言。

  1. {% macro input() %}
  2. ...
  3. {% endmacro %}

或者,您可以在结束标记之后包含标签的名称,以提高可读性:

  1. {% macro input() %}
  2. ...
  3. {% endmacro input %}

下面的例子定义了一个名为input()的函数,它接受4个参数,相关的值作为标记内部的变量进行访问。

  1. {% macro input(name, value, type, size) %}
  2. <input
  3. type="{{ type|default('text') }}"
  4. name="{{ name }}"
  5. value="{{ value|e }}"
  6. size="{{ size|default(20) }}" />
  7. {% endmacro %}

注意: 宏参数不指定默认值,并且始终被视为可选。

调用宏

在使用宏之前,需要先使用{%import%}标签“导入”它。 如果宏在同一模板中定义,则可以使用特殊的_self变量。

  1. {% import _self as form %}

这里宏函数被赋值给form变量,可以像任何其他函数一样被调用。

  1. <p>{{ form.input('username') }}</p>
  2. <p>{{ form.input('password', null, 'password') }}</p>

宏可以在主题部分中定义并按名称导入。 要从名为$macros/form.htm **的部分导入宏,只需在引用为字符串的import标记后传递名称即可。

  1. {% import 'macros/form' as form %}

或者,您可以从系统视图文件导入宏,这些宏将被接受。 要从$plugins/acme/blog/views/macros.htm导入**,只需传递路径提示即可。

  1. {% import 'acme.blog::macros' as form %}

嵌套宏

如果要在同一模板中的另一个宏中使用宏,则需要在本地导入它。

  1. {% macro input(name, value, type, size) %}
  2. <input
  3. type="{{ type|default('text') }}"
  4. name="{{ name }}"
  5. value="{{ value|e }}"
  6. size="{{ size|default(20) }}" />
  7. {% endmacro %}
  8. {% macro wrapped_input(name, value, type, size) %}
  9. {% import _self as form %}
  10. <div class="field">
  11. {{ form.input(name, value, type, size) }}
  12. </div>
  13. {% endmacro %}

上下文变量

宏无权访问当前页面变量。

  1. <!-- October CMS -->
  2. {{ site_name }}
  3. {% macro myFunction() %}
  4. <!-- NULL -->
  5. {{ site_name }}
  6. {% endmacro %}

您可以使用特殊的_context变量将变量传递给函数。

  1. {% macro myFunction(vars) %}
  2. {{ vars.site_name }}
  3. {% endmacro %}
  4. {% import _self as form %}
  5. <!-- October CMS -->
  6. {{ form.myFunction(_context) }}