Drupal - группировка материалов во Views

Небольшая заметка о группировке материалов во Views.

02.09.2016
14 комментариев
3 мин.

Что-то последние все последние материалы у меня технические и давненько не было что-то попроще, но не менее полезного. В этот раз я расскажу о группировке материалов во Views.

С этой проблемой я столкнулся давно, году в 2013, когда серьезно занялся изучением Drupal. Тогда я только ещё знакомился и многих хитростей не знал, и часто прибегал к помощи сторонних модулей для решения своих задач, так как сил написать свой просто бы не хватило. И была задача, чтобы все материалы были выведены на одной странице, но сгруппированы по определенному признаку. То ли на тот момент во Views такой возможности не было, то ли я не смог найти это в сети, но зато я нашел для этого даже целый модуль, который это делал и делал это очень плохо. В последнее время что-то меня часто на проектах стали просить сделать ту или иную группировку содержимого, и я решил с этой темой разобраться и оказалось, что во Views эта возможность есть из коробки, а я никогда не обращал на это внимание. И вот дошли руки написать об этом :)

Уточняю сразу, гайд пишу по скринам Drupal 8, но в Drupal 7 это делается абсолютно также, вообще без изменений.

Что же за группировка такая? Это возможность во Views объединять выводимые материалы по определенному признаку. У этой возможности очень большой круг применения, например у сайта с едой - можно построить меню с группировкой по составу, или же по типу блюда, у медицинских сайтов по назначению, или же просто по первой букве, как часто на них бывает. Вот ещё парочка, визуальных примеров.

Группировка новостей по месяцу и году.
Группировка клиентов компании по сфере деятельности.

Так как же это делается? Давайте рассмотрим парочку примеров.

Пример №1

Начнем с примера который совпадает с первым изображением, будем группировать материалы по месяцу и году. Допустим у вас уже имеется views для вывода нужного содержимого на странице в обычном виде.

Пример ненастроенного вывода.

Для того чтобы группировать материалы, нам нужны поля, а конкретно, одно поле по значению которого будут группироваться материалы. Если у вас настроен вывод полей - то ничего сложного, вы добавляете нужное поле, в нашем случае поле с датой создания материала, и переходите к следующему шагу. А что если вы используете готовый вывод, или какой-то иной от полей? Вы можете заметить что поля вам добавлять нельзя, как у меня на скриншоте. На самом деле можете, просто для этого нужно Views указать, что нам даже при таком выводе нужны поля, и он даст возможность их использовать. Для этого необходимо нажать на настройки у формата вывода и выбрать "Принудительное использование полей".

Принудительное использование полей.

После этого у нас появится возможность добавлять поля к нашему отображению. Теперь нам нужно добавить поле с датой публикации материала. Добавляем соответствующее поле и видим множество настроек.

Настройки поля с датой публикации материала.

Нас эти настройки интересуют, почему? Views будет группировать по полю, но откуда он знает как именно группировать? Для этого он группирует по конечному результату поля, а не по его исходному значению или чему-то ещё. Т.е. если отталкиваться от моего скриншота выше, группировка будет по формату даты 09/02/2016 05:31 - так как выбран данный формат даты и это будет результат поля. Вероятность что будет несколько материалов в 1 минуту - практически нереально для обычно сайта и просто бесполезно. Самое оптимальное, группировать по формату "Месяц ГОД". Для этого нам нужно сделать так, чтобы результат этого поля принимал данное значение. Это делается супер-просто, в формате даты, мы должны выбрать Custom и ввести нужный формат в соответствии с форматами дат PHP. Соответственно вводим нужный нам формат F Y

Собственный формат для вывода даты публикации.

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

Группировка по нашему полю.
Сгруппированные материалы.

Вот так просто группируются материалы по чему угодно.

Пример №2

Давайте рассмотрим ещё один пример, который может оказаться полезным. Давайте сгруппируем материалы по первой букве их заголовка. Можете попробовать сделать сами.

Для этого нам потребуется опять же, немного похимичить с выводимым значением поля. Первым делом, нужно, конечно же, добавить поле заголовка материала, чтобы оно стало доступным для группировки. Но ведь группировка будет происходить по цельному заголовку, а нам нужно по первой букве. Для этого в настройках поля есть раздел Rewrite results, который позволяет нам влиять на конечный результат значения. В нём нас интересует конкретно одна опция Trim this field to a maximum number of characters, которое позволяет обрезать значение поля. Так как мы группируем по первой букве заголовка, то и обрезать нам нужно до одного символа.

Настройка обрезания заголовка материала.

Далее нам необходимо данное поле выбрать в качестве группирующего содержимое. Ну и будет так же неплохо и логично добавить сортировку по заголовку в порядке возрастания, чтобы всё шло по алфавиту.

В результате получится алфавитный указатель.

На этом всё, спасибо за прочтение :)

Drupal
Drupal 7
Drupal 8
Views

Комментарии

Алексей Никитин   пн, 23/10/2017 - 00:43

Здравствуйте! Спасибо за советы.

Сделал нечто подобное на сайте. Но столкнулся с такой проблемой.

Необходимо сгруппированные результаты вывести в колонки формата:

{{ group_field }} {{ content }}
{{ group_field }} {{ content }}
Niklan   пн, 23/10/2017 - 07:04

Модифицируйте соответствующий views темплейт, например views-view-unformatted--VIEW_NAME--VIEW_DISPLAY.html.twig. Значение из {{ group_field }} там значится как {{ title }}.

Алексей Никитин   пн, 23/10/2017 - 11:09

Долго уже пытаюсь сделать это. Создание шаблона не помогает. Drupal просто не видит его. Я даже вносил временно изменения в шаблон ядра напрямую views-view-unformatted.html.twig - нет никаких изменений. Вероятно, Drupal берет формат вывода откуда-то еще конкретно в данном случае. Название моего views - "tracker", а в нем представление "page_1". Их я задавал в названии шаблона. И все же, даже правка родного шаблона не помогла...

Сбрасывал кеш после каждого изменения. Ничего не помогает. При этом, другие шаблоны я темизирую и они работают.

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

Niklan   пн, 23/10/2017 - 11:37

То как я понимаю "вывод групп в несколько колонок", я делал. Возможно вы что-то имеете другое под этим.

  1. Проверьте, у вас в нужном отображении вьюса где натсроена группировка, действительно ли выбран unformatted стиль?
  2. Если да, включите дебаг твига и посмортите откуда тянется шаблон, возможно что-то его перекрывает.
Алексей Никитин   пн, 23/10/2017 - 13:42

Спасибо большое, все заработало. Не указал второй - в названии шаблона. После исправления ошибки с помощью шаблона unformatted вывел сетку, обернув весь вывод в класс.

admin   сб, 20/01/2018 - 13:10

Модули давно уже имеют русскоязычные переводы. Зачем всё на инглише шлёпать? Чтобы многие попросту закрыли ваш сайт и никогда на него не возвращались? Взялись писать статейку, так пишите, чтобы всем было понятно!

Андрей   сб, 07/04/2018 - 22:02

Всё правильно, пусть на английском будет. Серьезные заказы на сайты идут из-за бугра. Таким заказчикам русский не нужен. А девелоперам придется иметь дело с EN интерфейсом. Для них же лучше, бест практик. Кто не тянет инглишь - жертва естественного отбора.

Марк Мина   пт, 20/03/2020 - 11:19

Редко пишу комментарии в сети, но эта статья решила мою проблему за 7 минут результат группировки вот - https://nedicom.ru/advokat-usluga-simferopol

Savage   пн, 20/04/2020 - 11:33

Никита, день добрый. Вопрос по групировке, хоть и немоного в сторону от освещаемой темы. друпал 8 + коммерц 2. При работе с вьюс возникла необходимость в группировке контента (товаров) по категориям. Сделал с подключением модуля Hierarchical Term Formatter (потом его отключил - результат не изменился) При подключении пагинации, обнаружился странный баг - походу группировка идет только того контента, который попадает в выдачу на конкретную страницу. пример: у меня 2 товара находятся в одной категории, но были симпортированы в разные сесиии. При группировке - один выдается под группой на первой странице, второй - под той же группой на последней Отключаю пагинацию - они оба идут вместе под категорией. Отключаю фоматер и делаю простую группировку (без иерархии) - ситуация аналогичная PS могу дать ссылку на разрабатываемый проект для наглядности

Savage   пн, 20/04/2020 - 12:31

Моя невнимательность была - затер сортировку по категории. Восстановил. Все ОК. Вопрос снимается ))

Михаил   пт, 12/03/2021 - 01:23

Что-то у меня не получается или не так делаю. Есть товары. Товары ссылаются на производителя. Представление выводит ноды товаров. Нужно сгруппировать - вывести по одному товару от производителя. Группирую по nid производителя (добавил в связи), а товары показываются все равно все.

Подскажите, может по другому нужно группировку настраивать?

Михаил   пт, 12/03/2021 - 02:08

Т.е. должно быть что типа такого запроса.

        $query = db_select('node', 'n');
        $query->innerJoin('field_data_field_parent', 'p', 'n.nid = p.entity_id');
        $query->fields('n', array('title'));
        $query->fields('p', array('field_parent_nid'));
        $query->condition('n.type', 'product');
        $query->condition('n.status', 1);
        $query->groupBy('p.field_parent_nid');
        $query->orderBy('n.nid');
        $nodes = $query->execute()->fetchAll();
Михаил   пт, 19/03/2021 - 01:45

В общем вся проблема в лишнем GroupBy Решается через hook_query_alter