Собственно была задача сделать каталог продукции. Каждая нода привязана к словарю с терминами каталога.
Долго бился над активным пунктом меню, но н осилил чрез API. Если у кого есть опыт, как сделать актывный пункт меню в Taxonomy menu, то отпишите, пожалуйста, а то моск сломал.
Реализовал следующим образом:
1. Для хлебных крошек в template.php добавил:
<?php
function THEME_breadcrumb($variables) {
if ( arg(0) == 'node' && is_numeric(arg(1)) ) {
$node = node_load(arg(1));
if ($node->type=='product') {
$current = taxonomy_term_load($node->field_ИМЯ_ПОЛЯ['ru'][0]['tid']);
$breadcrumb[] = l($current->name, 'taxonomy/term/' . $current->tid);
while ($parents = taxonomy_get_parents($current->tid)) {
$current = array_shift($parents);
$breadcrumb[] = l($current->name, 'taxonomy/term/' . $current->tid);
}
$breadcrumb[] = l(t('Home'), NULL);
$breadcrumb = array_reverse($breadcrumb);
}
}
else {
$breadcrumb = $variables['breadcrumb'];
}
if (!empty($breadcrumb)) {
return '<div class="breadcrumb">'. implode(' » ', $breadcrumb) .'</div>';
}
}
?>
2. Меню пришлось сделать вручную через снипет в блоке:
<?php
$vid = 1; // Номер словаря
//Получаем tid ноды
$active_tid = NULL;
$active_parent = NULL;
if (arg(0)=="node" && is_numeric(arg(1))) {
$node = node_load(arg(1));
$res =db_query("SELECT ti.tid FROM {taxonomy_index} ti INNER JOIN {taxonomy_term_data} td ON td.tid=ti.tid
WHERE ti.nid = :nid and td.vid = :vid ",array(':nid' => arg(1), ':vid' => $vid))->fetchField();
$active_parent = NULL;
if ($res) {
$active_tid = $res;
$active_parents = taxonomy_get_parents($active_tid);
foreach ($active_parents as $key=>$value) {
$active_parent = $key;
}
}
}
else if (arg(0)=="taxonomy" && arg(1)=="term" && is_numeric(arg(2))) {
$active_tid = arg(2);
$active_parent = arg(2);
$active_parents = taxonomy_get_parents($active_tid);
foreach ($active_parents as $key=>$value) {
$active_parent = $key;
}
}
$pole = array();
$items = array();
$tree = taxonomy_get_tree($vid);
foreach ($tree as $term) {
$count = 0;
$parent = NULL;
$parents = taxonomy_get_parents($term->tid);
foreach ($parents as $key=>$value) {
$parent = $key;
}
$options = array();
if ($active_tid == $term->tid) {
$options['attributes']['class'][] = 'active';
}
if (!$parent) {
$options['attributes']['class'][] = 'root';
}
$pole[]=Array (l($term->name, "taxonomy/term/$term->tid",$options) , $term->depth, $count, $term->tid, $parent);
}
$depth =-1;
foreach ($pole as $list) {
//$depth- глубина предыдущего уровня
//$list[1] - глубина текущего элемента
if ($list[1] == $depth) {
echo "</li>";
// next;
}
while ($list[1] != $depth) {
if ($list[1] > $depth) {
$depth++;
echo "\n<ul>";
//next;
}
if ($list[1] < $depth) {
$depth--;
echo "\n</li>\n</ul>";
}
}
if ($depth == 0 || ($active_parent == $list[4]) ) {
echo "\n<li>$list[0]";
}
$depth=$list[1];
}
//Закрываем все открытые теги до нулевого уровня:
$depth=0;
while ($list[1] != $depth) {
if ($list[1] > $depth) {
$depth++;
echo "</li>\n</ul>";
}
}
?>
Более элегантного и быстрого решения пока не нашел.
Комментарии
Огромное спасибо.
Вроде бы решение есть через модуль http://drupal.org/project/taxonomy_menu_trails
Вроде бы — потому, что у меня то решение не заработало, а ваше работает как надо
Настраивали?
Я, честно, настройки не с первого раза нашел.
Оказалось это в типе материала, в поле "Ссылка на термин" нужно галку поставить использовать "Taxonomy menu trails"
Рискну апнуть тему с дополнительным вопросом по сути, дабы не плодить аналогичного топика.
У меня вопрос по пункту 1 - все работает замечательно, но для нод. А если каталог организован с помощью Views, точнее говоря, с помощью "штатного" вьюса Taxonomy term? Как вывести крошки для этих страниц? Я так понимаю, что можно в код добавить условие для страницы термина? Или это неправильно?
Можно попробовать использовать [api=drupal_set_breadcrumb] в самом views. Например добавить в заголовок текстовое поле, выставить фильтр PHP, и там написать код, реализующий формирование крошек для данного views.
Но это вариант для "продвинутых", если с PHP не очень, то можно попробовать модуль Сustom breadcrumbs. Я сам им не пользуюсь, но вроде как там есть настройки для работы с views.
В общем пробуйте.
Спасибо за ответ. Сustom breadcrumbs я пытался использовать. Альфа-версия для семерки как-то хреново работает... По-крайней мере во вьюсах. Решил проблему тем, что допилил приведенную функцию, добавив условие проверки
<?phpelseif (arg(0) == 'taxonomy' && arg(1) == 'term' && is_numeric(arg(2))) {?>
ну, а дальше - по аналогии
Использовал http://drupal.org/project/taxonomy_menu_trails
Добавляет настройку в типе материала Taxonomy Menu Trails можно выбрать словарь в котором делать активным родительский пункт меню внутри которого Статья.
Получилось нормально.