子主题
子主题 与其他主题类似,唯一的区别在于:它们会继承父主题的资源。子主题和其父主题之间的继承链没有限制。一个子主题可以是另一个子主题的子级,并且它可以根据需要被分支和组织。这正是子主题具有巨大潜力的原因。
要创建子主题,请像定义其他主题一样定义它,并使用 「base theme」 键声明其基础主题。(注意,该键没有下划线。)
子主题示例: Fluffiness
Fluffiness 是一个使用 Classy 作为基础主题的子主题示例。
这是文件夹结构,你将会得到如下文件:
themes/
└── fluffiness/
├── fluffiness.info.yml
└── fluffiness.libraries.yml
信息文件名为 fluffiness.info.yml:
name: Fluffiness type: theme description: This is a fluffy sub theme of Classy core: 8.x # 定义基础主题 base theme: classy # 定义可以添加 css/js 的库组 libraries: - fluffiness/global-styling # 区域 regions: header: Header featured: Featured content: Content sidebar_first: First sidebar sidebar_second: Second sidebar footer: Footer
包含 fluffiness.libraries.yml 文件,以便在上面定义的全局样式组中添加 css / js:
global-styling:
css:
component:
css/style.css: {}
在这里了解更多关于在 Drupal 8 主题中添加 CSS 和 JavaScript 的内容。
如果你想使用其他名称替代「fluffiness」,只需将所有「fluffiness」替换为你的名称(包括文件夹名称)。例如:
themes/
└── my_custom_theme/
├── my_custom_theme.info.yml
└── my_custom_theme.libraries.yml
在 info.yml 文件中的「name:」行输入的文本是任意的,并不一定要和子主题文件名完全一致。例如,可以这样写:
name: My Custom Theme # (其他行省略)
子主题的子主题
当创建子主题的子主题时,你必须将子主题指定为基础主题。
- Fluffiness:Classy 的第一个子主题
name: Fluffiness type: theme description: This is a fluffy sub theme of Classy core: 8.x # 定义基础主题 base theme: classy
- Shaved:Fluffiness 的子主题(Classy 的子子主题)
name: Shaved type: theme description: This is a reduced fluff sub theme of Fluffiness core: 8.x # 定义基础主题 base theme: fluffiness
注意,base theme: 参数是基础主题的 machine name,而 name: 参数是描述性名称。
区域继承
主题区域不会从指定的基础主题继承。如果你的子主题 info.yml 文件中的 region: 参数为空或未包含基础主题中的所有区域,那么 Drupal 的默认区域可能会被用作替代,以便在子主题中放置区块。强烈建议将基础主题中定义的所有区域复制到子主题的 info.yml 文件中。
# 因为区域不会继承,所以必须在子主题中定义所有区域, # 包括标准 Drupal 区域和基础主题区域。 # 此示例展示了一个子主题如何利用标准区域(1), # 复制基础主题中的自定义区域(2), # 并添加三个“colophon”相关的区域(3)。 regions: # 1. Drupal 标准区域(基础主题也定义和使用)。 # 2. 从基础主题复制的区域。 # 3. 子主题自定义区域。 header: 'Header' # 1 primary_menu: 'Main menu' # 1 secondary_menu: 'Secondary menu' # 1 highlighted: 'Highlighted' # 1 help: 'Help' # 1 section_nav: 'Section Nav' # 2 breadcrumb: 'Breadcrumb' # 1 page_title: 'Page Title' # 2 local_tasks: 'Local Tasks' # 2 content: 'Content (Constrained)' # 1 content_fullwidth: 'Content (Edge-to-edge)' # 2 colophon_first: 'Colophon First Col' # 3 colophon_second: 'Colophon Second Col' # 3 colophon_third: 'Colophon Third Col' # 3 footer: 'Footer' # 1
区块配置继承
在 Drupal 8 中,主题可以包含 config/install/ 文件夹,其中的预设区块配置(包括区域放置)会在启用主题时被导入。Drupal 可以继承这些配置和放置,但如果子主题 info.yml 文件中定义的区域与基础主题中的区域不匹配,就可能出现区块被随机放置在不可预期区域的情况。
区块模板继承
如果被扩展的主题包含自定义区块模板,它们不会立即被继承,因为子主题会创建父主题区块的副本,并为其加上子主题名称作为前缀。Twig 区块模板来源于区块名称,因此会打破这些模板与区块之间的关系。目前的修复方法需要在子主题中进行处理。按照上面的示例,我们在子主题目录中创建一个名为 shaved.theme 的文件,并插入以下 hook:
/**
* Implements hook_theme_suggestions_HOOK_alter for blocks.
*/
function shaved_theme_suggestions_block_alter(&$suggestions, $variables) {
// 从父主题加载区块的主题建议
foreach ($suggestions as &$suggestion) {
$suggestion = str_replace('shaved_', 'fluffiness_', $suggestion);
}
}
在你自己的子主题中,将「shaved」替换为子主题的名称,将「fluffiness」替换为基础主题的名称。
与 Drupal 7 的区别
与 Drupal 7 最显著的区别在于,.info 文件被替换为 .info.yml 文件,它们使用 YAML 语法。