В битриксе можно создавать меню из разделов инфоблока, для этого к компоненту menu подклчается файл типа *.menu_ext.php, а в нем вызывается компонент menu.sections. Но нет возможности включать в меню элементы разделов, а это иногда бывает полезно. Так, кстати, сделано на этом сайте.
Для этого я сделал компонент menu.sections.elements, подключается он так же в файле *.menu_ext.php, коды я приведу ниже:
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();
if(!CModule::IncludeModule("iblock"))
return;
$arTypesEx = CIBlockParameters::GetIBlockTypes(Array("all"=>" "));
$arIBlocks=Array();
$db_iblock = CIBlock::GetList(Array("SORT"=>"ASC"), Array("SITE_ID"=>$_REQUEST["site"], "TYPE" => ($arCurrentValues["IBLOCK_TYPE"]!="all"?$arCurrentValues["IBLOCK_TYPE"]:"")));
while($arRes = $db_iblock->Fetch())
$arIBlocks[$arRes["ID"]] = $arRes["NAME"];
$arComponentParameters = array(
"GROUPS" => array(
),
"PARAMETERS" => array(
"IBLOCK_TYPE" => Array(
"PARENT" => "BASE",
"NAME"=>GetMessage("CP_BMS_IBLOCK_TYPE"),
"TYPE"=>"LIST",
"VALUES"=>$arTypesEx,
"DEFAULT"=>"catalog",
"ADDITIONAL_VALUES"=>"N",
"REFRESH" => "Y",
),
"IBLOCK_ID" => Array(
"PARENT" => "BASE",
"NAME"=>GetMessage("CP_BMS_IBLOCK_ID"),
"TYPE"=>"LIST",
"VALUES"=>$arIBlocks,
"DEFAULT"=>'1',
"MULTIPLE"=>"N",
"ADDITIONAL_VALUES"=>"N",
"REFRESH" => "Y",
),
"DEPTH_LEVEL" => Array(
"PARENT" => "DATA_SOURCE",
"NAME" => GetMessage("CP_BMS_DEPTH_LEVEL"),
"TYPE" => "STRING",
"DEFAULT" => "1",
),
"CACHE_TIME" => Array("DEFAULT"=>36000000),
),
);
if (!function_exists(createMenuArray)){
function createMenuArray(&$res,&$menuItems,$arParent,$depthLevel){
foreach($arParent as $item){
$isParent = ($item['IS_SECTION']&&isset($menuItems[$item['ID']]));
$res[] = array(
htmlspecialchars($item['~NAME']),
$item['LINK'],
array(), //массив доп ссылок
array(
'FROM_IBLOCK' => true,
'IS_PARENT' => $isParent,
'DEPTH_LEVEL' => $depthLevel,
),
);
if ($isParent){
createMenuArray($res,$menuItems,$menuItems[$item['ID']],$depthLevel+1);
}
}
}
}
if(!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED!==true) die();
if(!isset($arParams['CACHE_TIME']))
$arParams['CACHE_TIME'] = 36000000;
$arParams['IBLOCK_ID'] = intval($arParams['IBLOCK_ID']);
$arParams['DEPTH_LEVEL'] = intval($arParams['DEPTH_LEVEL']);
if($arParams['DEPTH_LEVEL']<=0)
$arParams['DEPTH_LEVEL']=1;
if($this->StartResultCache()) {
CModule::IncludeModule('iblock');
$arSectionId = array();
$arFilter = array(
'IBLOCK_ID'=>$arParams['IBLOCK_ID'],
'GLOBAL_ACTIVE'=>'Y',
'ACTIVE'=>'Y',
'<=DEPTH_LEVEL' => $arParams['DEPTH_LEVEL'],
);
$arOrder = array(
'SORT'=>'ASC',
);
$rsSections = CIBlockSection::GetList($arOrder, $arFilter, false, array(
'ID',
'DEPTH_LEVEL',
'NAME',
'SECTION_PAGE_URL',
'IBLOCK_SECTION_ID',
));
$menuItems = array();
while($arSection = $rsSections->GetNext()){
$arSection['IS_SECTION'] = 1;
$arSection['LINK'] = $arSection['SECTION_PAGE_URL'];
if ($arSection['IBLOCK_SECTION_ID']){
$menuItems[$arSection['IBLOCK_SECTION_ID']][] = $arSection;
} else {
$menuItems['ROOT'][] = $arSection;
}
$arSectionId[] = $arSection['ID'];
}
//Получим элементы
$arSelect = Array('ID', 'NAME','DETAIL_PAGE_URL', 'IBLOCK_SECTION_ID');
$arFilter = Array(
'IBLOCK_ID' => $arParams['IBLOCK_ID'],
'ACTIVE' => 'Y',
array(
'LOGIC' => 'OR',
array('SECTION_ID' => $arSectionId),
array('SECTION_ID' => false),
),
);
$arOrder = Array('SORT' => 'ASC');
$res = CIBlockElement::GetList($arOrder, $arFilter, false, false, $arSelect);
while ($ob = $res->GetNextElement()){
$arFields = $ob->GetFields();
$arFields['IS_SECTION'] = 0;
$arFields['LINK'] = $arFields['DETAIL_PAGE_URL'];
if ($arFields['IBLOCK_SECTION_ID']){
$menuItems[$arFields['IBLOCK_SECTION_ID']][] = $arFields;
} else {
$menuItems['ROOT'][] = $arFields;
}
}
//Рекурсивно сформируем итоговый массив для меню
$arResult = array();
createMenuArray($arResult,$menuItems,$menuItems['ROOT'],1);
$this->EndResultCache();
}
return $arResult;
<?
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
global $APPLICATION;
$aMenuLinksExt=$APPLICATION->IncludeComponent(
"myMenu:menu.sections.elements",
"",
array(
"IBLOCK_TYPE" => "content",
"IBLOCK_ID" => "1",
"DEPTH_LEVEL" => "5",
"CACHE_TYPE" => "A",
"CACHE_TIME" => "36000000"
),
false
);
$aMenuLinks = array_merge($aMenuLinksExt, $aMenuLinks);
?>
Не забываем размещать свои компоненты в своем пространстве имен, в примере это myMenu