Drupal 7: Создание каталога с помощью Taxonomy & Views & Panels

Создаем каталог на вьюсах и панелях.

24.03.2013
116 комментариев
6 мин.

Всем привет. Решил реализовать каталог на Drupal 7. Целью было создать его без модулей Ubercart и Commerce. Конечно, я понимаю что из них тоже можно сделать каталог, но зачем за собой тянуть столько левого функционала, я не понимаю.

Конечно я полез в гугл и нарыл инфу. Как оказалось, на англоязычных сайтах все решения которые были предложены, так или иначе использовали Ubercart и Commerce. Среди русскоязычных попался всего лишь один достойный: «Продвинутый каталог на Drupal 7». Я его попробовал, мне понравилось, но у него есть недостатки:

  1. Самый главный — невозможность задания алиасов для адресов. Т.е. Разделы каталога имеют жесткий адрес catalog/%TID.
  2. Необходимость включения фильтра PHP. Я стараюсь избегать включения данного модуля, ведь если сайтом будут управлять криворукие — то этот фильтр просто яма в безопасности.
  3. Плодятся типы материалов (для фильтров). Не пробовал, точно о проблеме сказать не могу. Мне хватило первых двух чтобы отказаться от него.

Перепробовал уйму вариантов на одном лишь Views. Были даже рабочие, но их гибкость вызывала сомнения. В итоге решением всех проблем стала связка Views & Panels. Именно об этом я и расскажу.

P.s. То что замазано на скринах — настройки по умолчанию (не менялись).

Подготовка

Не удивительно, но для создания каталога понадобится Views, Panels и конечно же Ctools. Включаем:

  • Chaos tools
  • Page manager
  • Views content panes
  • Panels
  • Views & Views UI

Для начала создайте словарь таксономии с названием «Категории каталога» (или же как вам нравится). Добавьте необходимые категории.

Теперь создайте новый тип материала (например «товар») который будет добавляться в каталог, и добавьте ему поле «Term reference» которое ссылается на ваш словарь «Категории каталога». Также добавьте парочку товаров, чтобы видеть результаты.

Создание представлений (Views)

Создание главной каталога

Тут проще простого.

  • Жмем «Add new view»
  • Указываем название «Каталог»
  • Show: Taxonomy terms of type «Категории каталога»
  • Ставим галочку «Create a page» и заполняем.
  • Page title: Каталог
  • Path: catalog
  • Жмем кнопку «Continue & edit»
  • Делаем необходимый Format. Например «Table».
  • В разделе Filter criteria жмем «add».
  • Выбираем «Taxonomy term: Parent term» и жмем «Apply», затем сного «Apply». Тем самым мы сделали чтобы выводились только родительские категории.
  • Сохраняем вьюху.

Этими действиями мы создали страницу по адресу site/catalog на которой будут отображаться только родительские термины.

Главная каталога.

Вывод дочерних категорий

Создаем новое представление:

  • View name: «Дочерние категории».
  • Show Taxonomy terms of type «Категории каталога».
  • Снимаем галочку create a page.
  • Жмем «Continue & edit».
  • Добавляем новый тип представления Content pane
Content pane.
  • Если надо, меняем Format.
  • В Relationships выбираем Taxonomy term: Parent term.
  • В Contextual filters выбираем Taxonomy term: Term ID. Указываем Relationship — Parent (если не меняли в предыдущем пункте). В разделе значение по умолчанию выбираем Provide default value, type: Taxonomy term ID from URL и жмем Apply.
Значение по умолчанию.
  • Сохраняем представление.

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

Представление дочерних категорий.

Вывод продукции в категории

Создаем очередное представление:

  • View name: Товар
  • Show Content of type «Продукт» (название вашего типа содержимого под продукцию)
  • Снимаем галочку Create a page.
  • Жмем Continue & edit.
  • Добавляем Content pane.
  • Добавляем Contextual filters — Content: Has taxonomy term ID (with depth). В Depth указыем: 0 — если хотите чтобы отображался товар текущей категории, 10 — если хотите чтобы отображались товары из текущей категории, а также товары из его подкатегорий.
  • Ставим галочку Provide default value и выбираем Taxonomy term ID from URL.
Глубина.
  • Жмем Apply.
  • В разделе No results behavior добавляем Global: Text area и пишем что-то типа «В данной категории еще нет товара». Думаю не стоит объяснять когда оно будет вылезать.
  • Сохраняем представление.

Данное представление будет выводить весь товар, у которого выбрана данная категория. Соответственно вы можете выводить какие угодно типы материалов.

Вывод продукции в категории.

Настройка Panels

Теперь настроим отображение всего и вся. Для начала переходим на страницу стандартных панелей: admin/structure/pages. Нам нужно включить term_view.

Включаем термины.

Затем жмем «Edit» и добавляем новый вариант: «Add a new variant»:

  • Title: Каталог.
  • Variant type: Panel.
  • Optional features: ставим галочку Selection rules.
  • Жмем Create variant.

Перед нами открывается следующий этап настройки. В нем указывается то, когда сработает данный вариант. Нам надо чтобы он срабатывал на термины из словаря «Категории каталога». Для этого:

  • Из списка выбираем Taxonomy: vocabulary и жмем Add.
  • В pop-up окне выбираем наш словарь и жмем Save.
  • Затем жмем кнопку Continue.

Шаг разметки пропускаем, поэтому жмем Continue. Следующий шаг пропускаем, ибо он нам не нужен. В итоге мы окажемся на этапе Panel content.

Здесь нам надо указать что и где будет отображаться. Для начала сделаем чтобы заголовок страницы был как и у категории, для этого в поле title пишем %term:name.

Теперь все просто, жмем на шестеренку слева от региона center и выбираем Add content. Слева выбираем категорию Views и добавляем «Дочерние категории». Тоже самое проделайте и с представлением «Товар». Все шаги и настройки после выбора представления просто игнорируйте, они нам не нужны.

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

Результат добавления представлений в Panels.

Завершающим действием будет нажатие кнопки Create variant.

На этом все. Теперь перейдя по адресу site/catalog вы увидите категории. Перейдя в категорию, вы увидите товар а также подкатегории.

Результат.

Заключение

Плюсы:

  • Гибкость благодаря Views & Panels.
  • Используются системные алиасы.
  • Нет фильтра php.
  • Cтраницы taxonomy/term/ID из словаря «Категории каталога» будут более информативными.
Прикрепленные файлы
Представление: Дочерние термины — child_terms.txt, 3.29 КБ
Представление: Каталог (главная страница) — catalog.txt, 2.85 КБ
Представление: Вывод продукции в каталоге — product.txt, 4.19 КБ
Panels: Отображение подкатегорий и товаров — panels_catalog.txt, 3 КБ
Объяснение для комментария — to_alexander.jpg, 192.86 КБ
Drupal
Drupal 7
Views
Таксономия
Panels

Комментарии

Александер   пт, 24/04/2015 - 00:08

Наверно уже спрашивали, но нет времени перечитывать. Как сделать, чтобы при использовании панели заголовок H1 и Title отличались друг от друга?

Dmitry   вт, 12/05/2015 - 07:50

Спасибо за мануал! По сути у меня все вьюсы точно так же настроены, но вместо панелей прикреплял вьюсу к полю таксономии. С панелями вариант более гибкий.
Еще отличие - Вывод дочерних категорий -> Contextual filters выбираем Taxonomy term: Term ID. Указываем Relationship — Parent.
В этом пункте не стал переключать на Parent, тк иначе при сложной структуре таксономии не выводятся все подразделы.

Dinara   пн, 25/05/2015 - 17:32

здравствуйте! не могли бы подсказать как создать кнопки вперед назад и отображение номера страницы в каталоге товаров?

Евгений   пт, 18/09/2015 - 17:12

Никита, ты молодец. Я с каталогом парюсь уже второй день, не знал как вывести кроме категорий еще и товары родительских подкатегорий. Ура! Ты реально помого этой статьей!!!!!

Godwin   чт, 24/09/2015 - 21:51

В admin/structure/pages при создании нового варианта, где нужно выбрать Variant type: Panel, то Panel отсутствует, там что-то из HTTML..
Как настроить, чтобы Panel появилась в выборе?
Этот вопрос уже тоже кто-то задавал выше.

Godwin   сб, 26/09/2015 - 10:35

Надо было просто установить модуль Panels. Был уверен что он давно уже стоял, поэтому не проверил.

Kinologwers   вс, 18/10/2015 - 22:49

Обучение и дрессировка собак в Москве и Московской области http://dressirovkashchenkov.ru - dressirovkashchenkov.ru по приемлимым ценам! Более 148 довольных владельцев взрослых собак и щенков. Закажите дрессировку прямомо сейчас и получите скидку до 50% на курсы!

Юрий   чт, 26/05/2016 - 13:45

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

dru   пн, 01/08/2016 - 11:22

Добрый день

При использовании Drupal 7 + Commerce, какое кеширование вы могли бы рекомендовать ?

Требуется сброс кеша страницы категории (panels) при изменении товара.

Winny63   вс, 18/09/2016 - 14:26

Спасибо за статью! Внезапно обнаружилось, что pane каким-то непонятным мне образом "уничтожает" всю CSS-разметку для полей View, что затрудняет форматирование. Поисковики ничего внятного не приводят - у многих такая же проблема. Как ее решаете Вы?

hardhardy   ср, 26/04/2017 - 06:04

Приветствую! Надеюсь получу ответ и вашу помощь. Все сделал как описано, работает, но коряво и не пойму что у меня за бред. Термин таксономии - каталог: категория1 категория2 -подкатегория2.1 категория3

так вот поля дочерних категорий выводятся только у категории2 так как у нее есть дочерняя подкатегория2.1

в чем косяк может быть?

DimaDD   пн, 22/05/2017 - 16:08

Низкий поклон за описание этой технологии! На её основе, клонируя лишь нужные вьюхи и делая различные варианты странички term_view, удалось относительно легко соорудить существенно различающийся логичный вывод материалов для таких разных словарей с иерархией терминов, как "структура организации" и "новости" (у них тоже есть разные темы и подтемы). Отлично работает с менюшками от модуля Taxonomy menu.

Небольшие и простые подсказки:

  1. Для того, чтобы "хлебные крошки" не дублировались, надо лишь снять галочку «Отображать иерархию первого термина в хлебных крошках» в настройках страницы term_view (второй пункт сверху после «Сводки»).
  2. Если сайт мультиязычный (используются модули i18n, i18nviews), то: а) в настройках содержимого страницы term_view для заголовка вместо %term:name использовать %term:i18n-vocabulary б) Для представлений вывода типа материалов и списка дочерних терминов стоит переопределять название страницы (аргумент - %1), причём придётся устраивать PHP-проверку (т.к. переопределённые заголовки почему-то штатно переводиться не хотят) вот таким кодом:

if ($term = taxonomy_term_load($argument)) { if (function_exists('i18n_taxonomy_term_name')) { global $language; $handler->validated_title = i18n_taxonomy_term_name($term, $language->language); } return true; } return false;

ham   пт, 11/01/2019 - 11:15

Добрый день. Спасибо, все работает. Подскажите как можно добавить в реализацию раскрывающийся список дочерних терминов и строчку "фильтр" по названию термина?

den   чт, 11/04/2019 - 16:16

Спасибо за гайд! к сожалению, у меня после всех манипуляций не заработало: возникает ошибка "Запрашиваемая страница "/taxonomy/term/112" не найдена". Как можно скачать прикрепленные файлы?