Здравствуйте, подскажите как можно программно добавить дополнительно класс по условию в обертку короткой ноды.
Прикидывал через
<?php
_views_pre_render(\Drupal\views\ViewExecutable $view) {
foreach($view->result as $value){
if (условие) { $value->_entity-> и дальше тупик.
?>
Возможно это не правильный путь?
Подскажите кто знает. Заранее спасибо всем кто отпишется.
Комментарии
Нашел вот такое - $view->display_handler->setOption('css_class', 'your_class'); , но это добавляет класс для всего view. А мне если я правильно понимаю нужно че то подобное для _entity
$value->field_field_deal_expire[0]['rendered']['#markup'] = 'your_class'; Нашел для отдельного поля, но все не то.
ребята, подскажите кто знает.
в шаблоне ноды?
Нет, в шаблоне php не катит это в хуках.
Включите отладку темы: https://www.drupal.org/docs/8/theming/twig/debugging-twig-templates
В html-коде страницы в комментариях появится инфа об использованных для генерации компонентов страницы(вьюс, строка вьюса, нода, поля ноды и т.п.) шаблонов и наименования ХУКОВ темы для соответствующих компонентов.
Добавлять аттрибуты компонентов(классы и т.п.) логичнее в препроцесс-хуках темы:
https://www.drupal.org/docs/8/theming-drupal-8/modifying-attributes-in-a...
Примеры кода препроцесс-хуков можно посмотреть в "стандартных" и не очень темах оформления drupal.
Спасибо, немного помогло. Нашел вот для 7 версии:
<?php
function TEMPLATE_preprocess_node(&$variables) {
if ($variables['type'] == 'product' && $variables['view_mode'] == 'full') {
if (isset($variables['field_action']['und'])) {
$variables['classes_array'][] = $variables['field_action']['und'][0]['value'];
}
}
}
?>
Мне бы че то подобное для 8.
Ну почти нашел решение:
<?php
function TEMPLATE_preprocess_node(&$variables) {
$variables['attributes']['class'] = array_merge($variables['attributes']['class'], ['your_class']);
}
?>
Теперь осталось несколько вопросов:
1. Как определить только для анонсов
2. Как вытянуть тут значение поля чтоб добавлять только по условию.
Точно так же как и в предыдущем примере для семерки.
Установите хотя бы devel там есть kint, которым можно вывести массив variables и заглянуть в его содержимое
Поставил - да действительно отличная штука. Теперь надеюсь пойдет быстрее - ат о как слепой был.
Спасибо!
Ну в итоге получилось по конструкции :
<?php
function TEMPLATE_preprocess_node(&$variables) {
if ((
$variables['node']-> get( 'field_name' ) -> value) условие) {if ($variables['view_mode']=='teaser') { $variables['attributes']['class'] = array_merge($variables['attributes']['class'], ['your_class']);
}
}
}
?>
Всем спасибо за подсказки, очень помогли.
Этот код работает почему то только для админа - для незарегистрированных и других пользователей класс css не отображается.
Непонятно почему ругалось на array_merge в логах ().
Присвоил просто
<?php
$variables['attributes']['class'] = ['your_class'];
?>
и все для всех пользователей заработало.
Получается массивы нельзя сложить- нестыковочка.
<?php
$variables['attributes']['class'][] = 'class-name';
?>
я бы еще добавил проверку, что массив class существует:
<?php
if (!isset($variables['attributes']['class'])) {
$variables['attributes']['class'] = [];
}
?>
у уж затем -
<?php
$variables['attributes']['class'][] = 'class-name';
?>
Да так конечно получше будет.
Спасибо.
Ну а последняя строчка в таком варианте будет наверное правильней. Видно ошибка была из-за того что первый массив не существовал.
<?php
$variables['attributes']['class'] = array_merge($variables['attributes']['class'], ['your_class']);
?>
Теперь с проверочкой все отлично работает.