Хлебные крошки на страницах таксономии (Views)

breadcrumbs.jpg«Хлебные крошки» (англ. Breadcrumbs, по ироничной аналогии с немецкой сказкой "Гензель и Гретель", в которой дети, когда их завели в лес во второй раз, не смогли найти обратную дорогу, так как на этот раз вместо маленьких камешков они оставляли за собой хлебные крошки, впоследствии склеванные лесными птицами) — элемент навигации по сайту, представляющий собой путь по сайту от его «корня» до текущей страницы, на которой находится пользователь. (википедия ру)

В Drupal добавить хлебные крошки довольно легко, достаточно в файле темы прописать их вывод. Обычно они выводятся на всех страницах, кроме главной.

<?php if (!$is_front): print $breadcrumb; endif; ?>

Но кое-где крошки работают не так, как нам нужно. В некоторых случаях помогают отличные дополнительные модули Taxonomy Breadcrumb, Custom Breadcrumbs и другие. Для себя в одном из случаев я нашел следующее решение, а именно - для страниц терминов таксономии.

У модуля Views есть очень полезная вьюха, которая идет с модулем. Ее остается только включить и настроить. Называется она taxonomy_term (default). Работает она по следующиму пути "taxonomy/term/%", т.е. страница термина любого словаря будет обрабатываться именно этой вьюхой.

Разберем такой пример. На сайте есть два типа материала, использующих таксономию: Новости и Каталог (товар в каталог).

Для задания нужного пути в крошках на странице вьюхи taxonomy_term, я написал следующий код блок Заголовка (header):

<?php
 
$breadcrumb = array();
$breadcrumb[] = l(t('Home'), "<front>");
 
if(arg(2) && $term1 = taxonomy_get_term(arg(2))) {
 
 $voc1 = taxonomy_vocabulary_load($term1->vid);
 switch ($voc1->name) {
  case 'Каталог': $voclink = 'catalog'; break;
  case 'Новости': $voclink = 'news'; break;
 }
 $breadcrumb[] = l(t($voc1->name), $voclink);
 
 if ($term2 = taxonomy_get_parents($term1->tid)) {
foreach ($term2 as $parent) {
$breadcrumb[] = l($parent->name, 'catalog/1/'.$parent->tid);
}
//$breadcrumb[] = l($term1->name, 'catalog/'.$term2[1]->tid.'/'.$term1->tid);
	}
//else {$breadcrumb[] = l($term1->name, 'catalog/'.$term1->tid);}
}
 
drupal_set_breadcrumb($breadcrumb);
 
?>

Так как путь у термина выглядит как //taxonomy/term/id, то получив id и проверив является ли он термином таксономии (taxonomy_get_term), я для добавления нужного пути сперва проверяю к какому словарю термин относится (taxonomy_vocabulary_load), а уже затем пишу один из двух путей созданных ранее вьюх (news и catalog). Затем я проверяю есть ли у термина родители (taxonomy_get_parents), т.е. словарь ведь может быть многоуровневым (в моем случае всего двухуровневый). Если найден родитель, то я вписываю именно его. Последние выводы самой ссылки на активную страницу я закомментировал, логично будет если мы в навигационной линейке будем видеть только родителей.

После этого находясь к примеру на странице Экономических новостей я вижу крошки: "Главная - Новости", а на странице Двухкамерные холодильники: "Главная - Каталог - Холодильники".

2 комментария for 'Хлебные крошки на страницах таксономии (Views)'

1. Функция taxonomy_get_parents

Функция taxonomy_get_parents возвращает родителей только текущего термина, не проверяя дальнейшую иерархию. Чтобы она правильно отработала для всего дерева предков - пришлось бы вызывать ее рекурсивно.

Для многоуровневого словаря правильнее использовать конструкцию:

if ($term2 = taxonomy_get_parents_all($term1->tid)) {
$term2 = array_reverse($term2);
foreach ($term2 as $parent) {
$breadcrumb[] = l($parent->name, 'taxonomy/term
}
}

Функция taxonomy_get_parents_all вернет всю иерархию родителей для текущего термина от конца к началу. В итоге останется только развернуть массив в обратном порядке функцией array_reverse и занести в список breadcrumb-ов.

Спасибо за статью. Я с ее помощью таки сумел настроить вывод breadcrumb-а на странице просмотра ноды по присвоенному ноде термину.

2. Четвертая строка не полностью

Четвертая строка не полностью получилась. Там вторым параметром должно быть:

"taxonomy/term/" . $parent->tid

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
CAPTCHA
Этот вопрос задается для того, чтобы выяснить, являетесь ли Вы человеком или представляете из себя автоматическую спам-рассылку.
CAPTCHA на основе изображений
Enter the characters shown in the image.