Получение иерархии разделов
24.09.2013
Приведу небольшой примерчик как одним запросом и одним циклом получить иерархию разделов в виде:
Array ( [ROOT] => Array ( [CHILD] => Array ( [12] => Array ( [ID] => 12 [~ID] => 12 [NAME] => Раздел с ид 12 [~NAME] => Раздел с ид 12 [DEPTH_LEVEL] => 1 [~DEPTH_LEVEL] => 1 [CHILD] => Array ( [63] => Array ( [ID] => 63 [~ID] => 63 ............. [CHILD] => Array ( ........ ) ) ....... [63] => Array ( [ID] => 63 [~ID] => 63 ............. ) ....... ) ) .............. ) ) )
На мой взгляд, с такой структурой работать в большинстве случаев удобнее, чем со списком, отсортированном по LEFT_MARGIN
Итак код:
$arFilter = array(
'ACTIVE' => 'Y',
'IBLOCK_ID' => $arParams['IBLOCK_ID'],
'GLOBAL_ACTIVE'=>'Y',
);
$arSelect = array('IBLOCK_ID','ID','NAME','DEPTH_LEVEL','IBLOCK_SECTION_ID');
$arOrder = array('DEPTH_LEVEL'=>'ASC','SORT'=>'ASC');
$rsSections = CIBlockSection::GetList($arOrder, $arFilter, false, $arSelect);
$sectionLinc = array();
$arResult['ROOT'] = array();
$sectionLinc[0] = &$arResult['ROOT'];
while($arSection = $rsSections->GetNext()) {
$sectionLinc[intval($arSection['IBLOCK_SECTION_ID'])]['CHILD'][$arSection['ID']] = $arSection;
$sectionLinc[$arSection['ID']] = &$sectionLinc[intval($arSection['IBLOCK_SECTION_ID'])]['CHILD'][$arSection['ID']];
}
unset($sectionLinc);
Если мы получаем только активные элементы, то важно указать в фильтре 'GLOBAL_ACTIVE'=>'Y', иначе мы можем получить активный элемент с неактивным предком, и его некуда будет определить в иерархию.
В $arSelect нужно не забыть указать IBLOCK_SECTION_ID, иначе иерархию построить не получится
Первое поле в сортировке $arOrder должно быть 'DEPTH_LEVEL'=>'ASC', так как иерархия строится от предков к потомкам
Построение иерархии происходит через массив ссылок $sectionLinc
.
Комментарии:
Михаил
04.04.2014 10:56:23
Очень выручили!
Мистер Игрек
08.05.2014 05:38:22
cryptic
12.05.2014 20:20:14
Максим
13.05.2014 06:16:08
Приведенный выше код полностью рабочий, нужно только чтобы $arParams['IBLOCK_ID'] содержал ID необходимого инфоблока.
Юрий
20.10.2014 13:32:00
ошибка, тут вместо $ar_result похоже надо $arSection
Максим
20.10.2014 13:49:48
Алексей
25.11.2014 16:12:59
Получается что вложенность у Вас ограничена 2-мя уровнями, так как если в массиве ['CHILD'] будут элементы со своими потомками, то ссылка на них должна вести уже на 3-й уровень дерева, но в данном способе она все-рвоно будет вести на второй.
Максим
25.11.2014 18:22:54
Дмитрий
22.06.2015 18:03:24
как вариант сделал так:
Вместо:
$sectionLinc[0] = &$arResult['ROOT'];
Написал так:
$sectionLink[intval($arResult['SECTIONS'][0]['IBLOCK_SECTION_ID'])] = &$arStructured['ROOT'];
Так работает на всех уровнях вложенности, не обязательно от корня. Может кому пригодится
Елена
27.06.2015 21:52:14
Максим
29.06.2015 12:50:54
mbh
05.01.2016 10:51:10
Константин
13.02.2016 14:16:26
Компонент http://marketplace.1c-bitrix.ru/solutions/twozebras.infoblocktree/ в помощь!
eugene
09.06.2016 10:34:06
Максим
09.06.2016 14:40:31
Елена
21.03.2017 09:37:43
Денис
15.09.2017 18:32:58
Юрий
29.12.2018 14:45:42
Денис
20.02.2019 13:55:44
Предположим, нужно вывести все элементы подразделов подразделов главного родителя?
Алёна
18.03.2020 15:22:04
Искренне благодарна автору!
__________________
Кстати, если кому нужен определенный путь из разделов, то в $arFilter нужно добавить все id разделов со вложенностью:
`
$arFilter = array(
'ACTIVE' => 'Y',
'IBLOCK_ID' => $arParams['IBLOCK_ID'],
'GLOBAL_ACTIVE'=>'Y',
'ID' => [ массив id разделов ]
);
`
Михаил
18.04.2020 16:13:44
Отличный код
Только не пойму, если оставить unset($sectionLinc) то ничего не выводится
если без unset($sectionLinc) то данные дублируются
В чем может быть дело?
Ильдар
16.12.2020 12:07:02
Дмитрий
19.02.2021 10:47:04
Благодарю за за решение.
Подскажите, сейчас дерево строится от корня инфоблока, а как сделать чтобы дерево можно было строить от заданной секции?
Денис
21.05.2021 11:01:31
BOSS
20.08.2021 16:41:47
Леонид
14.08.2022 17:49:37
Александр
09.11.2023 17:06:44
https://dev.1c-bitrix.ru/api_help/iblock/classes/ciblocksection/gettreelist.php
вашим способом замечаетесь потом получившийся массив перебирать
Оставить комментарий: