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