Меню из разделов инфоблока с элементами в Битрикс

В битриксе можно создавать меню из разделов инфоблока, для этого к компоненту menu подклчается файл типа *.menu_ext.php, а в нем вызывается компонент menu.sections. Но нет возможности включать в меню элементы разделов, а это иногда бывает полезно. Так, кстати, сделано на этом сайте.

Для этого я сделал компонент menu.sections.elements, подключается он так же в файле *.menu_ext.php, коды я приведу ниже:

.parameters.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),
	),
);

component.php

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;

.left.menu_ext.php (для примера)

<?
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

Загрузка комментариев...