滚动
Макросы в шаблонах Twig
来自 Twig 官方文档: 「宏(Macros)类似于常见编程语言中的函数。它们对于将经常使用的 HTML 片段组织为可复用的元素非常有用,可以避免重复编写代码。」
{% macro input(name, value, type, size) %}
<input type="{{ type|default('text') }}" name="{{ name }}" value="{{ value|e }}" size="{{ size|default(20) }}" />
{% endmacro %}
宏与 PHP 原生函数有几个不同点:
- 参数的默认值是在宏体内使用 default 过滤器定义的;
- 宏的参数始终是可选的;
- 如果传递了额外的位置参数,它们会存储在一个特殊的变量 varargs 中,作为值的列表。
但与 PHP 函数一样,宏无法访问模板中的当前变量。你可以使用特殊变量 _context 将整个上下文作为参数传递。
调用宏
来自 _self
宏可以定义在与调用它的 Twig 模板中。在这种情况下使用 _self 上下文 …
{{ _self.input(name, value, type, size) }}
来自外部文件
不过,更推荐将宏放在单独的文件(如 macros.twig)中,以便在多个模板中复用。
例如,在自定义主题「mytheme」中,我们可以这样放置宏文件 …
[site_root]/themes/custom/mytheme/templates/macros.twig
注意:宏文件可以有任意名字 any.twig,但不能使用 .html 扩展名(即 macros.html.twig 不会生效)。该文件必须放在「templates」目录中,无论在何处使用(例如 Layout Builder 布局放在 .../mytheme/layouts 中时,宏文件依然必须存在于 ../mytheme/templates)。
在需要使用宏的模板中,添加导入语句:
{% import '@mytheme/macros.twig' as myMacros %}
@mytheme 会自动定位到你主题的「templates」目录,但如果有子目录结构,则需要在导入语句中指定,例如:
{% import '@mytheme/foo/bar/macros.twig' as myMacros %}
请注意,早期文档中提到不需要定义子目录结构,但这可能因版本不同而异。如果你在自定义模块中使用相同方法,请用模块名代替主题名(例如 @mycustommodule)。
然后就可以使用宏 …
{{ myMacros.input(name, value, type, size) }}
示例
在 Drupal 8 中,宏常用于生成例如主导航(见 menu.html.twig 文件)。