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

24.03.2013 118 4 мин.

Всем привет. Решил реализовать каталог на 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
  • Если надо, меняем 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 и добавляем «Дочерние категории». Тоже самое проделайте и с представлением «Товар». Все шаги и настройки после выбора представления просто игнорируйте, они нам не нужны.

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

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

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

Заключение

Плюсы:

  • Гибкость благодаря Views & Panels.
  • Используются системные алиасы.
  • Нет фильтра php.
  • Cтраницы taxonomy/term/ID из словаря «Категории каталога» будут более информативными.

Комментарии

И
Иван # 26.01.2015 - 15:20

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

М
Михаил # 16.04.2015 - 17:52

Добрый день. Статья прямо выручила, только не могу разобраться как в подкатегориях (где отображаются сами товары) выводить их стоимость и кнопку купить. Магазин леплю на commerce по статье http://drupal-learning.com/lesson/shag-2-sozdanie-tipa-materialov-i-kat…

А
Александер # 24.04.2015 - 00:08

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

D
Dmitry # 12.05.2015 - 07:50

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

D
Dinara # 25.05.2015 - 17:32

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

Е
Евгений # 18.09.2015 - 17:12

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

G
Godwin # 24.09.2015 - 21:51

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

G
Godwin # 26.09.2015 - 10:35

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

K
Kinologwers # 18.10.2015 - 22:49

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

Ю
Юрий # 26.05.2016 - 13:45

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

d
dru # 01.08.2016 - 11:22

Добрый день

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

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

W
Winny63 # 18.09.2016 - 14:26

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

h
hardhardy # 26.04.2017 - 06:04

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

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

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

D
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;

h
ham # 11.01.2019 - 11:15

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

Добавить комментарий

В комментариях присутствует поддержка Markdown синтаксиса. Показать подсказку.
Ссылка
[Заголовок](http://google.ru)
Код в строку
`print "Hello World";`
Многострочный код
```php print "Hello World"; ```
Жирный текст
*Текст*
Курсивный текст
_Текст_