Блог Горошко Андрея 1C-Битрикс,Разработка Современная работа с разделами инфоблоков: SectionTable::getList в Bitrix D7 ORM

Современная работа с разделами инфоблоков: SectionTable::getList в Bitrix D7 ORM

Средний рейтинг
Еще нет оценок

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

Мой рейтинг:

Добавить комментарий

Related Post

component_epilog.php Выполнение кода после вывода шаблона компонентаcomponent_epilog.php Выполнение кода после вывода шаблона компонента

Средний рейтинг Еще нет оценок В жизненном цикле компонента Битрикс есть специальный файл — component_epilog.php. Он выполняется после того, как отработал template.php, то есть после того, как основной HTML компонента уже был сгенерирован и

Как создать свой метод REST API в Битрикс на D7 контроллерахКак создать свой метод REST API в Битрикс на D7 контроллерах

Средний рейтинг Еще нет оценок  Стандартный REST API Битрикс24 можно и нужно расширять своими методами. Это позволяет выносить кастомную бизнес-логику в API и взаимодействовать с ней из внешних систем, мобильных

Валидация данных в D7 ORM: Встроенные и кастомные валидаторыВалидация данных в D7 ORM: Встроенные и кастомные валидаторы

Средний рейтинг Еще нет оценок Валидация — это процесс проверки данных на корректность перед их сохранением. D7 ORM предоставляет мощный механизм валидаторов, который описывается прямо в getMap() вашей сущности. Это позволяет держать