Как я могу добавить пользовательские классы в созданную строку каждого представления?
Возможно ли с помощью препроцессора темы добавить некоторые классы в созданные строки представлений?
Например: на основе сайта 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
, используя из:
шаблон функции_предварительная обработка_представления_просмотр_неформатированный__передняя страница в частности
или в другом шаблоне_процесс_просмотра_просмотра в целом?
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);
}
}
}
Вот как, если вы установили класс строк в представлении, он будет добавлен.
И полученный результат:
Вы можете скопировать эту функцию в свой пользовательский модуль и настроить ее по своему усмотрению. Например, это добавит "представления-строка-" плюс имя вашего представления, очищенного с помощью утилита очистки строки 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;
}
}
Вы также можете проверить различные переменные цикла , определенные 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 индексированный)
Цикл.первый Верно, если первая итерация
Цикл.последний Верно, если последняя итерация
Длина цикла Количество элементов в последовательности
Цикл.родитель Родительский контекст
Не проверено, но я думаю, что это сработает:
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, если хотите повлиять на ВСЕ представления.
Должно ли это быть условным или просто представление, добавленное в каждую строку? Вы можете сделать это в пользовательском интерфейсе. В строки первой страницы можно добавить класс, выполнив команду /администратор/структура/представления/просмотр/первая страница и нажав "настройки" рядом с "неформатированный список". Здесь есть поле класса строк, которое может быть тем, что вам нужно.