Добавить в menu block функционал jquerymenu

Аватар пользователя Andruxa Andruxa 27 декабря 2010 в 18:41

Привет.

Модуль jquerymenu позволяет сделать удобное меню для сайдбара - с разворачиванием подпунктов меню без перезагрузки страницы, но при этом у него есть один существенный недостаток - нельзя указать, с какого подпункта меню начинать вывод, и его глубину.

Этого недостатка лишен модуль menu block, но он лишен функционала jquery.

Итак, скрещиваем ужа с ежом.

В файле template.php своей темы добавляем функции:

function название-темы_menu_item__menu_block__номер-блока($link, $has_children, $menu = '', $in_active_trail = FALSE, $extra_class = NULL) {
  $class = ($menu && $in_active_trail ? 'parent open' : ($has_children ? 'parent closed' : 'leaf')); // Для того, чтобы
// menu_block выводил на страницу все подпункты меню, а не только верхнего уровня
// (а то разворачивать будет нечего), нужно либо в настройках меню, либо в настройках
// блока menu_block раскрыть все подпункты меню, но в таком случае оно будет изначально
// выводиться на страницу полностью раскрытым, что не есть хорошо. Здесь всем пунктам
// меню назначается класс closed, кроме тех, которые in_active_trail

//  if (!empty($extra_class)) {     Тут добавляются дополнительные классы,
//    $class .= ' '. $extra_class;  вроде lirst, last, menu-его номер
//  }                               мне они без надобности, поэтому отключаю

  if ($in_active_trail) {         // Добавляется класс active-trail
    $class .= ' active-trail';    // чтобы меню разворачивалось до
  }                               // активного пункта

  return '<li class="'. $class .'">' . ($menu && $in_active_trail ? '<span class="parent open"></span>' : ($has_children ? '<span class="parent closed"></span>' : '')) . $link . $menu . "</li>\n";
  // добавляем span-контейнер для значка раскрытия/скрытия подпунктов
}

function название-темы_menu_tree__menu_block__номер-блока($tree){
  return '<ul>'. $tree .'</ul>';
}

Меню, к которому прикручивается jquery, можно идентифицировать по номеру блока (как в примере), либо по имени меню, либо прикрутить jquery ко всем меню, генерируемым menu block. Подробности в sites/all/modules/menu_block/README.txt

Теперь копируем файл sites/all/modules/menu_block/menu-block-wrapper.tpl.php в папку со своей темой и правим его:

<?php
if (strpos($classes,'menu-block-номер-блока')=== false) { ?>
        <div class="<?php print $classes; ?>">
                <?php print $content; ?>
        </div> <?php }
else {
        print preg_replace('<ul>', 'ul class="menu jquerymenu"', $content, 1);
} ?>

Тут у меня вопрос: по идее, функция замены должна выглядеть так:
preg_replace('<ul>', '<ul class="menu jquerymenu">', $content, 1)
но в таком случае выводятся лишние скобки < и >

покурил мануал к preg_replace, но не вставило. Поэтому оставил как в примере.

Все, теперь можно отключать модуль jquerymenu, не забывая скопировать файлы jquerymenu.css и jquerymenu.js в папку своей темы и подключить их:

drupal_add_css(drupal_get_path('theme', 'название-темы') .'/jquerymenu.css');
drupal_add_js(drupal_get_path('theme', 'название-темы') .'/jquerymenu.js');

Комментарии

Аватар пользователя Andruxa Andruxa 27 декабря 2010 в 23:31

luxurypet.ru, меню "каталог" слева

UPD - подумав, изменил код в menu-block-wrapper.tpl.php,
добавив проверку на номер блока.
Мало ли, вдруг на странице окажется несколько блоков menu_block, а прикручивать jquery нужно не ко всем.

Аватар пользователя vicshine vicshine 8 апреля 2012 в 17:39

"Andruxa" wrote:
Ну, в D.7 api существенно изменилось, так что неудивительно.

Есть ли надежда на добавление подобного функционала для D7? Smile
Остро нужна такая фишка, но времени ковырять API и сравнивать - уже совершенно нет.. может быть есть какой-нибудь альтернативный модуль с подобным функционалом?