logo

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

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

演示 EBT 模块 下载 EBT 模块

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

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

演示 EPT 模块 滚动

滚动
03/10/2025, by Ivan

主题是一组定义表示层的文件。您还可以创建一个或多个“子主题”或主题变体。 只需要 .info.yml 文件,但大多数主题和子主题都会使用其他文件。本页列出了典型主题或子主题中的文件和文件夹。

主题的位置

您应该将主题放在 Drupal 安装的 "themes" 文件夹中。请注意,Drupal 的核心主题(如 Bartik 和 Seven)位于安装的 core/themes 文件夹中。

建议将贡献的主题放在 “contrib” 子文件夹中,而将您自己的主题放在 “custom” 文件夹中。

每个单独的主题都包含在以该主题名称命名的目录中。例如,fluffiness。名称必须小写,以字母开头,并使用下划线 (_) 代替空格。

您的 Drupal 安装的(部分)结构可能如下所示:

03/10/2025, by Ivan

在主题中添加区域需要:

  • THEMENAME.info.yml 文件中添加区域的元数据。
  • 编辑 page.html.twig 文件并输出新的区域。

注意:如果你在主题中声明了任何区域(哪怕只有一个),那么默认区域将不再适用,你需要自己声明所有希望使用的区域。

任何原来在已不存在区域中的区块(因为你未定义它们)都会被禁用——特别是当你编辑 THEMENAME.info.yml 并通过 drush cr 重建缓存时,你会看到类似这样的提示:

区块 themename_breadcrumbs 被分配到无效区域 breadcrumb,已被禁用。

如果你访问 /admin/structure/block,所有被禁用的区块会显示在最上方,并带有 (已禁用) 标记。你可以通过拖动或使用“区域”下拉框重新分配它们,或者删除不再需要的区块。

03/10/2025, by Ivan

本指南适用于主题。关于模块的说明,请参见 《在 Drupal 8 模块中添加样式表 (CSS) 和 JavaScript (JS)》

在 Drupal 8 中,样式表 (CSS) 和 JavaScript (JS) 的加载通过相同的系统来完成,无论是模块(代码)还是主题,一切都依赖于 资源库 (libraries)

为明确起见,这些说明仅适用于主题,不适用于模块。

Drupal 的高级原则:资源 (CSS 或 JS) 只有在你明确告诉 Drupal 需要加载时才会加载。Drupal 不会在每个页面上加载所有资源,因为那会降低界面性能。

与 Drupal 7 的区别

与 Drupal 7 相比,有六个重要的区别:

03/10/2025, by Ivan

Twig 是一个 PHP 的模板引擎,它是 Symfony2 框架 的一部分。

在 Drupal 8 中,Twig 取代了 PHPTemplate,成为默认的模板引擎。这一变化的结果之一是,所有基于 PHPTemplate 的 theme_* 函数和 *.tpl.php 文件都被替换为 *.html.twig 模板文件。

请注意,Drupal 8 目前使用的是 Twig 1.x 版本。然而,从 Drupal 8.7 开始以及更高版本都兼容 Twig 2.x。在这些版本中 Twig 的某些功能有所不同,因此主题开发者应避免使用已弃用的 Twig 功能,以确保主题的前向兼容性。

03/10/2025, by Ivan

Drupal 允许你覆盖所有用于生成 HTML 标记的模板,因此你可以完全控制在自定义主题中输出的标记。从高层级的 HTML 到最小的字段,每个页面元素都有模板。

覆盖模板

你可以通过在主题文件夹中添加符合特定命名约定的模板来覆盖 Drupal 的核心模板。

要覆盖模板,你需要:

1. 找到你要覆盖的模板。
2. 将模板文件从其基础位置复制到你的主题文件夹。
3. (可选)根据命名约定重命名模板,以便更具体地针对模板被使用的子集区域。
4. 根据需要修改模板。

一旦你将模板文件复制到主题并清除缓存,Drupal 将开始使用你的模板文件而不是核心版本。

你可以使用 Twig 调试工具来找出页面任何部分使用了哪些模板。

03/10/2025, by Ivan

关于 Twig

Twig 是一个基于 PHP 的编译型模板语言。当你的网页被渲染时,Twig 引擎会获取模板并将其转换为“编译后的” PHP 模板,这些文件存储在受保护目录 sites/default/files/php/twig 中。编译只会执行一次,模板文件会被缓存以便重复使用,并在清除 Twig 缓存时重新编译。

Drupal Twig 的倡议与 Symfony 的动机相同:引入一个现代化、强大、基于 OOP 的引擎,使开发者能够专注于 Drupal 的正确开发。

1. Docblock

PHPTemplate:

<?php 
/** 
 * @file
 * File description
 */
?>

Twig:

03/10/2025, by Ivan

在处理 Twig 模板文件时,大多数变量都会在模板文件的注释中进行说明。然而,当情况并非如此,或者主题或模块引入了新变量时,我们需要一种方法来检测模板中可用的所有变量。Twig 提供了 dump() 函数来检测和检查模板文件中的变量。

如果未启用调试,dump() 函数将不会输出任何内容。了解如何启用 Twig 调试。

启用后,dump() 函数可以用来在模板中输出某个变量或多个变量的信息。

检查单个变量

如果你的模板中有一个标题变量,以下代码会将其内容输出到模板中:

{{ dump(title) }}

检测模板中所有可用的变量

要输出模板中所有可用的变量及其内容,请在模板中添加以下内容(需要先启用调试):

{{ dump() }}

若只想输出可用变量的键名,请使用:

02/10/2025, by Ivan

Twig 通常的工作方式

默认情况下,Twig 主题引擎会将模板编译成 PHP 代码,并将编译后的代码缓存在内存中。编译后的代码并不适合开发,因为 Twig 模板的修改不会立即在 Drupal 网站中生效。

在 Twig 完成某些标记的渲染后,Render API 还会增加一层缓存。它会将 Twig 生成的标记缓存起来,使得后续页面请求中 Twig 根本不会参与渲染,因此 Twig 的调试参数最终会被忽略。

虽然可以通过 Drupal 的缓存清理界面清空缓存,但在开发时,更简单的方式是修改 Drupal 配置,使 Twig 和 Render API 完全不进行缓存。

配置 Twig 和 Render API 以进行调试

Twig 和 Render API 各自有独立的调试设置: