• Авторизация


1c-Bitrix: компонента bitrix:menu - реализация многоуровневого меню. 04-08-2008 14:00 к комментариям - к полной версии - понравилось!


Данный материал, по большей части, является сборкой из всего что мне удалось найти по этой теме + свои наработки. Данная проблема - уже давно не проблема, но судя по кол-ву вопросов на всяких форумах, еще достаточно жива. Приступим.

Для реализации многоуровневого меню необходимо всего-навсего:
обьявить необходимые менюшки (Настройка - Настройка модулей - Управление структурой);
выбрать(из имеющихся)/реализовать подходящий шаблон для меню;
правильно инициализировать компоненту bitrix:menu в шаблоне сайта.
Теперь по порядку..
1. Управление структурой.
В административной части сайта необходимо перейти "Настройка" - "Настройка модулей" - "Управление структурой" и поле "Типы меню" указать необходимые меню. В моем случае это:
"right" - "Правое вертикальное меню"
"right_child" - "Правое вертикальное вложенное"
Далее, в примерах, будет описана работа именно с этими типами меню.

2. Реализация шаблона для меню
"Умолчальных" шаблонов для меню достаточно. Единственное что в них не так - оформление может не подойти. Реализовать свой шаблон для меню (возможно на основе имеющихся) - не вопрос.
Сами шаблоны меню хранятся в /bitrix/components/bitrix/menu/templates. Структуру описывать не буду - аналогично со структурой шаблона сайта. В пример приведу лишь только пример самого шаблона (/bitrix/components/bitrix/menu/templates/mymenutmpl/template.php):

< ?if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();? >
< ?
echo "< ul >";
$previousLevel = 0;
$isActive = True;
foreach($arResult as $arItem){
        if($arItem["SELECTED"])$isActive = False;
                else $isActive = True;
        if($previousLevel && $arItem["DEPTH_LEVEL"] < $previousLevel){
                echo str_repeat("< /ul >< /li >", ($previousLevel - $arItem["DEPTH_LEVEL"]));
        }
        if($arItem["IS_PARENT"]){
                if($arItem["DEPTH_LEVEL"]==1){
                        if($isActive)echo "< li >< a href=\"".$arItem["LINK"]."\" >".$arItem["TEXT"]."< /a >< /li >";
                        else echo "< li >".$arItem["TEXT"]."< /li >";
                        echo "< ul >";
                }else{
                          if($isActive)echo "< li >< a href=\"".$arItem["LINK"]."\" >".$arItem["TEXT"]."< /a >< /li >";
                                  else echo "< li >".$arItem["TEXT"]."< /li >";
                        echo "< ul >";
                }
        }else{
                if($isActive)echo "< li >< a href=\"".$arItem["LINK"]."\" >".$arItem["TEXT"]."< /a >< /li >";
                        else echo "< li >".$arItem["TEXT"]."< /li >";
        }
$previousLevel = $arItem["DEPTH_LEVEL"];
$isActive = False;
}
if($previousLevel > 1){
        echo str_repeat("< /ul >< /li >", ($previousLevel-1));
}
echo "< /ul >";
? >

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

3. Инициализация компоненты bitrix:menu
Далее, в нужном месте шаблона сайта, инициализируем меню:
<  ?$APPLICATION-  >IncludeComponent(
        "bitrix:menu",
        "
mymenutmpl",
        Array(
                "ROOT_MENU_TYPE" = > "
right",
                "MAX_LEVEL" = > "3",
                "CHILD_MENU_TYPE" = > "
right_child",
                "USE_EXT" = > "N"
        )
);? >

Жирным выделены места на которые стоит обратить особое внимание ;)


ЗЫ Вот и всё. Теперь, для того чтобы меню рисовалось правильно, нужно создать менюшки в соответствии со структурой раздела (в корне "right", в подразделах "right_child").
Google вам в помощь ;)

Сообщение добавлено через MovableType API

вверх^ к полной версии понравилось! в evernote
Комментарии (2):
20-08-2008-10:31 удалить
Спасибо. Это все вроде бы понятно. Но как можно сделать допустим такое меню. На главной странице нужно вывести некоторые пункты(не все) меню определенного раздела сайта. То есть уже нужно строить меню не текущего каталога, а определенного... Как тогда быть? Сам я нашел описание класса CMenu, но почему-то не очень получилось у меня разобраться с ней...
frac 20-08-2008-11:31 удалить
Исходное сообщение Аноним Спасибо. Это все вроде бы понятно. Но как можно сделать допустим такое меню. На главной странице нужно вывести некоторые пункты(не все) меню определенного раздела сайта. То есть уже нужно строить меню не текущего каталога, а определенного... Как тогда быть? Сам я нашел описание класса CMenu, но почему-то не очень получилось у меня разобраться с ней...
Спасибо за комментарий! Да, то что вы хотите можно сделать! кстати говоря, в проекте которым я занимаюсь, имелась точно такая-же проблема. вот пример моей реализации top-ового меню: $mm = new CMenu("top"); $mm->Init("/", true); for($i=0;$iarMenu);$i++){ ...... } Обратите внимание на вторую строчку.. она означает что меню инициализируется относительно корня сайта. Т.е. во всех разделах/подразделах сайта будет показыватсья меню, содержание которой описанно лишь только в корне сайта. Надеюсь что помог ;)


Комментарии (2): вверх^

Вы сейчас не можете прокомментировать это сообщение.

Дневник 1c-Bitrix: компонента bitrix:menu - реализация многоуровневого меню. | frac - My notepad ... | Лента друзей frac / Полная версия Добавить в друзья Страницы: раньше»