Drupal 8 - добавление класса тела на основе термина таксономии или другого

Создание сайта на Drupal 8 с использованием классной подтемы. Столкнулись с непонятной темой: добавление класса body в html.html.twig на основе термина таксономии в этом узле.

Темеры используют это для настройки отображения страницы, в моем случае, используя его для определения нескольких разделов моего сайта, чтобы я мог изменить цвет и формат.

Я пробовал некоторые функции предварительной обработки, которые я видел в Google, но безрезультатно.

Кто-нибудь еще столкнулся и решил эту проблему?


person Jason Thompson    schedule 06.06.2016    source источник


Ответы (2)


Используйте это, чтобы получить все поля узла и проверить все, что вам нужно:

\Drupal::service('current_route_match')->getParameter('node')->toArray();

В вашем файле .theme вы можете использовать хук предварительной обработки html:

function your_theme_preprocess_html(&$variables) {
  $body_classes = [];
  $nodeFields = \Drupal::service('current_route_match')->getParameter('node')->toArray();

  // if something, then set $body_classes to something.

  $variables['attributes']['class'] += $body_classes;
}

А затем в вашем шаблоне html twig добавьте атрибуты к элементу body:

<body{{ attributes }}>

Надеюсь это поможет.

person Frank Drebin    schedule 06.06.2016
comment
Я поместил этот код в свой файл .theme (название моей темы в правильном месте). Но в файле html.html.twig уже есть классный код класса body, когда я применяю ваш код, я получаю белый экран. Этот код находится в шаблоне ветки: '‹body{{ attribute.addClass(body_classes) }}›' - person Jason Thompson; 06.06.2016
comment
Я также не знаю, как комментировать здесь, когда мой код выделен :( - person Jason Thompson; 06.06.2016
comment
Что делает ‹body{{ attribute.addClass(body_classes) }}›, так это то, что он добавляет определенные классы body_classes к любым классам, которые уже есть в переменной атрибутов. Так что теоретически тоже должно работать. Вы можете попробовать выполнить отладку с помощью var_dump или kint (если у вас включен модуль devel). Вы также можете создать дамп непосредственно в шаблоне ветки: twig.sensiolabs.org/doc/functions /dump.html Но вы должны включить отладку twig в файле services.yml - person Frank Drebin; 07.06.2016
comment
Обычно (по моему опыту работы с Drupal 8) белый экран как-то связан с исчерпанием памяти php, поэтому вы также можете дважды проверить свою логику в функции предварительной обработки. Может быть, вы использовали какой-то бесконечный цикл или около того? Также может помочь просмотр журналов php/server. - person Frank Drebin; 07.06.2016

С ответом Frank Drebin я получаю фатальную ошибку PHP (неподдерживаемые типы операндов) с операндом "+=" . Если вы хотите добавить идентификатор узла и тип узла в свой класс тела, вы можете использовать этот код, например:

// Add the node ID and node type to the body class

$body_classes = [];
$nodeFields = \Drupal::service('current_route_match')->getParameter('node')->toArray();

if (is_array($nodeFields) && count($nodeFields) > 0) {
    if (isset($nodeFields['nid'])) {
        $body_classes[] = 'node-' . $nodeFields['nid'][0]['value'];
    }
    if (isset($nodeFields['type'])) {
        $body_classes[] = $nodeFields['type'][0]['target_id'];
    }
}

$variables['attributes']['class'] = $body_classes;
person Guicara    schedule 12.07.2017