Продолжая осваивать D7 ORM, перейдем от элементов к разделам. Для работы с разделами инфоблоков в современном API предназначен класс \Bitrix\Iblock\SectionTable. Он предоставляет тот же мощный и гибкий синтаксис, что и ElementTable, делая код чистым и унифицированным.
Подготовка и базовый синтаксис
Как и в случае с элементами, для начала работы нужно подключить модуль и импортировать класс.
use Bitrix\Main\Loader;
use Bitrix\Iblock\SectionTable;
Loader::includeModule('iblock');Метод getList — наш основной инструмент. Он принимает массив параметров, знакомый нам по работе с ElementTable.
$result = SectionTable::getList([
'select' => [...],
'filter' => [...],
'order' => [...],
'limit' => ...
]);1. Выборка полей (select)
В select перечисляются поля раздела, которые нам нужны. Можно использовать псевдонимы.
Пример: Выбрать ID, название и символьный код всех активных разделов
$result = SectionTable::getList([
'select' => ['ID', 'SECTION_NAME' => 'NAME', 'CODE'],
'filter' => ['=IBLOCK_ID' => 5, '=ACTIVE' => 'Y']
]);
while ($section = $result->fetch()) {
echo "{$section['ID']}: {$section['SECTION_NAME']} ({$section['CODE']})<br>";
}Выборка пользовательских полей (UF*):
D7 ORM позволяет легко выбирать UF-поля. Их имена уже доступны в сущности SectionTable и не требуют JOIN-ов вручную.
$result = SectionTable::getList([
'select' => ['ID', 'NAME', 'UF_CUSTOM_TITLE'], // Просто указываем UF_ поле
'filter' => ['=IBLOCK_ID' => 5]
]);2. Фильтрация (filter)
Фильтр работает так же, как и для элементов, включая все операторы (!, >, <, % и т.д.).
Пример: Найти дочерние разделы для раздела с ID=12
$parentId = 12;
$result = SectionTable::getList([
'select' => ['ID', 'NAME'],
'filter' => [
'=IBLOCK_ID' => 5,
'=IBLOCK_SECTION_ID' => $parentId, // Фильтр по родительскому разделу
'=ACTIVE' => 'Y'
]
]);Сложная фильтрация:
Для логики «ИЛИ» используется ключ LOGIC => OR
// Найти разделы, у которых символьный код 'bags' ИЛИ 'shoes'
$result = SectionTable::getList([
'select' => ['ID', 'NAME'],
'filter' => [
'=IBLOCK_ID' => 5,
'LOGIC' => 'OR',
['=CODE' => 'bags'],
['=CODE' => 'shoes']
]
]);3. Подсчет элементов в разделе
D7 ORM позволяет легко подсчитывать количество элементов, связанных с разделом, с помощью runtime полей и ReferenceField.
use Bitrix\Main\Entity;
$result = SectionTable::getList([
'select' => ['ID', 'NAME', 'ELEMENT_CNT'],
'filter' => ['=IBLOCK_ID' => 5, '=ACTIVE' => 'Y'],
'runtime' => [
new Entity\ReferenceField(
'ELEMENTS',
'\Bitrix\Iblock\ElementTable',
['=this.ID' => 'ref.IBLOCK_SECTION_ID'],
['join_type' => 'LEFT']
),
new Entity\ExpressionField('ELEMENT_CNT', 'COUNT(%s)', 'ELEMENTS.ID')
]
]);
while($row = $result->fetch()){
echo "{$row['NAME']} ({$row['ELEMENT_CNT']})<br>";
}Этот код более сложный, но он демонстрирует всю мощь ORM — возможность строить сложные запросы, не выходя за рамки объектной модели.
CRUD-операции
Методы add, update и delete для SectionTable работают абсолютно идентично ElementTable и HighloadBlockTable.
- SectionTable::add($arFields) — добавляет раздел.
- SectionTable::update($id, $arFields) — обновляет раздел.
- SectionTable::delete($id) — удаляет раздел.
// Пример добавления раздела
$result = SectionTable::add([
'IBLOCK_ID' => 5,
'NAME' => 'Новый раздел D7',
'CODE' => 'new_section_d7',
'ACTIVE' => 'Y'
]);
if ($result->isSuccess()) {
echo "ID нового раздела: " . $result->getId();
} else {
print_r($result->getErrorMessages());
}Вывод:
Использование SectionTable — это современный и предпочтительный способ работы с разделами инфоблоков. Он предлагает более чистый синтаксис, предсказуемое поведение и расширенные возможности по сравнению со старым CIBlockSection. Для всех новых разработок рекомендуется использовать именно D7 ORM.
SectionTable, getList, D7 ORM, разделы Битрикс, Bitrix\Iblock\SectionTable, ORM Битрикс, выборка разделов, современная разработка.
Похожая задача в бизнесе?
Помогу автоматизировать процессы и внедрить ИИ
Меня зовут Андрей Горошко. Я Full-stack разработчик и эксперт по 1С-Битрикс. Настраиваю CRM Битрикс24, разрабатываю защищенные API и создаю умных ИИ-агентов для автоматизации рутины.
или на почту: gorandvas@yandex.ru