Хлебные крошки и ЧПУ с иерархией

29.10.2013 19 3 мин.

Как-то я написал гайд как сделать каталог товаров на Views + Panels + Taxonomy. Эта статья сейчас является самой обсуждаемой и читаемой в блоге. И я заметил что многие испытывают проблемы именно с настройкой URL’ов для категорий и товаров. Поэтому данная статья посвящена именно настройка грамотных URL с иерархией, ну и попутно я расскажу как сделать для них же хлебные крошки, ведь они играют немаловажную роль на странице.

Для начала запасаемся модулями и их зависимостями:

  • Path Breadcrumbs - позволит строить нам хлебные крошки как угодное и где угодно. - Chaos Tools
  • Entity API
  • Pathauto - многим уже известен, ведь позволяет генерировать URL’ы. - Token

Для пользователей Drush все намного проще:

drush dl entity path_breadcrumbs token pathauto && drush en path_breadcrumbs_ui pathauto -y

Подготовка

Для начала я опишу свою рабочее окружение, где будут проводиться демонстрации. Я не собираюсь воссоздавать каталог, ведь разницы вообще никакой, уверяю вас, если поймете суть, то все получится даже с Drupal Commere, не говоря уже о каталоге на обычных нодах.

Итак, имеется:

  • Словарь таксономии (taxonomy vocabulary): Категории каталога.
  • Тип содержимого (node): Товар. - Заголовок (стандартное)
  • Содержимое (стандартное)
  • Категория (term reference на словарь “Категории каталога”).

Все просто как пить дать! Осталось добавить парочку бутафорских товаров и в путь.

Создание иерархических путей

Для создания путей для товара мы должны зайти в настройки модуля Pathauto, которые находятся по пути: Конфиграция -> Синонимы и переходим во вкладку Шаблоны.

Суть такая, мы делаем адреса для категорий, а затем делаем финт ушами и товару делаем урл: URL-категории + название товара.

Задаем следующие паттерны:

  • Категория каталога (термин): catalog/[term:parents:join-path]/[term:name]
  • Содержимое Товар: catalog/[node:field-product-category:parents:join-path]/[node:field-product-category:name]/[node:title]

Получается например так:

  • catalog/computer
  • catalog/computers/computer-1
  • catalog/computers/asus/asus-123

Но у такого метода есть ограничения. Например мы размещаем товар в категории со следующей иерархией: Компьютеры и ноутбуки -> Компьютеры -> Собранные -> Асус

Ожидаемый URL:

  • catalog/computery-i-noutbuki/computery/sobrannye/asus/nazvanie

Реальный URL:

  • catalog/computery-i-noutbuki/computery/sobrannye/nazvanie

Как вы уже догадались, вложенность не такая уж и бесконечная. Если отбросить притсавку каталога, которой скорее всего будет являться вьюха со всем товаром, то вложенность категорий может достигать 4, при этом урл будет генерироваться нормально. С вьюхой уже получается 3.

С другой стороны, куда такие вложенности и длинные url’ы? Тут попахивает неправильной организацией каталога, да и url имеют ограничение в 255 символов.

Создание хлебных крошек с иерархией

Если вы реализовывали категории на таксономии, то хлебные крошки строятся вполне сносно.

Например у меня есть категории следующей вложенности: Компьютеры и ноутбуки » Ноутбуки » Работающие на солнце. Они имеют следующий вид:

Отлично, не так ли? Но если мы заходим в товар, который находится в данной категории, что мы видим:

Правильно, мы видим разочарование, но решение очень простое. Заходим в: Структура » Path Breadcrumbs и создаем новое правило для хлебных крошек.

Задаем следующие параметры:

Не обращайте внимание на ?q= - у меня просто выключены чисты ссылки. Мы просто жмем “Далее”.

На второй странице указываем что %nid - это Node: ID (Материал: ID), и жмем далее.

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

Вот мы и на странице настроек хлебных крошек. Тут все просто.

  • Заголовок ссылки: %nid:field-product-category:pb-join:name
  • Адрес ссылки: %nid:field-product-category:pb-join:url

Также можно добавить путь корня каталога, допустим если это вьюха. Я например, сделал так:

В итоге теперь товары имеют следующие хлебные крошки:

Кстати, тоже самое можно проделать и для терминов словаря “Категории каталога”, чтобы добавить туда ссылку на “Каталог”. Все действия те же самые, только вместо node/%node, указывайте taxonomy/term/%tid, где tid - ID Термина.

Вот и все. Если у кого есть опыт с адресами огромной вложенности, поделитесь своим опытом.

Комментарии

М
Максим # 10.11.2013 - 19:33

Приветствую!
На странице просмотра ноды (site/catalog/razdel-1/element-1) хлебные крошки встали как надо! Спасибо за статью!
По аналогии пытаюсь сделать хлебные крошки для раздела каталога - но не могу понять, что писать в поле Путь ссылки чтобы получить адрес типа "site/catalog/razdel-1"

С дупалом пытаюсь подружиться третий день, не ругайте сильно

N
Niklan # 10.11.2013 - 19:57

Если делать как написано, они сами такими стать должны.

Д
Денис # 15.04.2014 - 15:06

Никита, спасибо за полезнейшие статьи. Делаю каталог по вашему мануалу, никак не могу понять с иерархическими путями вот какой ньюанс:

Термины таксономии у меня на русском (ибо на их основе у меня еще генерируется меню), и когда я делаю всё как в вашей статье, иерархические ссылки в адресной строке тоже на русском. У вас же категории идут на русском, а ссылки на английском.

Нутром чую что решение кроется в вашей фразе "мы делаем адреса для категорий". Но если я руками задаю урл алиас для категории, то Pathauto не работает. То есть либо Pathauto и ссылки на русском, либо ссылки прописаны руками, безо всяких иерархий.

Где то туплю, не пойму где.

Ю
Юрий # 12.05.2014 - 11:29

Модуль transliteration установите, а в настройках Pathauto укажите "транслитерировать". И все :)

A
Aectann # 28.08.2014 - 14:13

Для хлебных крошек путь лучше такой
1) ЗАГОЛОВОК ССЫЛКИ
%term:parent:pb-join:name
ПУТЬ ССЫЛКИ
%term:parent:pb-join:url
2) ЗАГОЛОВОК ССЫЛКИ
!page_title
ПУТЬ ССЫЛКИ

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

С
Сергей # 18.10.2014 - 16:05

В создании иерархических путей в заполнении поля "Содержимое Товар" я так и не смог найти подобной строки для своего field-... catalog/[node:field-product-category:parents:join-path]/[node:field-product-category:name]/[node:title]
Вы как то пишите на скорую руку, приходится над некоторыми моментами гадать. Пожалуйста если взялись писать на эту тему, то указывайте детали и точные направления действий. Спасибо!

С
Сергей # 22.03.2015 - 23:45

Спасибо за статью эту и другие, все доступно и понятно. Может здесь стоит разве сделать приписку, что field-product-category - это имя поля терминов в товаре)

Е
Евгений # 30.06.2015 - 22:20

Довольно интересно и увлекательно написано, спасибо Вам. Встал вопрос казалось бы на ровном месте. Для мультиблогов как настроить правильно путь, примерно нужно чтобы выглядело так: Главная/Блоги/Блог пользователя %uid

Вот эта страница интересует, которая есть блог пользователя.

d
dejurin@ya.ru # 19.01.2016 - 18:25

хороший диз в стиле ТМ )

г
гонд # 28.12.2016 - 15:27

Возможно информация устарела. В последней версии правильно %node и %term, а не %nid и %tid. Исправьте на node/%node и taxonomy/term/%term

г
гонд # 28.12.2016 - 15:28

Возможно информация устарела. В последней версии правильно %node и %term, а не %nid и %tid. Исправьте на node/%node и taxonomy/term/%term

N
Niklan # 12.01.2017 - 08:33

Это не имеет значения. После % можно писать что угодно, это лишь для вас чтобы понятнее было. Просто на место этой "переменной" подставится значения из этой части URL, на данном этапе нет никакого парсинга, поэтому дальше предлагают выбрать что это за данные. Можете хоть %blabla назвать.

С
Сергей # 06.04.2017 - 20:41

Как то не могу найти токен join-path в модуле Pathauto при настройки пути node , или это не принципиально ?

N
Niklan # 07.04.2017 - 10:23

Это скорее всего от какого-то модуля типа Entity Token идет, я уж точно и не помню. Но поставив Path Breadcrubms они вроде по зависимости приедут.

С
Сергей # 07.04.2017 - 15:19

katalog/[node:field-katalog:0]/[node:field-katalog:1]/[node:field-katalog:2]/[node:title]/[node:product:model] Вот такой цепочкой возможен путь node для хлебной крошки ?

Ю
Юля # 25.04.2017 - 17:00

Niklan, Вы-умница! Огромное спасибо, ваша статья очень помогла))

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

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