Решил проблему определения активных родительских каталогов так:
Рекурсивная функция в result_modifier.php
[CODE]setActiveFlag($arResult['SECTIONS']);
// Функция проставляет параметр ACTIVE_FLAG активному разделу и всем его родителям
function setActiveFlag(&$arSections, $level = 0, $ibsection_id = 0)
{
global $APPLICATION;
if($level == 0){
foreach ($arSections as &$arSection)
{
// Тут внимательно! Определение текущего раздела идет по GetCurDir т.к. в проекте используется ЧПУ
if($APPLICATION->GetCurDir() == $arSection["SECTION_PAGE_URL"])
{
$arSection["ACTIVE_FLAG"] = true;
if($arSection["RELATIVE_DEPTH_LEVEL"] > 1)
{
// рекурсия
setActiveFlag($arSections, $arSection["RELATIVE_DEPTH_LEVEL"], $arSection["IBLOCK_SECTION_ID"]);
}
}
}
}
elseif($ibsection_id > 0) // у коренных разделов IBLOCK_SECTION_ID пустой
{
foreach ($arSections as &$arSection)
{
if($arSection["ID"] == $ibsection_id) // это родитель
{
$arSection["ACTIVE_FLAG"] = true;
if($arSection["RELATIVE_DEPTH_LEVEL"] > 1)
{
// рекурсия
setActiveFlag($arSections, $arSection["RELATIVE_DEPTH_LEVEL"], $arSection["IBLOCK_SECTION_ID"]);
}
}
}
}
}
[/CODE]
В шаблоне компонента catalog.section.list использую условие
[CODE]if ($arSection["ACTIVE_FLAG"]) [/CODE]
Один полукостыль - так как я не указываю ни SECTION_CODE ни SECTION_ID в вызове компонента (потому что мне нужно все дерево каталогов), мне пришлось добавить в вызов компонента параметр с первым попавшимся названием - "SECT" - для того, чтобы правильно работало кеширование (оно зависит от набора параметров).
[CODE] <?$APPLICATION->IncludeComponent(
"bitrix:catalog.section.list", "left",
array(
//"SECTION_ID" => $arResult["VARIABLES"]["SECTION_ID"],
//"SECTION_CODE" => $arResult["VARIABLES"]["SECTION_CODE"],
... другие параметры ...
"SECT" => $arResult["VARIABLES"]["SECTION_CODE"]
)
);?>
[/CODE]
Рекурсивная функция в result_modifier.php
[CODE]setActiveFlag($arResult['SECTIONS']);
// Функция проставляет параметр ACTIVE_FLAG активному разделу и всем его родителям
function setActiveFlag(&$arSections, $level = 0, $ibsection_id = 0)
{
global $APPLICATION;
if($level == 0){
foreach ($arSections as &$arSection)
{
// Тут внимательно! Определение текущего раздела идет по GetCurDir т.к. в проекте используется ЧПУ
if($APPLICATION->GetCurDir() == $arSection["SECTION_PAGE_URL"])
{
$arSection["ACTIVE_FLAG"] = true;
if($arSection["RELATIVE_DEPTH_LEVEL"] > 1)
{
// рекурсия
setActiveFlag($arSections, $arSection["RELATIVE_DEPTH_LEVEL"], $arSection["IBLOCK_SECTION_ID"]);
}
}
}
}
elseif($ibsection_id > 0) // у коренных разделов IBLOCK_SECTION_ID пустой
{
foreach ($arSections as &$arSection)
{
if($arSection["ID"] == $ibsection_id) // это родитель
{
$arSection["ACTIVE_FLAG"] = true;
if($arSection["RELATIVE_DEPTH_LEVEL"] > 1)
{
// рекурсия
setActiveFlag($arSections, $arSection["RELATIVE_DEPTH_LEVEL"], $arSection["IBLOCK_SECTION_ID"]);
}
}
}
}
}
[/CODE]
В шаблоне компонента catalog.section.list использую условие
[CODE]if ($arSection["ACTIVE_FLAG"]) [/CODE]
Один полукостыль - так как я не указываю ни SECTION_CODE ни SECTION_ID в вызове компонента (потому что мне нужно все дерево каталогов), мне пришлось добавить в вызов компонента параметр с первым попавшимся названием - "SECT" - для того, чтобы правильно работало кеширование (оно зависит от набора параметров).
[CODE] <?$APPLICATION->IncludeComponent(
"bitrix:catalog.section.list", "left",
array(
//"SECTION_ID" => $arResult["VARIABLES"]["SECTION_ID"],
//"SECTION_CODE" => $arResult["VARIABLES"]["SECTION_CODE"],
... другие параметры ...
"SECT" => $arResult["VARIABLES"]["SECTION_CODE"]
)
);?>
[/CODE]