Продолжая осваивать 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 Битрикс, выборка разделов, современная разработка.