
主题是一组定义表示层的文件。您还可以创建一个或多个“子主题”或主题变体。 只需要 .info.yml 文件,但大多数主题和子主题都会使用其他文件。本页列出了典型主题或子主题中的文件和文件夹。
主题的位置
您应该将主题放在 Drupal 安装的 "themes" 文件夹中。请注意,Drupal 的核心主题(如 Bartik 和 Seven)位于安装的 core/themes 文件夹中。
建议将贡献的主题放在 “contrib” 子文件夹中,而将您自己的主题放在 “custom” 文件夹中。
每个单独的主题都包含在以该主题名称命名的目录中。例如,fluffiness。名称必须小写,以字母开头,并使用下划线 (_) 代替空格。
您的 Drupal 安装的(部分)结构可能如下所示:


在主题中添加区域需要:
- 在
THEMENAME.info.yml
文件中添加区域的元数据。 - 编辑
page.html.twig
文件并输出新的区域。
注意:如果你在主题中声明了任何区域(哪怕只有一个),那么默认区域将不再适用,你需要自己声明所有希望使用的区域。
任何原来在已不存在区域中的区块(因为你未定义它们)都会被禁用——特别是当你编辑 THEMENAME.info.yml
并通过 drush cr
重建缓存时,你会看到类似这样的提示:
区块 themename_breadcrumbs 被分配到无效区域 breadcrumb,已被禁用。
如果你访问 /admin/structure/block
,所有被禁用的区块会显示在最上方,并带有 (已禁用) 标记。你可以通过拖动或使用“区域”下拉框重新分配它们,或者删除不再需要的区块。


本指南适用于主题。关于模块的说明,请参见 《在 Drupal 8 模块中添加样式表 (CSS) 和 JavaScript (JS)》。
在 Drupal 8 中,样式表 (CSS) 和 JavaScript (JS) 的加载通过相同的系统来完成,无论是模块(代码)还是主题,一切都依赖于 资源库 (libraries)。
为明确起见,这些说明仅适用于主题,不适用于模块。
Drupal 的高级原则:资源 (CSS 或 JS) 只有在你明确告诉 Drupal 需要加载时才会加载。Drupal 不会在每个页面上加载所有资源,因为那会降低界面性能。
与 Drupal 7 的区别
与 Drupal 7 相比,有六个重要的区别:


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 功能,以确保主题的前向兼容性。


Drupal 允许你覆盖所有用于生成 HTML 标记的模板,因此你可以完全控制在自定义主题中输出的标记。从高层级的 HTML 到最小的字段,每个页面元素都有模板。
覆盖模板
你可以通过在主题文件夹中添加符合特定命名约定的模板来覆盖 Drupal 的核心模板。
要覆盖模板,你需要:
1. 找到你要覆盖的模板。
2. 将模板文件从其基础位置复制到你的主题文件夹。
3. (可选)根据命名约定重命名模板,以便更具体地针对模板被使用的子集区域。
4. 根据需要修改模板。
一旦你将模板文件复制到主题并清除缓存,Drupal 将开始使用你的模板文件而不是核心版本。
你可以使用 Twig 调试工具来找出页面任何部分使用了哪些模板。


关于 Twig
Twig 是一个基于 PHP 的编译型模板语言。当你的网页被渲染时,Twig 引擎会获取模板并将其转换为“编译后的” PHP 模板,这些文件存储在受保护目录 sites/default/files/php/twig
中。编译只会执行一次,模板文件会被缓存以便重复使用,并在清除 Twig 缓存时重新编译。
Drupal Twig 的倡议与 Symfony 的动机相同:引入一个现代化、强大、基于 OOP 的引擎,使开发者能够专注于 Drupal 的正确开发。
1. Docblock
PHPTemplate:
<?php /** * @file * File description */ ?>
Twig:


在处理 Twig 模板文件时,大多数变量都会在模板文件的注释中进行说明。然而,当情况并非如此,或者主题或模块引入了新变量时,我们需要一种方法来检测模板中可用的所有变量。Twig 提供了 dump()
函数来检测和检查模板文件中的变量。
如果未启用调试,dump()
函数将不会输出任何内容。了解如何启用 Twig 调试。
启用后,dump()
函数可以用来在模板中输出某个变量或多个变量的信息。
检查单个变量
如果你的模板中有一个标题变量,以下代码会将其内容输出到模板中:
{{ dump(title) }}
检测模板中所有可用的变量
要输出模板中所有可用的变量及其内容,请在模板中添加以下内容(需要先启用调试):
{{ dump() }}
若只想输出可用变量的键名,请使用:




Twig 通常的工作方式
默认情况下,Twig 主题引擎会将模板编译成 PHP 代码,并将编译后的代码缓存在内存中。编译后的代码并不适合开发,因为 Twig 模板的修改不会立即在 Drupal 网站中生效。
在 Twig 完成某些标记的渲染后,Render API 还会增加一层缓存。它会将 Twig 生成的标记缓存起来,使得后续页面请求中 Twig 根本不会参与渲染,因此 Twig 的调试参数最终会被忽略。
虽然可以通过 Drupal 的缓存清理界面清空缓存,但在开发时,更简单的方式是修改 Drupal 配置,使 Twig 和 Render API 完全不进行缓存。
配置 Twig 和 Render API 以进行调试
Twig 和 Render API 各自有独立的调试设置:
