Событие перед созданием элемента
[OnBeforeAddItem] Событие перед созданием элемента инфоблока
Событие OnBeforeAddItem вызывается на этапе создания новых элементов — один раз для каждого нового элемента порции, которого ещё нет в каталоге. Работает для товаров, модификаций, комплектов и услуг: и при плановом импорте, и при обработке веб-хуков, которые создают элементы.
Этап создания выполняется, только если в порции есть новые элементы и для сущности не включён режим «только обновление».
Событие срабатывает до всех проверок модуля: до пропуска архивных товаров и до поиска родителя модификации. Поэтому оно приходит и для тех элементов, которые модуль затем всё равно пропустит.
Обработчик может отменить создание элемента, вернув EventResult::ERROR. Достаточно ERROR от любого из обработчиков.
Исключение из обработчика модуль не ловит: оно обрывает шаг импорта. Оборачивайте свой код в try/catch.
- Описание события
- Пример вызова события
- Примеры использования
Параметры события
| Параметр | Тип | Описание |
|---|---|---|
xmlId | string | Идентификатор элемента: externalCode МойСклад, а в режиме идентификации по идентификатору МойСклад — id сущности. Для модификаций — без префикса родителя |
item | object | Строка МойСклад — объект товара, модификации, комплекта или услуги |
Структура item
$item->name // 'Название товара'
$item->externalCode // 'abc123externalcode'
$item->id // UUID сущности в МойСклад
$item->archived // false
$item->meta->type // 'product' | 'variant' | 'bundle' | 'service'
$item->meta->href // 'https://api.moysklad.ru/api/remap/1.2/entity/product/...'
$item->attributes // доп. поля
$item->productFolder // группа товаров (meta->href)
$item->product // для variant — ссылка на родительский товар (meta->href)
item — это объектОбъект передаётся по ссылке на тот же экземпляр, с которым дальше работает модуль. Изменение его свойств в обработчике (например, $item->name) повлияет на создаваемый элемент — и на то, что придёт в items события OnAfterImportItems.
Возвращаемое значение
Возвращать ничего не обязательно.
Чтобы отменить создание элемента:
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::ERROR);
Что происходит при отмене:
- элемент не создаётся, модуль переходит к следующему;
- счётчик пропущенных
#SKIP#увеличивается, а в лог импорта пишется строка «Элемент не создан: создание отменено обработчиком события OnBeforeAddItem. [xmlId] Название» (с версии 3.9.0; на более ранних версиях элемент пропускался молча); - в событии
OnAfterImportItemsэлемент остаётся вitems, но вcreatedIdsего нет.
Параметры, переданные в EventResult::SUCCESS, модуль не читает.
//Пример кода нужно вставить в файл init.php
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
'rbs.moyskladstocks',
'OnBeforeAddItem',
'OnBeforeAddItemHandler'
);
function OnBeforeAddItemHandler(\Bitrix\Main\Event $event)
{
$eventParams = $event->getParameters();
$xmlId = $eventParams['xmlId']; // внешний код (или id МС) создаваемого элемента
$item = $eventParams['item']; // объект МойСклад
#WORK_AREA#
}
Не создавать товары без артикула
function OnBeforeAddItemHandler(\Bitrix\Main\Event $event)
{
$item = $event->getParameter('item');
if (in_array($item->meta->type, ['product', 'bundle'], true) && empty($item->article)) {
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::ERROR);
}
}
Нормализовать название перед созданием
function OnBeforeAddItemHandler(\Bitrix\Main\Event $event)
{
$item = $event->getParameter('item');
// Объект общий с модулем: новое название уйдёт в NAME элемента инфоблока
$item->name = trim(preg_replace('/\s+/u', ' ', (string)$item->name));
}