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