
要了解哪个模板为特定元素生成标记,可以使用 Twig 的内置 debug 选项。该参数会在输出的 HTML 中显示注释,其中包括所使用的主题钩子、推荐的模板文件名,以及用于渲染某个部分的确切 Twig 文件。
在 sites/default/services.yml
中启用 Twig 调试,在 twig.config
部分设置 debug: true
(在生产环境请关闭)。如果你在多站点模式下使用 Drupal 8,应编辑对应站点目录下的 sites/currenttsite/services.yml
文件。如果 services.yml
尚不存在,可以从 sites/default/default.services.yml
复制一份并重命名为 services.yml
。详细的 Twig 调试方法参见 «调试已编译的 Twig 模板»。


Twig 中的过滤器可用于修改变量。过滤器通过管道符号分隔。它们可以带有括号中的可选参数。多个过滤器可以链式使用,一个过滤器的输出会传递给下一个。
示例:
{{ content|safe_join(", ")|lower }}
有时你需要在过滤之前先渲染元素:
{{ item|render|filter }}
Twig 自带了许多内置过滤器,你可以在其 官方文档 中查看。Drupal 也有许多自己的过滤器。
Drupal 专用过滤器
它们在 TwigExtension::getFilters() 中定义。




来自 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 原生函数有几个不同点:


为了让 Drupal 8 的主题系统发挥最大性能,并在 Twig 模板中提供更多自定义可能性,请遵循以下建议:
本指南旨在帮助那些有 Drupal 7 开发经验的开发者,他们可能还习惯使用 theme() 或 drupal_render() 这样的函数,但这些函数在 Drupal 8+ 中已经不再推荐使用。文中的「之前」示例通常采用 Drupal 7 风格的代码。
在预处理函数中返回渲染数组
在预处理函数中始终返回渲染数组,而不是调用 theme() 或 drupal_render()。


Drupal 8 的总体理念是避免在自定义模块的 PHP 代码中直接生成 HTML。你应该将这些交给 Twig 模板来处理。要在你的模块中创建新的 Twig 模板,请执行以下步骤。
步骤 1:在 .module 文件中定义 hook_theme
如果 [module].module 文件还不存在,请创建它,并添加定义每个 Twig 模板的代码。数组中每个元素的键是你之后调用模板时需要使用的名称。注意不要在文件名中使用连字符。
function test_twig_theme($existing, $type, $theme, $path) { return [ 'my_template' => [ 'variables' => ['test_var' => NULL], ], ]; }
参见 hook_theme() 文档。


Twig 模板可以使用以下语法进行扩展:
{% extends 'html.twig' %}
更多详情请参阅 https://symfony.com/doc/current/templates.html#template-inheritance-and-layouts


子主题 与其他主题类似,唯一的区别在于:它们会继承父主题的资源。子主题和其父主题之间的继承链没有限制。一个子主题可以是另一个子主题的子级,并且它可以根据需要被分支和组织。这正是子主题具有巨大潜力的原因。
要创建子主题,请像定义其他主题一样定义它,并使用 「base theme」 键声明其基础主题。(注意,该键没有下划线。)
子主题示例: Fluffiness
Fluffiness 是一个使用 Classy 作为基础主题的子主题示例。
这是文件夹结构,你将会得到如下文件:


Classy 是 Drupal 8 的核心基础主题,也是 Bartik 和 Seven 使用的基础主题。Classy(及其子主题)中的 HTML 标记包含了结构良好的 CSS 类,其命名方式类似于 BEM 和 SMACSS 的 CSS 命名约定。
虽然 Classy 所采用的 BEM / SMACSS 风格的命名约定非常高效,并且提供了许多便利,但它并不适用于每一个项目。对于不需要 Classy CSS 类的人来说,可以选择其他基础主题。
选择 Classy,当 |
你希望在 HTML 中已经包含结构良好的 CSS 类。Classy 基础主题减少了(有时甚至完全避免了)在 HTML 中额外添加类的需求。
|


记录 Drupal8 RC 2 classy 主题中所有的 CSS 类选择器。
格式:
.foo { }
.foo-bar { }
filename.html.twig / filename.css
Twig - Classy 主题中可用的 CSS 选择器:
布局(LAYOUT)
Body
.user-logged-in { }
.path-frontpage { }
.path-[root_path] { }
.node--type-[node_type] { }
.db-offline { }
.visually-hidden { }
.focusable { }
.skip-link { }
文件: html.html.twig
