Элементы инфоблока через 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 дней гарантии