logo

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

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

演示 EBT 模块 下载 EBT 模块

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

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

演示 EPT 模块 滚动

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

要创建子主题,请像定义其他主题一样定义它,并使用 「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 语法。