понедельник, 4 августа 2008 г.

1c-Bitrix: компонента bitrix:menu - реализация многоуровневого меню.

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

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

Комментариев нет: