Добавление класа в views

Аватар пользователя Alextr Alextr 19 октября в 18:36

Здравствуйте, подскажите как можно программно добавить дополнительно класс по условию в обертку короткой ноды.
Прикидывал через

<?php
_views_pre_render
(\Drupal\views\ViewExecutable $view) {
foreach(
$view->result as $value){
if (
условие) { $value->_entity->  и дальше тупик
?>

Возможно это не правильный путь?

Подскажите кто знает. Заранее спасибо всем кто отпишется.

0 Thanks

Лучший ответ

Аватар пользователя ivnish ivnish 20 октября в 10:51

1. Как определить только для анонсов

Точно так же как и в предыдущем примере для семерки.

Установите хотя бы devel там есть kint, которым можно вывести массив variables и заглянуть в его содержимое

Комментарии

Аватар пользователя Alextr Alextr 19 октября в 20:14

Нашел вот такое - $view->display_handler->setOption('css_class', 'your_class'); , но это добавляет класс для всего view. А мне если я правильно понимаю нужно че то подобное для _entity

Аватар пользователя Alextr Alextr 19 октября в 21:09

$value->field_field_deal_expire[0]['rendered']['#markup'] = 'your_class'; Нашел для отдельного поля, но все не то. Sad

Аватар пользователя Orion76 Orion76 20 октября в 7:58

Включите отладку темы: 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.

Аватар пользователя Alextr Alextr 20 октября в 10:09

Спасибо, немного помогло. Нашел вот для 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.

Аватар пользователя Alextr Alextr 20 октября в 10:49

Ну почти нашел решение:

<?php
function TEMPLATE_preprocess_node(&$variables) {
$variables['attributes']['class'] = array_merge($variables['attributes']['class'], ['your_class']);
}
?>

Теперь осталось несколько вопросов:
1. Как определить только для анонсов
2. Как вытянуть тут значение поля чтоб добавлять только по условию.

Аватар пользователя ivnish ivnish 20 октября в 10:51

1. Как определить только для анонсов

Точно так же как и в предыдущем примере для семерки.

Установите хотя бы devel там есть kint, которым можно вывести массив variables и заглянуть в его содержимое

Аватар пользователя Alextr Alextr 20 октября в 11:22

Поставил - да действительно отличная штука. Теперь надеюсь пойдет быстрее - ат о как слепой был.

Спасибо!

Аватар пользователя Alextr Alextr 20 октября в 13:15

Ну в итоге получилось по конструкции :

<?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']);
}

}
?>

Всем спасибо за подсказки, очень помогли.

Аватар пользователя Alextr Alextr 20 октября в 13:39

Этот код работает почему то только для админа - для незарегистрированных и других пользователей класс css не отображается. Sad

Аватар пользователя Alextr Alextr 20 октября в 13:57

Непонятно почему ругалось на array_merge в логах ().
Присвоил просто

<?php
$variables
['attributes']['class'] =  ['your_class']; 
?>

и все для всех пользователей заработало.
Получается массивы нельзя сложить- нестыковочка.

Аватар пользователя Andruxa Andruxa 20 октября в 14:55

я бы еще добавил проверку, что массив class существует:

<?php
if (!isset($variables['attributes']['class'])) {
  
$variables['attributes']['class'] = [];
}
?>

у уж затем -

<?php
$variables
['attributes']['class'][] = 'class-name';
?>
Аватар пользователя Alextr Alextr 20 октября в 15:31

Ну а последняя строчка в таком варианте будет наверное правильней. Видно ошибка была из-за того что первый массив не существовал.

<?php
$variables
['attributes']['class'] = array_merge($variables['attributes']['class'], ['your_class']);
?>

Теперь с проверочкой все отлично работает.