Событие перед изменением элемента инфоблока
[OnBeforeUpdateItem] Событие перед изменением элемента инфоблока
Событие OnBeforeUpdateItem вызывается перед обновлением конкретного элемента инфоблока через CIblockElement::Update(). Позволяет модифицировать данные, которые будут записаны в элемент.
- Описание события
- Пример кода
Параметры события
| Параметр | Тип | Описание |
|---|---|---|
entity | string | Сущность в МойСклад: product, variant, bundle, service |
currentItem | array | Данные о текущем элементе (содержит BX и MS) |
arUpdateItemFields | array | Массив данных для передачи в CIblockElement::Update() |
Структура currentItem
[
'BX' => [ // элемент инфоблока Битрикс
'ID' => 1234,
'IBLOCK_ID' => 5,
'NAME' => 'Название товара',
'XML_ID' => 'abc123externalcode',
'ACTIVE' => 'Y',
'CODE' => 'nazvanie-tovara',
'SORT' => 500,
'PREVIEW_TEXT' => 'Краткое описание',
'DETAIL_TEXT' => 'Подробное описание',
'PREVIEW_PICTURE' => 100,
'DETAIL_PICTURE' => 101,
'IBLOCK_SECTION_ID' => 10,
// ... другие поля элемента инфоблока
],
'MS' => $itemMs // объект из МойСклад, доступ к полям через свойства
]
Структура ms-объекта (currentItem['MS'])
$item = $currentItem['MS'];
$item->name // 'Название товара'
$item->externalCode // 'abc123externalcode'
$item->archived // false
$item->description // 'Описание товара'
$item->weight // 0.5
$item->article // 'ART-001'
$item->variantsCount // 3 (для product)
$item->attributes // массив доп. атрибутов МС
$item->images // массив изображений
$item->productFolder // объект с meta->href группы товаров
Структура arUpdateItemFields
Содержит только те поля, которые реально изменились:
[
'NAME' => 'Новое название', // если изменилось имя
'ACTIVE' => 'N', // если товар стал архивным
'IBLOCK_SECTION_ID' => 15, // если изменилась группа
'PREVIEW_TEXT' => 'Новое описание', // если изменилось описание
'DETAIL_TEXT' => 'Новое полное описание', // если изменилось полное описание
'CODE' => 'novoe-nazvanie', // если включена транслитерация
'SORT' => 100, // если настроена сортировка
'PREVIEW_PICTURE' => [...], // массив для CFile
'DETAIL_PICTURE' => [...], // массив для CFile
'MODIFIED_BY' => 1, // ID пользователя
]
Возвращаемое значение
Верните EventResult::SUCCESS с модифицированным массивом $arUpdateItemFields. Этот массив будет передан в CIblockElement::Update().
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $arUpdateItemFields);
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
'rbs.moyskladstocks',
'OnBeforeUpdateItem',
'OnBeforeUpdateItemHandler'
);
function OnBeforeUpdateItemHandler(\Bitrix\Main\Event $event)
{
$eventParams = $event->getParameters();
$entity = $eventParams['entity']; //сущность в МойСклад, которая обрабатывается (четыре варианта значения: product / variant / bundle / service)
$currentItem = $eventParams['currentItem']; //данные о текущем элементе, подробнее ниже
$itemBx = $currentItem['BX']; //текущий элемент инфоблока, доступ к полям через массив
$item = $currentItem['MS']; //этот же товар из МС, доступ к полям через поля объекта
// Структура currentItem:
// [
// 'BX' => [ // элемент инфоблока Битрикс
// 'ID' => 1234,
// 'IBLOCK_ID' => 5,
// 'NAME' => 'Название товара',
// 'XML_ID' => 'abc123externalcode',
// // ... другие поля элемента инфоблока
// ],
// 'MS' => $itemMs // объект из МойСклад
// ]
//это массив данных, которые затем передаются в CIblockElement::Update();
$arUpdateItemFields = $eventParams['arUpdateItemFields'];
//можно модифицировать массив '$arUpdateItemFields' и затем его вернуть в качестве успеха события
//например сделаем элемент не активным
//$arUpdateItemFields['ACTIVE'] = 'N';
//Отправляем \Bitrix\Main\EventResult::SUCCESS для записи изменений в элемент инфоблока
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $arUpdateItemFields);
}