Создание инфоблока через D7 ORM — важные ограничения
Важно: Согласно официальной документации 1С-Битрикс, «ORM не поддерживает полное создание инфоблока. Он добавляет базовую запись в таблицу b_iblock, но не привязывает инфоблок к сайту, не назначает права, не включает SEO-наследование и не гарантирует видимость в административном разделе».
Поэтому для корректного создания инфоблока с полноценной работой на сайте рекомендуется использовать классический API — метод CIBlock::Add. А D7 ORM применяется уже для последующей работы с элементами, разделами и свойствами.
Создание инфоблока через классическое API (рекомендуемый способ)
// 1. Подключаем модуль инфоблоков
\Bitrix\Main\Loader::includeModule('iblock');
// 2. Создаём инфоблок
$iblock = new \CIBlock;
$result = $iblock->Add([
'IBLOCK_TYPE_ID' => 'mynews', // тип инфоблока (должен существовать)
'NAME' => 'Новости моей компании',
'CODE' => 'mycompany_news',
'API_CODE' => 'News', // обязательно для объектного ORM
'ACTIVE' => 'Y',
'LID' => ['s1'], // привязка к сайту
'SORT' => 500,
'GROUP_ID' => [ // права доступа
2 => \CIBlockRights::PUBLIC_READ, // Все пользователи — чтение
8 => \CIBlockRights::PUBLIC_EDIT, // Администраторы — полный доступ
],
'LIST_PAGE_URL' => '/news/',
'DETAIL_PAGE_URL' => '/news/#ELEMENT_CODE#/',
'SECTION_PAGE_URL' => '/news/#SECTION_CODE#/',
]);
if ($result) {
echo 'Инфоблок создан, ID: ' . $result;
} else {
throw new \Exception($iblock->getLastError()->getMessage());
}
Обязательные параметры:
IBLOCK_TYPE_ID— идентификатор типа инфоблока. Тип должен быть предварительно создан (через админку илиCIBlockType::Add).NAME— название инфоблока.LID— массив идентификаторов сайтов (без привязки инфоблок не отобразится).API_CODE— символьный код для ORM (обязателен, если планируете работать через D7).
Технически — создание через D7 ORM (IblockTable::add)
Класс Bitrix\Iblock\IblockTable наследуется от DataManager и имеет метод add(). Вот как это выглядит:
use Bitrix\Iblock\IblockTable;
use Bitrix\Main\Loader;
Loader::includeModule('iblock');
$result = IblockTable::add([
'IBLOCK_TYPE_ID' => 'mynews',
'NAME' => 'Новости моей компании',
'CODE' => 'mycompany_news',
'API_CODE' => 'News',
'ACTIVE' => 'Y',
'SORT' => 500,
]);
if ($result->isSuccess()) {
$iblockId = $result->getId();
echo 'Инфоблок создан, ID: ' . $iblockId;
} else {
print_r($result->getErrorMessages());
}
Но после этого необходимо вручную:
- Добавить связь с сайтом через
IblockSiteTable::add(). - Назначить права доступа через
IblockGroupTable::add()илиCIBlock::SetPermission(). - Настроить SEO-наследование и другие параметры.
В связи с этим официальная документация прямо рекомендует использовать для создания инфоблока именно классический API — CIBlock::Add.
А что дальше? Работа с элементами через D7 ORM
После того как инфоблок создан (с API_CODE), скомпилируйте ORM-сущность для работы с элементами:
// Компиляция ORM-класса для инфоблока с API_CODE = 'News'
$elementClassName = \Bitrix\Iblock\IblockTable::compileEntity('News');
// Результат: \Bitrix\Iblock\Elements\ElementNewsTable
// Создание нового элемента через объектный ORM
$element = $elementClassName::createObject();
$element->setName('Новый элемент');
$element->setActive(true);
$element->setSort(500);
$element->save();
echo 'Элемент создан, ID: ' . $element->getId();