Блог Горошко Андрея 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

Обновление свойств элемента инфоблока 1с BitrixОбновление свойств элемента инфоблока 1с Bitrix

Средний рейтинг Еще нет оценок SetPropertyValuesEx() — это метод для сохранения значений свойств элемента информационного блока в БД. Этот метод более экономен в количестве запросов к БД, чем SetPropertyValues(), потому

Bitrix\Main\Web\HttpClient: Правильная отправка GET и POST запросов (замена cURL)Bitrix\Main\Web\HttpClient: Правильная отправка GET и POST запросов (замена cURL)

Средний рейтинг Еще нет оценок Многие разработчики по привычке используют стандартные функции PHP curl_* для обращения к внешним сервисам. Однако в Битрикс есть собственная мощная обертка — \Bitrix\Main\Web\HttpClient. Она учитывает настройки прокси сервера

Создание кастомной страницы в админке Битрикс: Полное руководствоСоздание кастомной страницы в админке Битрикс: Полное руководство

Средний рейтинг Еще нет оценок Иногда стандартного функционала админки не хватает. Требуется создать страницу для кастомного отчета, дашборда или инструмента управления. Битрикс позволяет легко интегрировать свои страницы в административный интерфейс,