УрокВывод подменю при клике на пункт меню верхнего уровня

О чём я хочу сегодня поговорить - это о том, как выводить подменю, при нажатии на пункт меню. Вот что я имею ввиду: допустим, у нас есть такая структура у меню:

  • пункт 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 и сохранить блок. Всё, блок с подменю готов :)

В следующем уроке я расскажу как сделать из этого настраиваемый модуль

Комментарии

Аватар пользователя torvild
torvild написал:

Интересно!

Но почему нельзя использовать стандартные модули(тот же dhtml_menu например)?

27.01.2011 17:24
Аватар пользователя SplasH
SplasH написал:

а зачем ставить модуль ради нескольких строк кода ?)

27.01.2011 19:20
Аватар пользователя Тайный поклонник
Тайный поклонник написал:

SplasH, Вы явно не дружите с фигурными скобками..этот код не может работать.

28.01.2011 19:06
Аватар пользователя otmoroz095
otmoroz095 написал:

А если нужно на дочерней странице вывести дочернее меню. есть модуль menu_block.

01.03.2011 15:23
Аватар пользователя SplasH
SplasH написал:

Да, можно и модуль сторонний подключить. А можно ещё пару строк кода добавить)

01.03.2011 18:17
Аватар пользователя otmoroz095
otmoroz095 написал:

модули - это и есть пару строк кода, уже написанные за тебя :)
кмк самописных модулей должно быть меньше, чтобы после тебя, другой разработчик мог поддерживать сайт :)

02.03.2011 10:13
Аватар пользователя SplasH
SplasH написал:

не, тут можно даже модуль не использовать. Засунул в блок - и радуйся)

02.03.2011 12:32
Аватар пользователя АНАНИМУС ))
АНАНИМУС )) написал:

Скажите как сделать что бы в Гарланде отображались дочерние пункты меню??? (не искпользуя блоки для отображения меню)

02.03.2011 21:19
Аватар пользователя SplasH
SplasH написал:

в файле page.tpl.php замените

<?php if (isset($primary_links)) : ?>
  <?php print theme('links', $primary_links, array('class' => 'links primary-links')) ?>
<?php endif; ?>

на

<?php if (isset($primary_links)) : ?>
  <?php print menu_tree('primary-links'); ?>
<?php endif; ?>
03.03.2011 14:19
Аватар пользователя Тайный поклонник
Тайный поклонник написал:

Почему не использовать готовый блок, который предоставляет каждое меню? + использование php - кода в блоках не лучшие практики.

09.04.2011 03:03
Аватар пользователя Тайный поклонник
Тайный поклонник написал:

Я вообще за разработку в ручную так интереса больше. Хотя и дольше, но зато свои ошобки исправлять легче чем чужие.

02.06.2011 19:28
Аватар пользователя somebody
somebody написал:

Подскажите, пожалуйста, что я делаю не так.
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 - они должны работать так как написано выше. Но что-то идёт там не так. Заранее спасибо за ответ.

25.08.2011 18:42
Аватар пользователя SplasH
SplasH написал:

Вы забываете главное отличие в темизации между Drupal 6 и Drupal 7, а именно - рендер. Чтобы работал ваш код, надо обернуть его в функцию render():

print render(menu_tree('main-menu'));
25.08.2011 20:24

Комментировать

                                                                        
8b d8 88888888888 88 88 ad8888ba, ad888888b,
Y8, ,8P 88 88 88 8P' "Y8 d8" "88
Y8, ,8P 88 88 88 d8 a8P
"8aa8" 88aaaaa 88aaaaaaaa88 88,dd888bb, ,d8P"
`88' 88""""" 88""""""""88 88P' `8b a8P"
88 88 88 88 88 d8 a8P'
88 88 88 88 88a a8P d8"
88 88888888888 88 88 "Y88888P" 88888888888

Enter the code depicted in ASCII art style.