Получить родительские разделы раздела

164
Алексей,

С помощью старого ядра, методом CIBlockSection::GetNavChain. По сути, там в цикле делаются запросы к БД, с каждым запросом достаётся родительский раздел.

С помощью старого ядра, методом 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 раздела.

Есть вопросы или нашли ошибку? Напишите комментарий (можно без регистрации), отвечать стараюсь быстро.

Опубликовано 14 сентября 2022 | Обновлено 15 сентября 2022
примеры d7, разделы, костыли, инфоблоки
Поделиться
Комментарии
Авторизуйтесь чтобы получать уведомления об ответе
С помощью старого ядра, методом CIBlockSection::GetNavChain. По сути, там в цикле делаются запросы к БД, с каждым запросом достаётся родительский раздел.