-Рубрики

 -Поиск по дневнику

Поиск сообщений в frac

 -Подписка по e-mail

 

 -Интересы

 -Сообщества

Читатель сообществ (Всего в списке: 1) linux

 -Статистика

Статистика LiveInternet.ru: показано количество хитов и посетителей
Создан: 23.08.2007
Записей: 98
Комментариев: 28
Написано: 47


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

Понедельник, 04 Августа 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


Аноним   обратиться по имени Среда, 20 Августа 2008 г. 10:31 (ссылка)
Спасибо. Это все вроде бы понятно. Но как можно сделать допустим такое меню. На главной странице нужно вывести некоторые пункты(не все) меню определенного раздела сайта. То есть уже нужно строить меню не текущего каталога, а определенного... Как тогда быть? Сам я нашел описание класса CMenu, но почему-то не очень получилось у меня разобраться с ней...
Ответить С цитатой В цитатник    |    Не показывать комментарий
frac   обратиться по имени Среда, 20 Августа 2008 г. 11:31 (ссылка)
Исходное сообщение Аноним
Спасибо. Это все вроде бы понятно. Но как можно сделать допустим такое меню. На главной странице нужно вывести некоторые пункты(не все) меню определенного раздела сайта. То есть уже нужно строить меню не текущего каталога, а определенного... Как тогда быть? Сам я нашел описание класса CMenu, но почему-то не очень получилось у меня разобраться с ней...

Спасибо за комментарий!
Да, то что вы хотите можно сделать! кстати говоря, в проекте которым я занимаюсь, имелась точно такая-же проблема. вот пример моей реализации top-ового меню:
$mm = new CMenu("top");
$mm->Init("/", true);
for($i=0;$iarMenu);$i++){
......
}
Обратите внимание на вторую строчку.. она означает что меню инициализируется относительно корня сайта. Т.е. во всех разделах/подразделах сайта будет показыватсья меню, содержание которой описанно лишь только в корне сайта. Надеюсь что помог ;)
Ответить С цитатой В цитатник
 

Добавить комментарий:
Текст комментария: смайлики

Проверка орфографии: (найти ошибки)

Прикрепить картинку:

 Переводить URL в ссылку
 Подписаться на комментарии
 Подписать картинку