logo

额外区块类型 (EBT) - 全新的布局构建器体验❗

额外区块类型 (EBT) - 样式化、可定制的区块类型:幻灯片、标签页、卡片、手风琴等更多类型。内置背景、DOM Box、JavaScript 插件的设置。立即体验布局构建的未来。

演示 EBT 模块 下载 EBT 模块

❗额外段落类型 (EPT) - 全新的 Paragraphs 体验

额外段落类型 (EPT) - 类似的基于 Paragraph 的模块集合。

演示 EPT 模块 滚动

滚动
02/10/2025, by Ivan

要了解哪个模板为特定元素生成标记,可以使用 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 模板»。

02/10/2025, by Ivan

Twig 中的过滤器可用于修改变量。过滤器通过管道符号分隔。它们可以带有括号中的可选参数。多个过滤器可以链式使用,一个过滤器的输出会传递给下一个。

示例:

{{ content|safe_join(", ")|lower }}

有时你需要在过滤之前先渲染元素:

{{ item|render|filter }}

Twig 自带了许多内置过滤器,你可以在其 官方文档 中查看。Drupal 也有许多自己的过滤器。

Drupal 专用过滤器

它们在 TwigExtension::getFilters() 中定义。

02/10/2025, by Ivan

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

02/10/2025, by Ivan

为了让 Drupal 8 的主题系统发挥最大性能,并在 Twig 模板中提供更多自定义可能性,请遵循以下建议:

本指南旨在帮助那些有 Drupal 7 开发经验的开发者,他们可能还习惯使用 theme() 或 drupal_render() 这样的函数,但这些函数在 Drupal 8+ 中已经不再推荐使用。文中的「之前」示例通常采用 Drupal 7 风格的代码。

在预处理函数中返回渲染数组

在预处理函数中始终返回渲染数组,而不是调用 theme() 或 drupal_render()。

02/10/2025, by Ivan

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() 文档

02/10/2025, by Ivan
子主题 与其他主题类似,唯一的区别在于:它们会继承父主题的资源。子主题和其父主题之间的继承链没有限制。一个子主题可以是另一个子主题的子级,并且它可以根据需要被分支和组织。这正是子主题具有巨大潜力的原因。

要创建子主题,请像定义其他主题一样定义它,并使用 「base theme」 键声明其基础主题。(注意,该键没有下划线。)

子主题示例: Fluffiness

Fluffiness 是一个使用 Classy 作为基础主题的子主题示例。

这是文件夹结构,你将会得到如下文件:

02/10/2025, by Ivan

Classy 是 Drupal 8 的核心基础主题,也是 Bartik 和 Seven 使用的基础主题。Classy(及其子主题)中的 HTML 标记包含了结构良好的 CSS 类,其命名方式类似于 BEMSMACSS 的 CSS 命名约定。

虽然 Classy 所采用的 BEM / SMACSS 风格的命名约定非常高效,并且提供了许多便利,但它并不适用于每一个项目。对于不需要 Classy CSS 类的人来说,可以选择其他基础主题。

选择 Classy,当

你希望在 HTML 中已经包含结构良好的 CSS 类。Classy 基础主题减少了(有时甚至完全避免了)在 HTML 中额外添加类的需求。

 

02/10/2025, by Ivan

记录 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