logo

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

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

演示 EBT 模块 下载 EBT 模块

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

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

演示 EPT 模块 滚动

滚动

预处理和在 .theme 文件中修改属性

02/10/2025, by Ivan

Как и в Drupal 7, вы можете влиять на вывод определенного HTML с помощью функций предварительной обработки. Например, если вы хотите добавить класс в меню и предпочитаете делать это на уровне PHP, вы можете это сделать. Это хороший способ изменить разметку, относящуюся к теме, но если вы хотите сделать разметку, не зависящую от темы, лучше написать собственный модуль.

(Примечание: для целей документации здесь «mytheme» - это имя машины вашей темы; например, «bartik» - это имя машины темы.)

Для работы с функциями предварительной обработки:

1. Создайте или отредактируйте файл в каталоге вашей темы под названием mytheme.theme

2. Создайте функцию, такую ​​как mytheme_preprocess_HOOK, где HOOK ссылается на элемент, на который вы хотите повлиять*

3. Напишите свои изменения и сохраните

4. Перестройте кеш, чтобы ваши изменения были доступны (если у вас установлен drush, drush cr в командной строке)

* Имена HOOK следуют за рекомендациями шаблона twig. Чтобы создать хук для page.html.twig, вы создаете страницу mytheme_preprocess_page. Чтобы создать хук для узла - article.html.twig, вы создаете mytheme_preprocess_node__article (заменяя черты подчеркиванием). Чтобы узнать имена хуков, смотрите раздел «Поиск файлов шаблонов с отладкой».

Давайте предположим, что мы хотели добавить класс my-menu ко всем меню на вашем сайте. Предполагая, что ваша тема называется «mytheme», вы должны написать следующую функцию:

/**
* Implements hook_preprocess_HOOK() for menu.html.twig.
*/
function mytheme_preprocess_menu(&$variables) {
  // If there is not an existing class array, create an empty array.
  if (!isset($variables['attributes']['class'])) {
    $variables['attributes']['class'] = [];
  }
  // Merge with any classes that may have been set by other hook_preprocess_menu invocations
  $variables['attributes']['class'] = array_merge($variables['attributes']['class'], ['my-menu']);
}

Это очень похоже на Drupal 7 и помогает, если вы хотите настроить целевое меню.

Вы можете проверить объект $variable с условием, чтобы определить, с каким меню вы работаете. Элементы внутри $variables становятся доступными в twig после предварительной обработки темы.

Теперь, чтобы расширить наш пример, давайте предположим, что мы хотим добавить класс «my-main-menu» в главное меню вашего сайта. Это будет функция для этого:

/**
* Implements hook_preprocess_HOOK() for menu.html.twig.
*/
function mytheme_preprocess_menu(&$variables) {
  if ($variables['menu_name'] == 'main') {
    if (!isset($variables['attributes']['class'])) {
      $variables['attributes']['class'] = [];
    }
    $variables['attributes']['class'] = array_merge($variables['attributes']['class'], ['my-main-menu']);  
  }
}

Отличия от Drupal 7

Больше нет файла template.php. Этот файл был заменен mytheme.theme. Тем не менее, он все еще функционирует во многом таким же образом, позволяя хукам изменять вывод.

Другие полезные ссылки