УрокВывод подменю при клике на пункт меню верхнего уровня
О чём я хочу сегодня поговорить - это о том, как выводить подменю, при нажатии на пункт меню. Вот что я имею ввиду: допустим, у нас есть такая структура у меню:
- пункт 1
- подпункт 1.1
- подпункт 1.2
- подпункт 1.3
- пункт 2
- пункт 3
- подпункт 3.1
- подпункт 3.2
И выводится только верхние пункты - то есть пункт 1, пункт 2, пункт 3. При клике на пункт 1 у нас появится блок, содержащий подпункт 1.1, подпункт 1.2, подпункт 1.3. По клику на пункт 2 - ничего не появится (т.к. этот пункт не содержит подменю). Кликнув на пункт 3 мы получим подпункт 3.1 и подпункт 3.2. Надеюсь, суть понятна. Если нет - вот тут реализованно такое меню. Покликайте по пунктам - увидите
Реализация
Создаём в админке обычный блок /admin/build/block/add с любым названием и заголовком. Главное - содержимое. Оно должно быть именно таким:
//получает всё меню primary-links $tree = menu_tree_page_data('primary-links'); for($i = 1; $i--; $i >= 0) { foreach ($tree as $k => $v) { if (!empty($v['below']) && $v['link']['in_active_trail']) { $tree = $v['below']; break; } else { unset($tree[$k]); } } print menu_tree_output($tree); }
Теперь остаётся поставить формат ввода - php code и сохранить блок. Всё, блок с подменю готов :)
В следующем уроке я расскажу как сделать из этого настраиваемый модуль
- Spleshka
- 20.01.2011
- 17897
Комментарии
Интересно!
Но почему нельзя использовать стандартные модули(тот же dhtml_menu например)?
а зачем ставить модуль ради нескольких строк кода ?)
SplasH, Вы явно не дружите с фигурными скобками..этот код не может работать.
А если нужно на дочерней странице вывести дочернее меню. есть модуль menu_block.
Да, можно и модуль сторонний подключить. А можно ещё пару строк кода добавить)
модули - это и есть пару строк кода, уже написанные за тебя :)
кмк самописных модулей должно быть меньше, чтобы после тебя, другой разработчик мог поддерживать сайт :)
не, тут можно даже модуль не использовать. Засунул в блок - и радуйся)
Скажите как сделать что бы в Гарланде отображались дочерние пункты меню??? (не искпользуя блоки для отображения меню)
в файле page.tpl.php замените
на
Почему не использовать готовый блок, который предоставляет каждое меню? + использование php - кода в блоках не лучшие практики.
Я вообще за разработку в ручную так интереса больше. Хотя и дольше, но зато свои ошобки исправлять легче чем чужие.
Подскажите, пожалуйста, что я делаю не так.
Drupal 7.x. Тема Bartik.
Хочу вывести вложенную структуру меню:
print menu_tree( 'main-menu' );
или
print menu_tree_output( menu_tree_page_data( 'main-menu' ) );
выводят просто слово Array.
Не перебирать же массив $tree самому каждый раз :(
Судя по описаниям используемых функций в файле /vm/nauhost/www/drupal/includes/menu.inc - они должны работать так как написано выше. Но что-то идёт там не так. Заранее спасибо за ответ.
Вы забываете главное отличие в темизации между Drupal 6 и Drupal 7, а именно - рендер. Чтобы работал ваш код, надо обернуть его в функцию render():
В моем случае подменю выводятся в ноде, которая связана с пунктом меню верхнего уровня, а то пустая нода выглядит не эстетично.
Поэтому у меня вопрос, можно ли вывести к пунктам меню их описание (желательно пример)? По структуре массива понял что придется глубоко в него углубляться, а мои познания в API Drupal не так сильны.
Комментировать