74  /  418

Построение и показ меню

В общем случае задача формирования меню включает:

  • выделение HTML элементов для построения меню;
  • создание шаблона меню (создание шаблона компонента Меню);
  • включение функции показа меню (вызов компонента Меню) в общем шаблоне ("прологе" и "эпилоге");
  • заполнение меню в соответствии со структурой сайта.

Структура меню

Любое меню на сайте строится на основе двух составляющих:

  • массива данных $aMenuLinks, определяющего состав меню, задает названия и ссылки для всех пунктов меню. Управление массивом данных осуществляется через административный интерфейс;
  • шаблона внешнего представления меню. Шаблон меню – это PHP код, определяющий внешний вид меню (шаблон компонента Меню). Шаблон меню обрабатывает массив данных, выдавая на выходе HTML-код.

Массив данных меню

Данные для каждого типа меню хранятся в отдельном файле, имя которого имеет следующий формат: .<тип меню>.menu.php. Например, для хранения данных меню типа left будет использоваться файл .left.menu.php, а для хранения данных меню типа top - файл .top.menu.php.

Меню является иерархически наследуемым. Файлы меню размещаются в папках тех разделов сайта, где требуется показ соответствующих типов меню. Если для данного раздела не создан соответствующий файл меню, система производит поиск файла в каталоге уровнем выше.

Например, т.к. основное меню (в демо-версии продукта, это меню типа top) должно выводиться во всех разделах, то файл данного меню помещается только в корневой каталог сайта.

Соответственно меню второго уровня (в демо-версии продукта, это меню left) выводится отдельно для каждого раздела сайта. Поэтому в папке каждого раздела создается свой файл для данного типа меню.

Ещё пример: посетитель находится в разделе /ru/company/about/. Для показа меню типа left файл меню будет искаться в следующей последовательности:

  1. /ru/company/about/.left.menu.php
  2. /ru/company/.left.menu.php
  3. /ru/.left.menu.php
  4. /.left.menu.php

Если в одном из каталогов будет найдено меню, то поиск останавливается и в последующих каталогах уже не ищется.

Система Bitrix Framework позволяет также создавать меню динамического типа. Т.е. массив данных таких меню генерируется автоматически на основании некоторых данных, получаемых с помощью программного кода. Данный код должен храниться в папке соответствующего раздела сайта в файле с именем .<тип меню>.menu_ext.php.

Основная задача подобных файлов - это манипуляция массивом $aMenuLinks. Данные файлы не редактируются визуально в модуле Управление структурой, поэтому они не смогут быть случайно отредактированы при визуальном редактировании меню. При создании этого файла используйте компонент Пункты меню (bitrix:menu.sections).

Примечание: В абзаце выше речь идёт только о дополнении созданного меню названиями разделов инфоблоков. Например, для дополнения меню названиями форумов этот вариант не годится.
Внимание! Если в качестве пунктов меню используются разделы каталога без ЧПУ, необходимо указывать переменные в значимых переменных запроса.

Примером такого меню может служить левое меню раздела Каталог книг, представленное в демо-версии продукта. Здесь первые два пункта меню Авторы и Рецензии созданы обычным способом, а остальные (Бизнес-литература, Детская литература и т.д.) формируются динамически.

Динамическое меню

В данном случае в качестве пунктов меню используются названия групп каталога Книги, созданного на основе информационных блоков. Программный код, на основе которого генерируется меню, хранится в файле .left.menu_ext.php в папке /e-store/books/.


В файлах .<тип меню>.menu.php могут использоваться следующие стандартные переменные:

  • $sMenuTemplate - абсолютный путь к шаблону меню (данная переменная используется крайне редко);
  • $aMenuLinks - массив, каждый элемент которого описывает очередной пункт меню.

    Структура данного массива:

    Array
    (
        [0] => пункт меню 1
            Array
                (
                    [0] => заголовок пункта меню
                    [1] => ссылка на пункте меню
                    [2] => массив дополнительных ссылок для подсветки пункта меню:
                        Array
                            (
                                [0] => ссылка 1
                                [1] => ссылка 2
                                ...
                             )
                    [3] => массив дополнительных переменных передаваемых в шаблон меню:
                        Array
                            (
                                [имя переменной 1] => значение переменной 1
                                [имя переменной 2] => значение переменной 2
                                ...
                             )
                    [4] => условие, при котором пункт меню появляется 
                           это PHP выражение, которое должно вернуть "true"
                )
        [1] => пункт меню 2
        [2] => пункт меню 3
        ...
    )

Примеры файлов меню

<?
// пример файла .left.menu.php

$aMenuLinks = Array(
  Array(
    "Каталог курсов", 
    "index.php",
    Array(), 
    Array(), 
    "" 
  ),

  Array(
    "Мои курсы",
    "mycourses.php",
    Array(), 
    Array(), 
    "\$GLOBALS['USER']->IsAuthorized()" 
  ),
  
  Array(
    "Журнал обучения",
    "gradebook.php",
    Array(), 
    Array(), 
    "\$GLOBALS['USER']->IsAuthorized()"  
  ),

  Array(
    "Анкета специалиста",
    "profile.php",
    Array(), 
    Array(), 
    "\$GLOBALS['USER']->IsAuthorized()"  
  ),
);
?>
<?
// пример файла .left.menu_ext.php

if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();

global $APPLICATION;

$aMenuLinksExt = $APPLICATION->IncludeComponent(
	"bitrix:menu.sections",
	"",
	Array(
		"ID" => $_REQUEST["ELEMENT_ID"], 
		"IBLOCK_TYPE" => "books", 
		"IBLOCK_ID" => "30", 
		"SECTION_URL" => "/e-store/books/index.php?SECTION_ID=#ID#", 
		"CACHE_TIME" => "3600" 
	)
);

$aMenuLinks = array_merge($aMenuLinks, $aMenuLinksExt);
?>

Организация показа меню

Показ меню на страницах сайта выполняется с помощью компонента Меню (bitrix:menu). Например, вызов верхнего меню на демо-сайте имеет следующий вид:

<?$APPLICATION->IncludeComponent(
"bitrix:menu",
"horizontal_multilevel",
Array(
"ROOT_MENU_TYPE" => "top",
"MAX_LEVEL" => "3",
"CHILD_MENU_TYPE" => "left",
"USE_EXT" => "Y"
)
);?>

Данный код помещается в предусмотренные для вывода меню области шаблона сайта.


Построение меню сайта

Построение меню для показа происходит следующим образом:

  • в общий шаблон показа включается вызов вывода меню на экран;
  • при загрузке компонент проверяет наличие в текущем разделе сайта файла, содержащего массив значений для меню;
  • затем компонент вызывает шаблон построения для данного типа меню и выводит HTML меню на экран.
22

Если вы нашли неточность в тексте, непонятное объяснение, пожалуйста, сообщите нам об этом в комментариях.
Развернуть комментарии