Drupal → Mega Menu своими руками

08.02.2012

Мега-меню это выпадающее меню, во втором уровне которого, помимо ссылок, может выводится любая другая информация — представления views, блоки, материалы и т.д.

Mega menu

На drupal.org есть несколько модулей для создания таких меню, но мне не подошёл ни один, поэтому пришлось писать ручками.

Основная задача — добавить в каждый пункт меню div с произвольным контентом, который и показывать при наведении.

Моё решение:

1. Добавить в template.php

/**
 * Preprocess function for theme_menu_link()
 */
function THEMENAME_preprocess_menu_link(&$vars) {
  if ($vars['element']['#original_link']['menu_name'] == 'main-menu') {
    if ($vars['element']['#title'] == 'Пункт 1') {
      $vars['element']['#below']['content_for_mm']['#markup'] = 'Нужный контент для пункта 1...';
    }
    else if ($vars['element']['#title'] == 'Пункт 2') {
      $vars['element']['#below']['content_for_mm']['#markup'] = 'Нужный контент для пункта 2...';
    }
    // ...

    if ($vars['element']['#below']) {
      $vars['element']['#below']['#prefix'] = '<div class="mega-menu">';
      $vars['element']['#below']['#suffix'] = '</div>';
    }
  }
}

2. Добавить в .css файл темы

ul.menu li .mega-menu {
  display: none;
  position: absolute;
  z-index: 10;
  background: white;
  border: 1px solid black;
  padding: 10px;
  box-shadow: 3px 3px 8px rgba(0, 0, 0, .5);
}

ul.menu li:hover .mega-menu {
  display: block;
}

Результат:

Mega menu

Единственное условия — меню нужно выводить с помощью блоков, а не в page.tpl.php.

Написанное актуально для
Drupal 7
Похожие записи

Комментарии

Единственное условия — меню нужно выводить с помощью блоков, а не в page.tpl.php.

Почему же? Помнится, я генерировал меню в THEMENAME_preprocess_page(), а в page.tpl.php просто вставлял переменную с полностью сгененирированным кодом.

ну так возможно и будет работать, надо смотреть чтобы пункты проходили через theme_menu_link()

Дмитрий
10.02.2012, 06:38

Возникает вопрос, насколько быстро такое меню работает, особенно если там views?

ну так возможно и будет работать, надо смотреть чтобы пункты проходили через theme_menu_link()

Точно! Вспомнил! Я тогда пошел незеленым путем и вручную извлекал данные о пунктах меню, обойдя типичный процесс темизации.

drupal.ru есть несколько модулей для создания таких меню

Наверно, имелся ввиду drupal.org?

Гость
18.02.2012, 06:07

Есть еще такой модуль http://drupal.org/project/om_maximenu достаточно функциональный, куча настроек, выводит содержимое блоков в качестве подменю.

А как, собствеенно, вывести это меню с помощью блока? Где и что прописать?

структура - блоки - переместить - сохранить

Гость
04.05.2013, 16:08

Привет

Простое и грамотное решение, на друпал 6 это возможно?

Если да, копать в сторону програмного вывода меню или куда вообще?))

Заранее благодарен

Гость
05.05.2013, 16:06

Красивое меню, зачастую необходим такой сложный вывод.

Гость
14.11.2013, 17:36

Коллега, Вы зря мучились. связка Nice menu + Menu Views - вот решение А вот не подскажет ли кто как сделать, чтобы н на 1-м уровне было с картинками?

Гость
10.02.2014, 15:47

Для Drupal 6 тоже было бы интересно подобное решение..

Дмитрий
08.03.2016, 18:21

Подскажите, как можно реализовать на drupal меню как на этом сайте (блок лучших записей с миниатюрами)?

спасибо, а как это сделать для drupal8?

Добавить комментарий