Привет.
Модуль jquerymenu позволяет сделать удобное меню для сайдбара - с разворачиванием подпунктов меню без перезагрузки страницы, но при этом у него есть один существенный недостаток - нельзя указать, с какого подпункта меню начинать вывод, и его глубину.
Этого недостатка лишен модуль menu block, но он лишен функционала jquery.
Итак, скрещиваем ужа с ежом.
В файле template.php своей темы добавляем функции:
$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 в папку со своей темой и правим его:
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_js(drupal_get_path('theme', 'название-темы') .'/jquerymenu.js');
Комментарии
есть пример работающий?
luxurypet.ru, меню "каталог" слева
UPD - подумав, изменил код в menu-block-wrapper.tpl.php,
добавив проверку на номер блока.
Мало ли, вдруг на странице окажется несколько блоков menu_block, а прикручивать jquery нужно не ко всем.
А под 7-й не пашет код...
Выводит вместо меню слово "Array"
Ну, в D.7 api существенно изменилось, так что неудивительно.
Есть ли надежда на добавление подобного функционала для D7?
Остро нужна такая фишка, но времени ковырять API и сравнивать - уже совершенно нет.. может быть есть какой-нибудь альтернативный модуль с подобным функционалом?