Система меню в друпале сделана правильно и в большинстве случаев не требует установки каких то дополнительных модулей, чтобы получить тот результат, который требуется. И в данной статье мы не будем как то дополнять саму систему меню drupal-а.
В тоже время штатные блоки (blocks) предоставляемые модулем меню не сильно радуют гибкостью настроек. Да и нет фактически никаких настроек.
Задача
Не редко возникает следующая задача — вывести не всё меню, а меню соответствующее подразделу сайта. Подразумевается, что где то выводится содержимое корня меню (допустим полоска главного меню, построенная на основе primary-menu), т.е. какие то основные разделы сайта. А уже в самих разделах нужно показать блок меню с подразделами, исключая корень (первый уровень меню).
Нужно это обычно для того, чтобы не дублировать главное меню в блоке с подменю. Также я сталкивался с решениями в дизайне, когда отдельно выводят первые два уровня меню (корень и подуровень) и нужно как бы отсечь два уровня меню от корня для вывода их в разделах сайта.
Модуль
Код, решающий эту задачу, состоит из одной короткой функции, и ещё одна функция объявляет блок (block) для движка drupal.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
/* DRUPAL MODULE CODE */ /** * Implementation of hook_block * @param string $op one of "list", "view", "save" and "configure" * @param integer $delta code to identify the block * @param array $edit only for "save" operation **/ function level3_block($op = 'list', $delta = 0, $edit = array()) { switch ($op) { case 'list': // Generate listing of blocks from this module, for the admin/block page $block = array(); $block[0]["info"] = t('Рубрики главного меню'); return $block; case 'view': return _level3_valuteblock(); } } /* вывод блока с рубриками и подрубриками текущего меню начиная с уровня 2 */ function _level3_valuteblock() { $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]); } $menu_output = menu_tree_output($tree); return array('content' => $menu_output, 'subject' => ''); } |
Суть работы сводится к тому, что мы получаем данные всего дерева меню, а затем убираем нужное число уровней (число итераций, устанавливаемое в цикле) от корня меню.
Если модуль вам может оказаться полезным — качайте архив.