logo

Дополнительные типы блоков (EBT) — новый опыт конструктора страниц❗

Дополнительные типы блоков (EBT) — стилизованные, настраиваемые типы блоков: слайдшоу, вкладки, карточки, аккордеоны и многие другие. Встроенные настройки для фона, DOM Box, плагины Javascript.

Демо EBT модули Скачать EBT модули

❗Дополнительные типы параграфов (EPT) — новый опыт работы с параграфами

Дополнительные типы параграфов (EPT) — набор модулей, основанный на аналогичных параграфах.

Демо EPT модули Скачать EPT модули

Scroll

Предварительная обработка и изменение атрибутов в файле .theme

05/05/2020, by maria

Menu

Как и в 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. Тем не менее, он все еще функционирует во многом таким же образом, позволяя хукам изменять вывод.

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