Активный пункт меню, breadcrumbs зависящие от отображаемой ноды

Главные вкладки

Аватар пользователя validoll validoll 8 июля 2011 в 16:29

Собственно была задача сделать каталог продукции. Каждая нода привязана к словарю с терминами каталога.
Долго бился над активным пунктом меню, но н осилил чрез 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 == || ($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>";
  }
}
?>

Более элегантного и быстрого решения пока не нашел.

Комментарии

Аватар пользователя validoll validoll 27 сентября 2011 в 15:18

"Constantinich" wrote:
Вроде бы — потому, что у меня то решение не заработало

Настраивали?
Я, честно, настройки не с первого раза нашел.
Оказалось это в типе материала, в поле "Ссылка на термин" нужно галку поставить использовать "Taxonomy menu trails"

Аватар пользователя inspire inspire 4 апреля 2012 в 10:49

Рискну апнуть тему с дополнительным вопросом по сути, дабы не плодить аналогичного топика.
У меня вопрос по пункту 1 - все работает замечательно, но для нод. А если каталог организован с помощью Views, точнее говоря, с помощью "штатного" вьюса Taxonomy term? Как вывести крошки для этих страниц? Я так понимаю, что можно в код добавить условие для страницы термина? Или это неправильно?

Аватар пользователя validoll validoll 12 апреля 2012 в 8:56

Можно попробовать использовать [api=drupal_set_breadcrumb] в самом views. Например добавить в заголовок текстовое поле, выставить фильтр PHP, и там написать код, реализующий формирование крошек для данного views.
Но это вариант для "продвинутых", если с PHP не очень, то можно попробовать модуль Сustom breadcrumbs. Я сам им не пользуюсь, но вроде как там есть настройки для работы с views.
В общем пробуйте.

Аватар пользователя inspire inspire 13 апреля 2012 в 13:30

Спасибо за ответ. Сustom breadcrumbs я пытался использовать. Альфа-версия для семерки как-то хреново работает... По-крайней мере во вьюсах. Решил проблему тем, что допилил приведенную функцию, добавив условие проверки

<?phpelseif (arg(0) == 'taxonomy' && arg(1) == 'term' && is_numeric(arg(2))) {?>
ну, а дальше - по аналогии

Аватар пользователя tlito tlito 18 ноября 2013 в 18:11

Использовал http://drupal.org/project/taxonomy_menu_trails
Добавляет настройку в типе материала Taxonomy Menu Trails можно выбрать словарь в котором делать активным родительский пункт меню внутри которого Статья.
Получилось нормально.