Появилась необходимость держать все данные в одном типе инфоблока, в результате используемый ранее компонент немного не подходит.
Нужно добавить фильтр по разделам, чтобы в файле меню указывать в параметрах еще и, скажем так, корневой раздел из подразделов и элементов которого будут формироваться пункты меню.
Параметр в "SECTION_ID" для указания нужно секции я добавил в параметры компонента, но никак не могу понять в каком месте в коде компонента вставить просто условие типа $arSection['IBLOCK_SECTION_ID'] = $arParams['SECTION_ID'].
.parameters.php"
[CODE]<?
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",
),
"SECTION_ID" => array(
"NAME" => GetMessage("SECTION_ID_VARIABLE_PHR"),
),
"DEPTH_LEVEL" => Array(
"PARENT" => "DATA_SOURCE",
"NAME" => GetMessage("CP_BMS_DEPTH_LEVEL"),
"TYPE" => "STRING",
"DEFAULT" => "1",
),
"CACHE_TIME" => Array("DEFAULT"=>36000000),
),
);
?>
[/CODE]
.sub.menu_ext.php"[CODE]<?
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
global $APPLICATION;
$aMenuLinksExt=$APPLICATION->IncludeComponent(
"Nick:menu.sections.elements",
"",
array(
"IBLOCK_TYPE" => "testoviy",
"IBLOCK_ID" => "55",
"SECTION_ID" => "195",
"DEPTH_LEVEL" => "5",
"CACHE_TYPE" => "A",
"CACHE_TIME" => "36000000"
),
false
);
$aMenuLinks = array_merge($aMenuLinksExt, $aMenuLinks);
?>
[/CODE]
Посмотрите пожалуйста код компонента, куда добавить фильтр?
component.php[CODE]<?
if (!function_exists(createMenuArray)){
function cmpSort($a, $b)
{
if ($a['SORT'] == $b['SORT']) {
return 0;
}
return ($a['SORT'] < $b['SORT']) ? -1 : 1;
}
}
if (!function_exists(createMenuArray)){
function createMenuArray(&$res,&$menuItems,$arParent,$depthLevel){
//----
uasort($arParent, 'cmpSort');
//---
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,
'SORT' => $item ['SORT'],
),
);
if ($isParent){
createMenuArray($res,$menuItems,$menuItems[$item['ID']],$depthLevel+1);
}
}
}
}
$i=$arParams['DEPTH_LEVEL'];
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',
'SORT',
));
$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;
}
//чтобы не показывались элементы третьего уровня при глубине 1
if ($arSection['DEPTH_LEVEL'] < $arParams['DEPTH_LEVEL'] ){
$arSectionId[] = $arSection['ID'];
}
//----------
}
//Получим элементы
//чтобы не показывались элементы третьего уровня при глубине 1
if (! $arSectionId) {
$arSectionId = false;
}
//-------------
$i++;
$arSelect = Array('ID', 'NAME','DETAIL_PAGE_URL', 'IBLOCK_SECTION_ID','SORT');
$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'] ){
// если получена секция
if ($arParams['DEPTH_LEVEL'] == 1 and $i < 1 ) :
// чтобы не вводил подразделы в первом пункте меню при глубине 1
$menuItems[$arFields['IBLOCK_SECTION_ID']][] = $arFields;
elseif ($arParams['DEPTH_LEVEL'] > 1 ) :
//echo "$i=".$i."__";
// если глубна больше 1 выводит подразделы
$menuItems[$arFields['IBLOCK_SECTION_ID']][] = $arFields;
endif;
}
else {
// еси получен элемент
// добавялет елементы на одном уровне с разделами инфоблока
$menuItems['ROOT'][] = $arFields;
}
//конец цикла
}
//Рекурсивно сформируем итоговый массив для меню
$arResult = array();
//echo "Рекурсивно сформируем итоговый массив для меню".'<br>';
createMenuArray($arResult,$menuItems,$menuItems['ROOT'],1);
$this->EndResultCache();
}
//'<pre>'; print_r($arResult); '</pre>';
return $arResult;
?>
[/CODE]