Много раз сталкивался с ситуацией когда надо вывести меню каталога «на-лету», т.е. при создании разделов инфоблока, чтобы меню сразу же показывалось на фронте сайта на bitrix, существует по крайней мере 2 способа.
Подключить в файл .catalog.menu_ext.php непосредственно разделов инфоблока, либо воспользоваться API Bitrix. Остановлюсь на последнем наиболее правильным примере.
Итак:
В файл .название_меню.menu_ext.php размещаем код
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
<? if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die(); global $APPLICATION; $aMenuLinksExt = array(); if(CModule::IncludeModule('iblock')) { $arFilter = array( "TYPE" => "типинфоблока", "SITE_ID" => SITE_ID, ); $dbIBlock = CIBlock::GetList(array('SORT' => 'ASC', 'ID' => 'ASC'), $arFilter); $dbIBlock = new CIBlockResult($dbIBlock); if ($arIBlock = $dbIBlock->GetNext()) { if(defined("BX_COMP_MANAGED_CACHE")) $GLOBALS["CACHE_MANAGER"]->RegisterTag("iblock_id_".$arIBlock["ID"]); if($arIBlock["ACTIVE"] == "Y") { $aMenuLinksExt = $APPLICATION->IncludeComponent("bitrix:menu.sections", "", array( "IS_SEF" => "Y", "SEF_BASE_URL" => "", "SECTION_PAGE_URL" => $arIBlock['SECTION_PAGE_URL'], "DETAIL_PAGE_URL" => $arIBlock['DETAIL_PAGE_URL'], "IBLOCK_TYPE" => $arIBlock['IBLOCK_TYPE_ID'], "IBLOCK_ID" => $arIBlock['ID'], "DEPTH_LEVEL" => "3", "CACHE_TYPE" => "N", ), false, Array('HIDE_ICONS' => 'Y')); } } if(defined("BX_COMP_MANAGED_CACHE")) $GLOBALS["CACHE_MANAGER"]->RegisterTag("iblock_id_new"); } $aMenuLinks = array_merge($aMenuLinks, $aMenuLinksExt); ?> |
Таким образом у нас получается вывод разделов и подразделов инфоблока
Либо делаем такой код
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
<? if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die(); global $APPLICATION; if(CModule::IncludeModule("iblock")) { $IBLOCK_ID = 2; // указываем из какого инфоблока берем элементы $arOrder = Array("SORT"=>"AES"); // сортируем по свойству SORT по возрастанию $arSelect = Array("ID", "NAME", "IBLOCK_ID", "DETAIL_PAGE_URL"); $arFilter = Array("IBLOCK_ID"=>$IBLOCK_ID, "ACTIVE"=>"Y"); $res = CIBlockElement::GetList($arOrder, $arFilter, false, false, $arSelect); while($ob = $res->GetNextElement()) { $arFields = $ob->GetFields(); // берем поля // echo $arFields['NAME']." - arFields['NAME']<br>"; /* echo '<pre>'; print_r($arFields); // echo '</pre>'; */ // начинаем наполнять массив aMenuLinksExt нужными данными $aMenuLinksExt[] = Array( $arFields['NAME'], $arFields['DETAIL_PAGE_URL'], Array(), Array(), "" ); } // while($ob = $res->GetNextElement()) } // if(CModule::IncludeModule("iblock")) /* echo "<br>Массив <b>aMenuLinksExt</b> - дополнительный"; echo '<pre>'; print_r($aMenuLinksExt); echo '</pre>'; */ $aMenuLinks = array_merge($aMenuLinksExt, $aMenuLinks); // $aMenuLinks = array_merge($aMenuLinks); ?> |
В любом случае и так и так будет работать, но единственное, чтобы работал Bitrix menu sections необходимо установить галочку в настройках компонента меню, что подключать файлы _ext
У меня все
Добрый день! Подскажите, пожалуйста, а почему второй вариант через API вы считаете более предпочтительным? Данная мысль не раскрыта в статье.