Данный материал, по большей части, является сборкой из всего что мне удалось найти по этой теме + свои наработки. Данная проблема - уже давно не проблема, но судя по кол-ву вопросов на всяких форумах, еще достаточно жива. Приступим.
Для реализации многоуровневого меню необходимо всего-навсего:
обьявить необходимые менюшки (Настройка - Настройка модулей - Управление структурой);
выбрать(из имеющихся)/реализовать подходящий шаблон для меню;
правильно инициализировать компоненту 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 вам в помощь ;)