Как я могу добавить пользовательские классы в созданную строку каждого представления?


Возможно ли с помощью препроцессора темы добавить некоторые классы в созданные строки представлений?

Например: на основе сайта Drupal о реализации темы по умолчанию для отображения представления неформатированных строк.
представления-просмотр-неформатированный.html.ветка:

Доступные переменные:
- заголовок: Заголовок этой группы строк. Может быть пустым.
- строки: Список элементов строк представления.
- атрибуты: Атрибуты HTML строки.
- содержимое: Содержимое строки.
- просмотр: Объект просмотра.
- default_row_class: Флаг, указывающий, являются ли классы по умолчанию следует использовать в строках.

Я знаю, что это возможно, и мы можем добавить нужные классы в каждую строку внутри views-view-unformatted.html.twig:

{% if title %}
  <h3>{{ title }}</h3>
{% endif %}
{% for row in rows %}
  {%
    set row_classes = [
      default_row_class ? 'views-row',
    ]
  %}
  <div{{ row.attributes.addClass(row_classes) }}>
    {{ row.content }}
  </div>
{% endfor %}

Но я хочу понять, можно ли сделать то же самое для пользовательских представлений, таких как front-page, используя из:
шаблон функции_предварительная обработка_представления_просмотр_неформатированный__передняя страница в частности
или в другом шаблоне_процесс_просмотра_просмотра в целом?

Author: Mojtaba Reyhani, 2017-07-17

4 answers

Если вы посмотрите на /ядро/модули/представления/представления.theme.inc в template_preprocess_views_view_unformatted, вы увидите этот код:

function template_preprocess_views_view_unformatted(&$variables) {
  $view = $variables['view'];
  $rows = $variables['rows'];
  $style = $view->style_plugin;
  $options = $style->options;

  $variables['default_row_class'] = !empty($options['default_row_class']);
  foreach ($rows as $id => $row) {
    $variables['rows'][$id] = [];
    $variables['rows'][$id]['content'] = $row;
    $variables['rows'][$id]['attributes'] = new Attribute();
    if ($row_class = $view->style_plugin->getRowClass($id)) {
      $variables['rows'][$id]['attributes']->addClass($row_class);
    }
  }
}

Вот как, если вы установили класс строк в представлении, он будет добавлен.

enter image description here

И полученный результат:

enter image description here

Вы можете скопировать эту функцию в свой пользовательский модуль и настроить ее по своему усмотрению. Например, это добавит "представления-строка-" плюс имя вашего представления, очищенного с помощью утилита очистки строки pathauto:

function mymodule_preprocess_views_view_unformatted(&$variables) {
  $view = $variables['view'];
  $rows = $variables['rows'];

  foreach ($rows as $id => $row) {
    // Add custom class to each row that encorporates the view id.
    $custom_row_class = \Drupal::service('pathauto.alias_cleaner')
      ->cleanString($view->id());
    $custom_row_class = 'views-row-' . $custom_row_class;
    $variables['rows'][$id]['attributes']->addClass($custom_row_class);
  }
}

Если вы хотите добавить классы в строки представлений из hook_preprocess_views_view, вы можете сделать это следующим образом:

function mitsloan_global_preprocess_views_view(&$variables) {
  $view = $variables['view'];

  if ($view->id() == 'testview') {

    $row_style_plugin = &$variables['rows'][0]['#view']->style_plugin;

    $custom_row_class = 'views-row-' . \Drupal::service('pathauto.alias_cleaner')
        ->cleanString($view->id());

    $row_style_plugin->options['row_class'] = $custom_row_class;
  }

}
 7
Author: oknate, 2017-07-21 14:33:29

Вы также можете проверить различные переменные цикла , определенные twig, и использовать их для применения уникальных классов, например

{% for row in rows %}
    {% if (loop.index == 1 ) %}
        {% set is_active = 'is-active' %}
    {% else %}
        {% set is_active = '' %}
    {% endif %}
    <li class="{{ is_active }} counter{{ loop.index }}">
        {{ row.content }}
    </li>
{% endfor %}

Цикл.индекс Текущая итерация цикла. (1 проиндексированный)

Цикл.index0 Текущая итерация цикла. (0 проиндексировано)

Loop.revindex Число итераций с конца цикла (1 индексированный)

Цикл.revindex0 Количество итераций с конца цикла (0 индексированный)

Цикл.первый Верно, если первая итерация

Цикл.последний Верно, если последняя итерация

Длина цикла Количество элементов в последовательности

Цикл.родитель Родительский контекст

 2
Author: featherbelly, 2018-05-16 04:54:57

Не проверено, но я думаю, что это сработает:

function template_preprocess_views_view(&$variables) {
  $view = $variables['view'];
  $id = $view->storage->id();

  if ($id == 'view_name' && $view->current_display == 'block_1') {
    $variables['attributes']['class'][] = 'custom-class-name';
  }
}

Примечание $view->current_display - это имя машины.

  • Вы можете удалить часть && $view->current_display == 'block_1', если не хотите, чтобы она была такой конкретной.

  • Вы можете удалить оператор if, если хотите повлиять на ВСЕ представления.

 1
Author: No Sssweat, 2017-07-17 23:32:49

Должно ли это быть условным или просто представление, добавленное в каждую строку? Вы можете сделать это в пользовательском интерфейсе. В строки первой страницы можно добавить класс, выполнив команду /администратор/структура/представления/просмотр/первая страница и нажав "настройки" рядом с "неформатированный список". Здесь есть поле класса строк, которое может быть тем, что вам нужно.

 0
Author: Veez, 2017-07-17 22:53:45