1C-Битрикс. Получить список всех родителей элемента инфоблока на новом API D7
Код:
use Bitrix\Iblock\SectionTable; use Bitrix\Iblock\ElementTable; use Bitrix\Main\Loader; use Bitrix\Main\SystemException; if (!Loader::includeModule('iblock')) { throw new SystemException( 'Ошибка подключения модуля информационных блоков' ); } $elementId = 100; $element = ElementTable::getRow([ 'select' => [ 'IBLOCK_SECTION_ID', ], 'filter' => [ '=ID' => $elementId, ], ]); if ($element !== null) { $parentSections = []; $parentSectionIterator = SectionTable::getList([ 'select' => [ 'SECTION_ID' => 'SECTION_SECTION.ID', 'IBLOCK_SECTION_ID' => 'SECTION_SECTION.IBLOCK_SECTION_ID', ], 'filter' => [ '=ID' => $element['IBLOCK_SECTION_ID'], ], 'runtime' => [ 'SECTION_SECTION' => [ 'data_type' => '\Bitrix\Iblock\SectionTable', 'reference' => [ '=this.IBLOCK_ID' => 'ref.IBLOCK_ID', '>=this.LEFT_MARGIN' => 'ref.LEFT_MARGIN', '<=this.RIGHT_MARGIN' => 'ref.RIGHT_MARGIN', ], 'join_type' => 'inner' ], ], ]); while ($parentSection = $parentSectionIterator->fetch()) { $parentSections[$parentSection['SECTION_ID']] = $parentSection; } echo '<pre>';print_r($parentSections);echo '</pre>'; } else { throw new SystemException( sprintf('Элемент с ID "%d" не найден', $elementId) ); }
Скорее всего ID секции элемента у вас уже есть, но на всякий случай я отталкиваюсь от знания только ID элемента.
7 комментариев
Здравствуйте.
Вы не могли бы переименовать название поста в «1C-Битрикс. Получить список всех родителей элемента инфоблока на API D7»?
Вероятно, не самым продвинутым будет приятно и именно это им и нужно будет. Но остальным людям будет сильно не в кайф натыкаться на это в поиске и переходить с надеждой на релевантность.
Готово!
dev.1c-bitrix.ru/api_help/iblock/classes/ciblockelement/getelementgroups.php
а какой скрытый смысл в этой куче кода? когда в старом апи (котороен никуда не денется) можно в пару строк сделать.
Пример из моей заметки вытаскивает всех родителей от непосредственного родителя до самого корневого.
CIBlockElement::GetElementGroups() не про то.
По бенчмаркам и циферкам GetElementGroups() проигрывает
Если идти дальше, тогда можно короткой функцией обойтись
array_filter
и выполнением за 0,010 сек. Это даже не шутка, Сайт по загрузке с 0,5сек до 0,1 сек "разгоняли".
#667
ну во-первых, задачи бывают разные. Во-вторых никогда не поверю, что загрузка в память 1000 строк с фильтрацией, лучше выборки 2 строк по индексам 1000 строк. Фильтрация прекрасный инструмент, но его цена может быть куда выше чистого кода и переполнения памяти.Скажите пожалуйста, а можно ли этот код внедрить в выборку элементов на d7? Т.е. у элемента есть привязка к разделу, и надо получить самый верхний уровень, причем уровней у элементов разное. Можно так сделать?