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

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

  • пункт 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
Аватар пользователя Spleshka
Spleshka написал:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

в файле 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
Аватар пользователя Spleshka
Spleshka написал:

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

print render(menu_tree('main-menu'));
25.08.2011 20:24
Аватар пользователя pr0g
pr0g написал:

В моем случае подменю выводятся в ноде, которая связана с пунктом меню верхнего уровня, а то пустая нода выглядит не эстетично.
Поэтому у меня вопрос, можно ли вывести к пунктам меню их описание (желательно пример)? По структуре массива понял что придется глубоко в него углубляться, а мои познания в API Drupal не так сильны.

29.11.2013 13:47

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