Yandex Metrika
sanches.free 1 просмотр

Элементы инфоблока через ORM в D7: API-код, объекты и свойства

Символьный код API — обязательное звено

ORM для элементов инфоблока «видит» структуру только после того, как в настройках инфоблока заполнено поле символьный код API (латиница, с буквы). По нему генерируется класс вида \Bitrix\Iblock\Elements\Element{ApiCode}Table. Без кода придётся опираться на универсальные обёртки, а не на типизированную сущность.

Перед любым вызовом подключите модуль: \Bitrix\Main\Loader::includeModule('iblock');

Два способа получить класс данных

Если код известен заранее, удобно ссылаться на конкретный Element…Table. Если в рантайме есть только числовой IBLOCK_ID, «просыпают» описание инфоблока и берут фабрику строки:

use Bitrix\Main\Loader;

Loader::includeModule('iblock');

$iblockKey = 12;
$rowGateway = \Bitrix\Iblock\Iblock::wakeUp($iblockKey)->getEntityDataClass();

// Прямой класс для инфоблока с API-кодом, например NewsWire:
// \Bitrix\Iblock\Elements\ElementNewsWireTable::getList([...]);

Один объект и коллекция

getByPrimary() читает запись по ключу; fetchObject() возвращает объект с геттерами. В select свойства указывают по внутреннему коду без префикса PROPERTY_; для привязки к другим элементам добавляют суффикс .ELEMENT.

Список — обычный getList() с фильтром и сортировкой; fetchCollection() даёт итерируемую коллекцию объектов.

use Bitrix\Iblock\Elements\ElementNewsWireTable;

$entryPk = 8402;

$node = ElementNewsWireTable::getByPrimary($entryPk, [
    'select' => [
        'ID',
        'NAME',
        'IBLOCK_ID',
        'TAGLINE',
        'RELATED_POST.ELEMENT',
    ],
])->fetchObject();

$lot = ElementNewsWireTable::getList([
    'select' => ['ID', 'NAME', 'TAGLINE', 'RELATED_POST.ELEMENT'],
    'filter' => [
        '=ACTIVE' => 'Y',
        '=IBLOCK_ID' => 12,
    ],
    'order' => ['SORT' => 'ASC', 'ID' => 'DESC'],
    'limit' => 50,
])->fetchCollection();

foreach ($lot as $node) {
    // $node->getName(), $node->getTagline() ...
}

Поля объекта, разделы и цепочка кодов

У объекта вызывают getId(), getIblockId(), getName(), getPreviewPicture(), getDetailPicture() — но только если соответствующие поля были в select (или доступны как базовые столбцы сущности). Текущий раздел: $node->getIblockSection(); символьный код — getCode(), родитель — getParentSection().

Чтобы собрать «путь» из символьных кодов от листа к корню, поднимаются по цепочке родителей в цикле.

Строка, одно значение: $node->getTagline()->getValue(). Множественная строка: обход foreach ($node->getTagline()->getAll() as $chunk) { $chunk->getValue(); }. Привязка к элементу (одна): $node->getRelatedPost()->getElement()->getName(). Множественная привязка: в цикле по getAll() для каждого значения вызывают getElement().

$branch = $node->getIblockSection();
$segments = [];
while ($branch) {
    array_unshift($segments, $branch->getCode());
    $branch = $branch->getParentSection();
}
$canonicalTrail = implode('/', $segments);

Счётчик без выборки строк

Если нужен только размер выборки, не стоит вытаскивать все ID в PHP: объявите поле-COUNT(*) в runtime и прочитайте одно число.

use Bitrix\Main\ORM\Fields\ExpressionField;
use Bitrix\Iblock\Elements\ElementNewsWireTable;

$metrics = ElementNewsWireTable::getList([
    'runtime' => [
        new ExpressionField('TALLY', 'COUNT(*)'),
    ],
    'select' => ['TALLY'],
    'filter' => [
        '=ACTIVE' => 'Y',
        'AUTHOR.VALUE' => 12,
    ],
])->fetch();

$total = (int)($metrics['TALLY'] ?? 0);

Когда остаётся CIBlockElement

ORM закрывает большинство задач чтения и аккуратных выборок. Старый API ещё уместен для редких сценариев с тяжёлыми кастомными фильтрами в компонентах «как есть» или для унаследованного кода без рефакторинга — но новые модули лучше строить на Element…Table и явных select.

Итог

Задайте API-код инфоблока, используйте Iblock::wakeUp или конкретный Element…Table, различайте fetch/fetchObject/fetchCollection, для свойств помните про getAll() и суффиксы .ELEMENT, а для голого количества — ExpressionField с агрегатом.

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

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

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