GetElementGroups возвращает список всех разделов, к которым
привязан элемент инфоблока, включая случаи множественной привязки —
когда один товар относится сразу к нескольким категориям. Разберём
метод и типичный сценарий его использования.
Базовый вызов
<?php
$sections = CIBlockElement::GetElementGroups($elementId, true);
foreach ($sections as $section) {
echo $section['ID'] . ' — ' . $section['NAME'] . PHP_EOL;
}
Второй параметр, true, указывает получать только
активные разделы. При false в результат попадут
и деактивированные — это редко нужно на публичной части, но может
пригодиться при административных задачах вроде аудита структуры.
Основной раздел среди нескольких
Если элемент привязан к нескольким разделам, один из них считается
основным — именно он обычно используется для построения хлебных
крошек и канонического адреса страницы. Определить его можно
по полю IBLOCK_SECTION_ID самого элемента:
<?php
$element = CIBlockElement::GetByID($elementId)->GetNext();
$mainSectionId = $element['IBLOCK_SECTION_ID'];
$allSections = CIBlockElement::GetElementGroups($elementId, true);
Разница между IBLOCK_SECTION_ID и полным списком
из GetElementGroups — источник частой путаницы:
первое поле хранит один основной раздел, второе — все разделы,
включая дополнительные привязки.
Нужна помощь с Битрикс?
Практическое применение: перекрёстные категории
Типичный сценарий — товар относится и к основной категории, и к разделу «Акции» или «Новинки». Вывод в этих разделах формируется через дополнительную привязку, а не дублированием элемента:
<?php
$sections = CIBlockElement::GetElementGroups($elementId, true);
$isInPromo = false;
foreach ($sections as $section) {
if ($section['CODE'] === 'akcii') {
$isInPromo = true;
break;
}
}
Ограничение: работает только при включённой множественной привязке
Множественная привязка элементов к разделам должна быть явно включена
в настройках инфоблока. Без этого у элемента всегда есть только
один раздел — основной, и метод GetElementGroups вернёт
массив из единственного значения, совпадающего с
IBLOCK_SECTION_ID.
Производительность
Вызов метода для каждого элемента в списке — отдельный запрос
к базе. На странице со списком из десятков товаров это быстро
превращается в проблему N+1 запросов. Если разделы нужны сразу
для всей выборки, эффективнее получить их одним запросом через
CIBlockElement::GetList с указанием
IBLOCK_SECTION_ID в выборке полей, либо через связь ORM,
если код написан на D7.
Фильтрация выборки по одному из перекрёстных разделов
Отдельная от GetElementGroups задача — не получить
разделы конкретного элемента, а наоборот, отобрать все элементы,
привязанные к определённому разделу через множественную привязку,
включая те, для кого этот раздел не основной. Для такой выборки
используется фильтр GetList по служебному полю
SECTION_ID вместо IBLOCK_SECTION_ID:
<?php
$result = CIBlockElement::GetList(
[],
[
'IBLOCK_ID' => $iblockId,
'SECTION_ID' => $promoSectionId,
'INCLUDE_SUBSECTIONS' => 'Y',
],
false, false, ['ID', 'NAME']
);
SECTION_ID в фильтре учитывает все привязки элемента,
включая дополнительные, тогда как обычный фильтр по
IBLOCK_SECTION_ID отбирает только по основному разделу —
разница между этими двумя полями в фильтре повторяет ту же логику,
что и разница между самим значением поля элемента и результатом
GetElementGroups.
Хранение привязки в базе данных
Технически множественная привязка элемента к разделам хранится
в отдельной служебной таблице b_iblock_section_element —
именно её и опрашивает GetElementGroups под капотом.
Основной раздел, хранящийся в поле IBLOCK_SECTION_ID
самого элемента, для консистентности данных также должен иметь
соответствующую запись в этой таблице — расхождение между ними
обычно говорит о повреждении данных, возникшем при прямом изменении
структуры в обход API.
Частые ошибки
- Вызов метода в цикле по элементам списка. Создаёт лишний запрос на каждый элемент вместо одной общей выборки.
-
Путаница между основным разделом и полным списком.
IBLOCK_SECTION_ID— одно значение,GetElementGroups— массив всех привязок. - Ожидание нескольких разделов при выключенной множественной привязке. Настройка должна быть включена в свойствах инфоблока заранее.
Ртог
GetElementGroups возвращает полный список разделов
элемента при включённой множественной привязке — полезно для
перекрёстных категорий вроде акций и новинок. Для отдельного элемента
на детальной странице метод удобен, но для списков стоит избегать
вызова в цикле и получать данные о разделах одним общим запросом.
