[Решено частично] Не могу нормально изменить вид дерева меню

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

Аватар пользователя hubba hubba 11 ноября 2008 в 13:29

Здравствуйте.

Пытаюсь изменить вид стандартного меню Друпала.
Вывод меню в нужной мне верстке я сделал. Для этого задал свою функцию в template.php. Я переделал под себя две функции: phptemplate_menu_tree и phptemplate_menu_item .

Осталась одна загвоздка: мне надо, чтобы активный элемент меню находился в DIV, т. к. к этому диву я применяю background-image (это изображение ввиде кнопки, которое визуально выделяет активный пункт). Я нашел, что элемент меню выводитья в теге

<a>

со стилем "active". Может есть способ выводить элемент в

<div><a style=active>....

?

P. S. Попытался реализовать это с помощью Ява-скрипта:

 function FoundActive(){
       var menus = document.getElementsByClassName('el');
       for(var i=0; i < menus.length; i++){
           el = menus[i].childNodes[0];
          if (el.className == 'active'){
              el.parentNode.className = 'el_hover';

          }
       }
     }

Этот скрипт, по идее, должен находит в коде сроку со стилем active, и применять к родительскому диву другой стиль. НО этот код не работает.

Комментарии

Аватар пользователя glu2006 glu2006 11 ноября 2008 в 14:07
function theme_menu_local_task($mid, $active, $primary) {
  if ($active) {
    return '<li class="active">'. menu_item_link($mid) ."</li>\n";
  }
  else {
    return '<li>'. menu_item_link($mid) ."</li>\n";
  }
}

Пишем так:

function phptemplate_menu_local_task($mid, $active, $primary) {
  if ($active) {
    return '<div><li class="active">'. menu_item_link($mid) ."</li></div>\n";
  }
  else {
    return '<li>'. menu_item_link($mid) ."</li>\n";
  }
}

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

Аватар пользователя glu2006 glu2006 11 ноября 2008 в 15:08

hubba wrote:
Так ведь menu_local_task - это горизонтальное меню в виде "закладочек". Или я ошибаюсь?

А кто мешает проверить? Я на 100% не уверен. Я как говорится лишь попробовал указать направление ).
Если это не то что надо, то надо дебажить и смотреть кто цепляет тегу класс "актив".

function phptemplate_menu_item_link($item, $link_item) {
  return l($item['title'], $link_item['path'], !empty($item['description']) ? array('title' => $item['description']) : array(), isset($item['query']) ? $item['query'] : NULL);
}

может так попробовать:

function phptemplate_menu_item_link($item, $link_item) {
  if (проверка условия на active = TRUE /*я не дебажил в какой переменной что хранится, оставляю это Вам*/) {
    return '<div>'.l($item['title'], $link_item['path'], !empty($item['description']) ? array('title' => $item['description']) : array(), isset($item['query']) ? $item['query'] : NULL).'</div>';
  } else {
    return l($item['title'], $link_item['path'], !empty($item['description']) ? array('title' => $item['description']) : array(), isset($item['query']) ? $item['query'] : NULL); }
Аватар пользователя hubba hubba 12 ноября 2008 в 11:34

Проблема частично решена.

Функция menu_in_active_trail(), если ей пердать идентификатор пункта меню (обычно $mid), возвращает TRUE, если этот пункт активный.
НО, Друпал считает активным не только тот пункт, на котором мы сейчас "стоим", но и родительский!
Я поправил функцию ,чтобы она выводила в другой div активный пункт, но получается как изображено на картинке:

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

Вот такой код у меня в template.php у функции phptemplate_menu_item()

if(menu_in_active_trail($mid) and $children)
        {
         return " <li>
            <div><div class='el_ho' >"
. menu_item_link($mid) ."</div></div>
            <div class='el_ch'>"
. $children ."</div>
           </li>"
;

        }

  return " <li>
            <div><div class='el' >"
. menu_item_link($mid) ."</div></div>
            <div class='el_ch'>"
. $children ."</div>
           </li>"
;