Yandex Metrika
sanches.free 7 просмотров

Элементы инфоблока в Битрикс D7: ORM, свойства и выборки

Зачем переходить на ORM элементов

В D7 для инфоблоков появился полноценный ORM-слой: типизированные выборки, объекты вместо «сырых» массивов и предсказуемые имена полей. Это удобнее, чем бесконечные CIBlockElement::GetList с префиксами PROPERTY_*, особенно в сервисах и модулях.

Ниже — практический минимум на вымышленном инфоблоке «Статьи блога» (символьный код API: Articles). Подключите модуль iblock перед примерами.

Подготовка инфоблока

В настройках инфоблока задайте символьный код API — латиница, до 50 символов, с буквы. По нему генерируется класс Element{ApiCode}Table.

use Bitrix\Main\Loader;

Loader::includeModule('iblock');

$dataClass = \Bitrix\Iblock\Iblock::wakeUp($iblockId)->getEntityDataClass();
// \Bitrix\Iblock\Elements\ElementArticlesTable

Один элемент и список

Класс для нашего примера — ElementArticlesTable. Получение одной записи по ID:

use Bitrix\Iblock\Elements\ElementArticlesTable;

$row = ElementArticlesTable::getByPrimary($postId, [
    'select' => [
        'ID',
        'NAME',
        'DETAIL_TEXT',
        'VENDOR_CODE_' => 'VENDOR_CODE',
    ],
])->fetch();

$sku = $row['VENDOR_CODE_VALUE'] ?? '';

В select свойства пишутся без префикса PROPERTY_. Алиас с подчёркиванием (VENDOR_CODE_) даёт короткие ключи в массиве.

Выборка списка — тот же синтаксис, что у ORM в других модулях:

$query = ElementArticlesTable::getList([
    'select' => ['ID', 'NAME', 'ACTIVE_FROM'],
    'filter' => ['=ACTIVE' => 'Y'],
    'order'  => ['ACTIVE_FROM' => 'DESC'],
    'limit'  => 20,
]);

while ($post = $query->fetch()) {
    // ...
}

Объекты вместо массивов

fetchObject() и fetchCollection() возвращают объекты с геттерами в CamelCase: getName(), getDetailPicture() и т.д. Универсальный доступ — $post->get('NAME').

Разделы

Основной раздел — поле IBLOCK_SECTION. Все привязки — через SECTIONS и getSections()->getAll().

Свойства разных типов

Строка. Свойство VENDOR_CODE (внутренний артикул материала):

$code = $post->getVendorCode()->getValue();
$note = $post->getVendorCode()->getDescription();

Множественное. Свойство AUTHORS — список авторов, обход через getAll():

foreach ($post->getAuthors()->getAll() as $author) {
    echo $author->getValue();
}

Файлы. Галерея SLIDES — в select добавляют суффикс .FILE, путь к файлу берут из объекта файла:

$posts = ElementArticlesTable::getList([
    'select' => ['ID', 'SLIDES.FILE'],
    'filter' => ['ID' => $postId],
])->fetchCollection();

foreach ($posts as $post) {
    foreach ($post->getSlides()->getAll() as $slide) {
        $url = '/upload/'
            . $slide->getFile()->getSubdir() . '/'
            . $slide->getFile()->getFileName();
    }
}

Список. Метка BADGE (новинка, хит) — расшифровка через BADGE.ITEM и методы getItem()->getXmlId(), getValue().

Привязка к элементам. Блок «Читайте также» — свойство SIMILAR, суффикс .ELEMENT в select, в цикле getElement()->getId() и getName().

Кеширование

Стабильную выборку можно кешировать параметром cache в getList() (TTL в секундах). После импорта данных сбросьте кеш сущности: ElementArticlesTable::getEntity()->cleanCache().

Когда оставить CIBlockElement

  • Разовые правки в админке и миграции «на коленке».
  • Компоненты ядра без ORM-обвязки.
  • Нестандартные runtime-поля в фильтре — иногда проще старый API.

В новом коде модулей ORM элементов обычно выигрывает: меньше путаницы с кодами свойств и проще рефакторинг.

Итог

Задайте символьный код API, получите класс через Iblock::wakeUp(), используйте getList / fetchObject и суффиксы .FILE, .ITEM, .ELEMENT для «тяжёлых» типов свойств. Короткие фрагменты держите в абзацах с <code>, крупные примеры — в отдельных блоках pre.

Не хотите копаться сами?

Починю за 1-3 дня. Без предоплаты — оплата по результату.

15+ лет опыта с 1С-Битрикс · Без предоплаты · 7 дней гарантии