Задача: собрать полные данные об элементах инфоблока, применяя ORM/D7, который пришел на смену устаревшему CIBlockElement::GetList.
Метод CIBlockElement::GetList в позволяет получить практически все данные об элементе: стандартные поля, свойства, цены и другие сведения.
Однако его заменила ORM-методология, где ElementTable::getList не предоставляет готового доступа ко всем данным. Для сбора полной информации, данные нужно подгружать по частям, включая использование классов Bitrix\Iblock\PropertyTable, Bitrix\Iblock\PropertyEnumerationTable и других.
Но, есть способ получить всю нужную информацию, подключив только класс Bitrix\Iblock\Iblock и используя инфоблок как сущность, то есть, фактически превращая его в виртуальный класс.
Видео пример использования ORM D7 в инфоблоках показал в одной из серий видеокурса:
Свой компонент: список объявлений пользователя
Включение ORM в инфоблоках
Для работы с ORM достаточно задать API-идентификатор в настройках инфоблока:
Пример кода c использованием ORM инфоблока:
use Bitrix\Iblock\Iblock,
Bitrix\Catalog\PriceTable;
$IBLOCK_ID = 1;
// Инициализация класса инфоблока
$iblockClass = Iblock::wakeUp($IBLOCK_ID)->getEntityDataClass();
$getElements = $iblockClass::getList([
'select' => [
// Получаем все поля элемента
'*',
// Дополучаем шаблон URL из инфоблока
'URL' => 'IBLOCK.DETAIL_PAGE_URL',
// Дополучаем свойство типа строка
'PREFS_' => 'ATT_PREFS',
// Дополучаем свойство типа файл
'PHOTOS_' => 'MORE_PHOTO.FILE',
// Дополучаем свойство типа список
'PROCESSOR_' => 'ATT_PROCESSOR.ITEM',
// Дополучаем свойство типа привязка к элементам
'RELATED_' => 'ATT_RELATED.ELEMENT',
// Дополучаем свойство типа привязка к разделам
'BRANDS_' => 'ATT_RELATED.SECTION',
],
])->fetchAll();
foreach ($getElements as $resElement) {
// Из шаблона ссылки получаем реальный url элемента
$resElement['URL'] = CIBlock::ReplaceDetailUrl(
$resElement["URL"],
$resElement,
true,
'E'
);
// По ID детальной картинки получаем путь к ней
$resElement['DETAIL_PICTURE_SRC'] = CFile::GetPath(
$resElement['DETAIL_PICTURE']
);
// Дополучаем цены элемента
$resElement['PRICES'] = PriceTable::getList([
'filter' => [
'=PRODUCT_ID' => $resElement['ID']
],
'select' => [
'*'
]
])->fetch();
// Распечатываем полученную информацию
var_dump($resElement);
}
Метод Iblock::wakeUp получает ORM-класс инфоблока, задав его ID, после чего доступен метод getList.
В запросе getList можно использовать алиасы для свойств, чтобы ключи в массиве были удобнее для использования и не выглядели громоздкими.
В цикле перебора каждого элемента дополняем информацию: получаем URL элемента, путь к детальной картинке и данные о ценах.
Метод ::getList сгенерированного ORM класса инфоблока, как и в обычных классах D7 принимает параметры:
$res = \Запрос\К нужному классу::getList([
'order' => // массив- сортировка
'select' => // массив- выбираемые поля
'filter' => // массив- фильтр
'group' => // массив- группировка, order должен быть пустой
'limit' => // число- ограничение выбираемого кол-ва
'offset' => // число- смещение первого столбца в результате
'count_total' => // число- дает возможность получить кол-во элементов через метод getCount()
'runtime' => // массив полей сущности, создающихся динамически
'data_doubling' => // булево (ум. false) - получение одинаковых записей
'cache' => array( // массив- кеширование запроса запроса
'ttl' => 1000,
'cache_joins' => true
),
]);
Почему стоит использовать ORM вместо старого метода CIBlockElement::GetList
Использование ORM для работы с инфоблоками, вместо старого метода CIBlockElement::GetList, имеет ряд значительных преимуществ.
Во-первых, ORM обеспечивает структурированный и читаемый код, что особенно важно в крупных проектах с большим объемом данных и сложной логикой. ORM позволяет работать с объектами и свойствами инфоблока, как с сущностями базы данных, что упрощает манипуляции с данными и делает код более поддерживаемым.
Во-вторых, ORM интегрируется с современными механизмами кеширования и оптимизации запросов, благодаря чему уменьшается нагрузка на базу данных и ускоряется выполнение скриптов. Это делает ORM особенно ценным инструментом для масштабируемых и производительных приложений, требующих гибкости и скорости.