Подтемы
Подтемы, как и любая другая тема, отличаются одним отличием: они наследуют ресурсы родительской темы. Нет никаких ограничений в возможностях цепочки, соединяющих подтемы с их родителями. Подтема может быть дочерней по отношению к другой подтеме, и она может быть разветвленной и организованной, как вы считаете нужным. Это то, что дает подтемам большой потенциал.
Чтобы создать подтему, определите ее как любую другую тему и объявите ее базовую тему с помощью клавиши «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
# Defines the base theme
base theme: classy
# Defines libraries group in which we can add css/js.
libraries:
- fluffiness/global-styling
# Regions
regions:
header: Header
featured: Featured
content: Content
sidebar_first: First sidebar
sidebar_second: Second sidebar
footer: Footer
Включите файл fluffiness.libraries.yml, чтобы добавить css / js в группу глобальных стилей, определенную выше в разделе library: key.
global-styling:
css:
component:
css/style.css: {}
Узнайте больше о добавлении таблиц стилей (CSS) и JavaScript (JS) в тему Drupal 8.
Если вы хотите использовать другое имя вместо «fluffiness», просто замените все вхождения «fluffiness» на свое имя («все вхождения» также включает имя папки). Например:
themes/
└── my_custom_theme/
├── my_custom_theme.info.yml
└── my_custom_theme.libraries.yml
Текст, который вы вводите в строку «name:» файла info.yml, имеет произвольную форму и не обязательно должен точно соответствовать имени файла вашей подтемы. Например, это может быть так:
name: My Custom Theme
# (all the other lines omitted for brevity)
Подтема подтемы
При создании подтемы подтемы вы должны указать в качестве базовой темы подтему.
- Fluffiness: первая подтема Classy
name: Fluffiness
type: theme
description: This is a fluffy sub theme of Classy
core: 8.x
# Defines the base theme
base theme: classy
- Shaved: подтема Fluffiness (подтема подтемы Classy)
name: Shaved
type: theme
description: This is a reduced fluff sub theme of Fluffiness
core: 8.x
# Defines the base theme
base theme: fluffiness
Обратите внимание, что base theme: параметр - это machine name базовой темы, а имя: параметр - это описательное имя.
Наследование тематических регионов
Области темы не наследуются от указанной базовой темы. Если параметр region: оставлен пустым в файле info.yml вашей подтемы или не содержит всех областей базовой темы, то области по умолчанию в Drupal могут использоваться в качестве запасных вариантов размещения блоков в вашей подтеме. Мы настоятельно рекомендуем скопировать все области, определенные в вашей базовой теме, в файл info.yml вашей подтемы.
# Because regions are not inherited, any region including standard
# Drupal regions as well as base theme regions must be defined in
# the sub-theme. This example demonstrates a sub-theme that leverages
# a subset of the standard Drupal regions (1), plus some custom
# regions defined in the base theme (2), and finally three
# "colophon"-related regions defined in this sub-theme.
regions:
# 1. Standard Drupal regions (also defined and used by base theme).
# 2. Regions copied from base theme.
# 3. Additional custom sub-theme regions.
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) {
// Load theme suggestions for blocks from parent theme.
foreach ($suggestions as &$suggestion) {
$suggestion = str_replace('shaved_', 'fluffiness_', $suggestion);
}
}
Для ваших собственных подтем замените «shaved» названием своей подтемы, а «fluffiness» - названием вашей базовой темы.
Отличия от Drupal 7
Наиболее заметное отличие от Drupal 7 состоит в том, что файлы .info стали файлами .info.yml, которые используют синтаксис YAML.