Статус партнерства с 1С-Битрикс: Бизнес партнер
  • Маркетплейс
  • Документация
  • Блог
  • Новости
  • Софт
  • Профиль
  • Динамическое меню Битрикс

    21.03.2017

    Одной из возможностей динамического добавления  пунктов меню в Битрикс является использование файлов с именем ".<тип+меню>.menu_ext.php".

    Чаще всего в этом файле используется компонент bitrix:menu.section, возвращающий массив разделов заданного инфоблока. Однако встречаются задачи требующие добавить в это меню элементы или разделы из одного из инфоблоков или иного источника информации.

    Покажу один из подходов на примере следующей задачи: Построить двухуровневое меню из разделов информационного блока с ID 2 (ИБ2), а для раздела "Информация" с символьным кодом 'info' добавить, в качестве подпунктов, все активные элементы инфоблока с ID 3 (ИБ3).

    Первым этапом получаем два уровня пунктов из ИБ2.

    $aMenuLinksExt=$APPLICATION->IncludeComponent("bitrix:menu.sections", "", array(
    	"IS_SEF" => "Y",
    	"SEF_BASE_URL" => "/",
    	"SECTION_PAGE_URL" => "#SECTION_CODE#/",
    	"DETAIL_PAGE_URL" => "#SECTION_CODE#/#ELEMENT_CODE/#",
    	"IBLOCK_TYPE" => "content",
    	"IBLOCK_ID" => 3,
    	"DEPTH_LEVEL" => "2",
    	"CACHE_TYPE" => "A",
    	"CACHE_TIME" => "3600000"
    	),
    	false
    );
    $aMenuLinksPre = array_merge($aMenuLinksExt, $aMenuLinks);

    Далее в цикле ищем необходимые пункты и производим вставку (пример создания массива пунктов будет приведен ниже)

    $aMenuLinks = []; // в этом массиве выстраивается новое меню
    foreach($aMenuLinksPre as $arItem) {
    	// ищем по необходимым признакам родительский пункт
    	if ($arItem[1] == '/info/') {
    		// здесь должен идти код получения массива подпунктов $arSubItems
    		if (count($arSubItems) > 0) {
    			// если подпункты найдены указываем, что родительский пункт имеет подпункты
    			$arItem[3]['IS_PARENT'] = 1;
    			// добавляем родительский пункт в новую структуру
    			$aMenuLinks[] = $arItem;
    			// добавляем подпункты
    			$aMenuLinks = array_merge($aMenuLinks, $arSubItems);
    		} else {
    			$aMenuLinks[] = $arItem;
    		}
    	} else {
    		$aMenuLinks[] = $arItem;
    	}
    }

    В данном примере подпункты этого раздела полученные из ИБ2 будут идти после пунктов полученных из иных источников. Если необходимо иное, то логику необходимо внедрить после добавления родительского пункта в новую структуру.

    Получение данных происходит стандартным образом, главное правильно заполнить структуру массива отдельного пункта:

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

    Пример кода

    $arSubItems = [];
    $itItems = CIBlockElement::GetList(
    	['SORT' => 'ASC'],
    	['IBLOCK_ID' => 3, 'ACTIVE' => 'Y'],
    	false,
    	false,
    	['NAME','DETAIL_PAGE_URL']
    );
    while($arSub = $itItems->GetNext()) {
    	$arSubItems[] = [
    		$arSub['NAME'],
    		$arSub['DETAIL_PAGE_URL'],
    		[$arSub['DETAIL_PAGE_URL']],
    		[
    			'FROM_IBLOCK' => 3,
    			'IS_PARENT' => false,
    			'DEPTH_LEVEL' => 2
    		]
    	];
    }

    Процедуру перестроения меню, вместе с получением дополнительных данных необходимо оснастить кэшированием для обеспечения максимального быстродействия

    Все записи

    © 2001-2024 Воробьев Александр