Старое API инфоблоков (CIBlockElement) до сих пор встречается в большинстве проектов, но с выходом Битрикс D7 появился современный способ работы через ORM. Рассказываем как перейти и не сломать сайт.
Подключение D7 инфоблока
Прежде всего убедитесь что модуль подключён:
Bitrix\Main\Loader::includeModule('iblock');
GetList — выборка элементов
Старый способ через CIBlockElement::GetList работает, но D7 даёт типизацию и удобную цепочку фильтров:
use Bitrix\Iblock\Elements\ElementNewsTable; // автогенерируемый класс
$result = ElementNewsTable::getList([
'select' => ['ID', 'NAME', 'PREVIEW_TEXT', 'DATE_ACTIVE_FROM'],
'filter' => [
'ACTIVE' => 'Y',
'IBLOCK_ID' => 10,
'>=DATE_ACTIVE_FROM' => new \Bitrix\Main\Type\DateTime('2024-01-01'),
],
'order' => ['DATE_ACTIVE_FROM' => 'DESC'],
'limit' => 20,
'offset' => 0,
]);
foreach ($result as $item) {
echo $item['NAME'] . PHP_EOL;
}
Важно: класс ElementNewsTable генерируется автоматически по символьному коду инфоблока. Если код инфоблока news, класс будет ElementNewsTable.
Add — добавление элемента
use Bitrix\Iblock\Elements\ElementNewsTable;
$result = ElementNewsTable::add([
'NAME' => 'Новая статья',
'ACTIVE' => 'Y',
'IBLOCK_ID' => 10,
'PREVIEW_TEXT' => 'Краткое описание',
'DETAIL_TEXT' => 'Полный текст статьи
',
'DATE_ACTIVE_FROM' => new \Bitrix\Main\Type\DateTime(),
]);
if ($result->isSuccess()) {
$newId = $result->getId();
echo 'Создан элемент ID: ' . $newId;
} else {
print_r($result->getErrors());
}
Update — обновление элемента
$result = ElementNewsTable::update(123, [
'NAME' => 'Обновлённый заголовок',
'ACTIVE' => 'Y',
]);
if (!$result->isSuccess()) {
print_r($result->getErrors());
}
Delete — удаление элемента
$result = ElementNewsTable::delete(123);
if (!$result->isSuccess()) {
print_r($result->getErrors());
}
Работа со свойствами элементов
Свойства в D7 выбираются отдельно или через WITH:
$result = ElementNewsTable::getList([
'select' => [
'ID',
'NAME',
'PROPERTY_TAGS', // одиночное свойство
'PROPERTY_GALLERY', // множественное
],
'filter' => ['ACTIVE' => 'Y'],
]);
foreach ($result as $item) {
echo $item['PROPERTY_TAGS_VALUE'];
}
Отличия от старого API
| Старое API | D7 |
|---|---|
| CIBlockElement::GetList() | ElementXxxTable::getList() |
| $el->Add() | ElementXxxTable::add() |
| $el->Update() | ElementXxxTable::update() |
| $el->Delete() | ElementXxxTable::delete() |
| Нет типизации | Полная типизация |
| Нет транзакций | Поддержка транзакций |
Когда использовать старое API
Старый CIBlockElement всё ещё нужен для:
- Работы со свойствами типа «Привязка к разделу» и «Файл»
- Получения SEO-свойств элементов
- Сложных выборок с join по нескольким инфоблокам
Итог
D7 API для инфоблоков — это читаемый код с типизацией и нормальной обработкой ошибок. Для новых проектов используйте D7, для legacy — постепенно переводите модуль за модулем.
