Узнайте, как объединять элементы по определённому признаку для улучшения структуры и навигации вашего сайта.
Что-то последние все последние материалы у меня технические и давненько не было что-то попроще, но не менее полезного. В этот раз я расскажу о группировке материалов во 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, которое позволяет обрезать значение поля. Так как мы группируем по первой букве заголовка, то и обрезать нам нужно до одного символа.
Далее нам необходимо данное поле выбрать в качестве группирующего содержимое. Ну и будет так же неплохо и логично добавить сортировку по заголовку в порядке возрастания, чтобы всё шло по алфавиту.
На этом всё, спасибо за прочтение. :)
Комментарии
Модифицируйте соответствующий views темплейт, например views-view-unformatted--VIEW_NAME--VIEW_DISPLAY.html.twig. Значение из {{ group_field }}
там значится как {{ title }}
.
Долго уже пытаюсь сделать это. Создание шаблона не помогает. Drupal просто не видит его. Я даже вносил временно изменения в шаблон ядра напрямую views-view-unformatted.html.twig - нет никаких изменений. Вероятно, Drupal берет формат вывода откуда-то еще конкретно в данном случае. Название моего views - "tracker", а в нем представление "page_1". Их я задавал в названии шаблона. И все же, даже правка родного шаблона не помогла...
Сбрасывал кеш после каждого изменения. Ничего не помогает. При этом, другие шаблоны я темизирую и они работают.
Попробуйте сами сделайте вывод групп в несколько колонок, если не затруднит. Буду премного благоджарен. Задача совсем не сложная, но в данном случае есть какой-то ньюанс.
То как я понимаю "вывод групп в несколько колонок", я делал. Возможно вы что-то имеете другое под этим.
- Проверьте, у вас в нужном отображении вьюса где натсроена группировка, действительно ли выбран unformatted стиль?
- Если да, включите дебаг твига и посмортите откуда тянется шаблон, возможно что-то его перекрывает.
Спасибо большое, все заработало. Не указал второй - в названии шаблона. После исправления ошибки с помощью шаблона unformatted вывел сетку, обернув весь вывод в класс.
Модули давно уже имеют русскоязычные переводы. Зачем всё на инглише шлёпать? Чтобы многие попросту закрыли ваш сайт и никогда на него не возвращались? Взялись писать статейку, так пишите, чтобы всем было понятно!
Всё правильно, пусть на английском будет. Серьезные заказы на сайты идут из-за бугра. Таким заказчикам русский не нужен. А девелоперам придется иметь дело с EN интерфейсом. Для них же лучше, бест практик. Кто не тянет инглишь - жертва естественного отбора.
Редко пишу комментарии в сети, но эта статья решила мою проблему за 7 минут результат группировки вот - https://nedicom.ru/advokat-usluga-simferopol
группировал по родителям термина таксономии если что
Никита, день добрый. Вопрос по групировке, хоть и немоного в сторону от освещаемой темы. друпал 8 + коммерц 2. При работе с вьюс возникла необходимость в группировке контента (товаров) по категориям. Сделал с подключением модуля Hierarchical Term Formatter (потом его отключил - результат не изменился) При подключении пагинации, обнаружился странный баг - походу группировка идет только того контента, который попадает в выдачу на конкретную страницу. пример: у меня 2 товара находятся в одной категории, но были симпортированы в разные сесиии. При группировке - один выдается под группой на первой странице, второй - под той же группой на последней Отключаю пагинацию - они оба идут вместе под категорией. Отключаю фоматер и делаю простую группировку (без иерархии) - ситуация аналогичная PS могу дать ссылку на разрабатываемый проект для наглядности
Моя невнимательность была - затер сортировку по категории. Восстановил. Все ОК. Вопрос снимается ))
Что-то у меня не получается или не так делаю. Есть товары. Товары ссылаются на производителя. Представление выводит ноды товаров. Нужно сгруппировать - вывести по одному товару от производителя. Группирую по nid производителя (добавил в связи), а товары показываются все равно все.
Подскажите, может по другому нужно группировку настраивать?
Т.е. должно быть что типа такого запроса.
$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();
В общем вся проблема в лишнем GroupBy Решается через hook_query_alter
Здравствуйте! Спасибо за советы.
Сделал нечто подобное на сайте. Но столкнулся с такой проблемой.
Необходимо сгруппированные результаты вывести в колонки формата: