События связанные с импортом товаров
События в этом блоке работают для сущностей:
- товары
- модификации
- комплекты
- услуги
Все эти сущности импортируются по общим правилам и имеют одинаковые события для модификации импорта.
Общая структура импорта модуля делится на несколько этапов:
Этап 1. Считывание очередной порции товаров.
Здесь модуль считывает порцию товаров. Она зависит от шага импорта, но всегда кратна 100 элементам. Максимум 1000 элементов. Далее модуль разделяет эту порцию на 2 подмассива:
- найденные элементы по внешнему коду
- не найденные элементы, которые нужно создать
Этап 2. Создание новых элементов
Здесь модуль создает новые элементы инфоблока. После создания каждого элемента он создает также элемент торгового каталога.
Этап выполняется, только если в порции есть новые элементы и для сущности не включён режим «только обновление».
События этапа в порядке вызова:
- OnBeforeAddItem — перед созданием каждого нового элемента; позволяет отменить его создание.
- OnImportBundle — для комплектов, после успешного создания товара каталога; позволяет подставить свои компоненты набора.
- OnSetSkuProps — для модификаций, запись характеристик в свойства торгового предложения.
- OnSetPropsForItem — запись свойств элемента, если включён импорт свойств.
- OnAfterImportItems — один раз после создания всей порции.
Этап 3. Обновление существующих элементов
Здесь аналогичные правила как при создании: сначала обновляем элемент инфоблока, а затем уже обновляем поля товара торгового каталога.
По большому счету все события ниже можно заменить стандартными событиями Битрикса, например перед обновлением элемента инфоблока или перед изменением элемента торгового каталога. События модуля в некоторых моментах могут помочь с тем, чтобы видеть поля пришедшие из МС, что позволяет не делать лишних запросов.
Если в настройках обновления сущности не отмечено ни одной опции и сущность — не модификация, модуль пропускает этап целиком: ни одно событие ниже, включая OnAfterUpdateItems, не вызывается.
Ниже опишем события в том порядке, в котором они вызываются:
[OnBeforeGetPropsValues] - вызывается один раз на порцию, до цикла по элементам, если включено обновление свойств (или загрузка картинок в свойство). Позволяет заменить список сопоставления свойств, по которому модуль прочитает текущие значения и затем запишет новые.
Событие перед чтением значений свойств
[OnBeforeUpdateItem] - вызывается перед тем как конкретный элемент будет обновлен, можно использовать для модификации данных, которые передаются в элемент инфоблока. В этом событии можно поменять поля, которые уйдут в метод CIblockElement::Update(). Вызывается только если модуль собрал для элемента хотя бы одно поле на обновление;
Событие перед изменением элемента инфоблока
[OnSetPropsForItem] - вызывается если вы импортируете свойства элементов инфоблока, здесь можно либо модифицировать значения передаваемых свойств, либо добавить свои свойства для записи. Поля в этом методе передаются в метод CIBlockElement::SetPropertyValuesEx();
Событие перед записью свойств товара
[OnBeforeUpdateItemProduct] - вызывается перед тем как изменятся поля товара торгового каталога. Вызывается перед методом \Bitrix\Catalog\Model\Product::update();
[OnBeforeUpdateItemVariant] - аналогично событию выше, но в нем также передаются поля родительского товара, т.к. здесь событие срабатывает при импорте модификаций.
Событие перед изменением товара
[OnImportBundle] - для комплектов вызывается после OnBeforeUpdateItemProduct, на каждом прогоне для каждого комплекта. Позволяет подставить свои компоненты набора.
[OnSetSkuProps] - вызывается для каждой модификации (и при создании, и при обновлении), здесь можно модифицировать значения свойств торговых предложений. При создании событие вызывается, даже если товар каталога для модификации создать не удалось.
Событие перед записью свойств торговых предложений
[OnAfterUpdateItems] - здесь событие можно считать устаревшим, т.к. оно срабатывает после того, как сработали все события выше для каждого из товаров и в этом событии передаются данные массового импорта. Следовательно данные в этом событии можно обрабатывать также массово.
События массовой обработки очередного шага импорта
События OnBeforeUpdateItem, OnBeforeUpdateItemProduct, OnBeforeUpdateItemVariant, OnSetPropsForItem, OnSetSkuProps, OnBeforeGetPropsValues и OnImportBundle устроены одинаково:
- исключение из обработчика модуль не перехватывает — оно обрывает шаг импорта. Оборачивайте свой код в
try/catch; - модуль перебирает ответы всех обработчиков, и параметры последнего
EventResult::SUCCESSцеликом заменяют данные модуля. Ответы не сливаются: каждый обработчик получает исходные данные, а не результат предыдущего; EventResult::ERRORигнорируется — отменить им операцию нельзя (исключение —OnBeforeAddItem);SUCCESSбез параметров превращает данные вnull, который модуль дальше передаёт вcount()и методы Битрикса — на PHP 8 этоTypeError. Всегда возвращайте полный массив, а если менять нечего — не возвращайте ничего.