Получить родительские разделы раздела
С помощью старого ядра, методом CIBlockSection::GetNavChain. По сути там в цикле делаются запросы к БД, с каждым запросом достаётся родительский раздел.
Пример использования:
$arSections = []; $dbSections = CIBlockSection::GetNavChain($iblockId, $sectionId, ['ID']); while($arSection = $dbSections->GetNext()) { $arSections[] = $arSection; } var_dump($arSections); // Массив родительских разделов (начиная с 1го уровня), включая сам раздел.
Где $sectionId - ID раздела для которого выбираются "родители".
Можно написать подобное на D7, будет чуть-чуть быстрее работать (~0.1мс на каждый запрос).
$arSections = []; while($sectionId) { if ($arSection = \Bitrix\Iblock\SectionTable::getList([ 'filter' => ['IBLOCK_ID' => $iblockId, 'ID' => $sectionId], 'select' => ['ID', 'IBLOCK_SECTION_ID'] ])->fetch()) { $arSections[] = $arSection; } $sectionId = $arSection['IBLOCK_SECTION_ID']; } $arSections = array_reverse($arSections); var_dump($arSections);
Первые три запроса - старое ядро, после них запросы нового ядра. Как видно последние чуть быстрее.
Еще одно преимущество запроса на D7 - можно получить "родителей" для массива разделов, для этого нужно немного поменять код. В случае с CIBlockSection::GetNavChain(), этот метод принимает только 1 ID раздела.
Есть вопросы или нашли ошибку? Напишите комментарий (можно без регистрации), отвечать стараюсь быстро.