Не нашли ответы на свои вопросы в наших публикациях? Задайте вопрос в службу техподдержки!
В версии модуля 1.50.1 появилась возможность определить событие
OnBeforeProcessRowInSaveIBData
, которое вызывается после чтения одного товара (элемента) из файла импорта и попытке найти соответствующий этой записи элемент в инфоблоке. Тем самым можно оперировать "сырыми" данными перед их обработкой различными опциями и модификаторами полей
В приведенном ниже примере событие для профиля импорта 5 убирает из сырого массива первую картинку (так нужно, т.к. в готовом решении свойство MORE_PHOTO добавляется к детальной картинке, нам нужно записать в MORE_PHOTO все последующие изображения, кроме первого изображения из детальной, чтобы не было дубля в публичной части готового решения).
А если изображение одно - нам нужно убрать его из MORE_PHOTO, т.к. оно есть в детальной картинке. В этой же версии модуля это можно делать специальный ключ, который подхватывает модуль:
del = Y
.
// init.php use Bitrix\Main\EventManager; use Bitrix\Main\Application; $eventManager = EventManager::getInstance(); $request = Application::getInstance()->getContext()->getRequest(); $eventManager->addEventHandler('acrit.import', 'OnBeforeProcessRowInSaveIBData', /** * @param \Acrit\Import\Import $profile * @param array $arInputRow RAW-data from input file * @param array|null $arIBItem finded element if exist */ static function (\Acrit\Import\Import $profile, &$arInputRow, $arIBItem) { if ($profile->getArProfile()['ID'] == 5 && (int)$arIBItem['DETAIL_PICTURE'] > 0) { // Detail picture has first image already if (is_array($arInputRow['yml_catalog_shop_offers_offer_picture_1'])) { $arInputRow['yml_catalog_shop_offers_offer_picture_1'] = array_slice($arInputRow['yml_catalog_shop_offers_offer_picture_1'], 1); } elseif (!empty($arInputRow['yml_catalog_shop_offers_offer_picture_1'])) { // delete exist copy of detail picture in MORE_PHOTO property $arInputRow['yml_catalog_shop_offers_offer_picture_1'] = [ [ 'VALUE' => $arInputRow['yml_catalog_shop_offers_offer_picture_1'], 'del' => 'Y' ] ]; } } } );
С версии модуля
1.53.2
появились еще два события:
OnStartProcessRowInSaveIBData($profile, &$arInputRow)
- вызывается после чтения элемента из файла и до обработки модулем
OnBeforeFindExistsItemInSaveIBData($profile, &$arInputRow, &$arFilter)
- вызывается перед попыткой найти существующий элемент в базе данных. Можно модифицировать массив фильтра поиска существующего элемента $arFilter
, например, помимо артикула добавить еще поиск по свойству-поставщику.
Итоговый порядок выполнения событий:
OnStartProcessRowInSaveIBData ->
OnBeforeFindExistsItemInSaveIBData ->
OnBeforeProcessRowInSaveIBData
Дополнительные примеры
:
/** * Проверка, чтобы для профиля с ID=1 обновлялись товары, совпадающие по артикулу и если у найденного (по артикулу) товара
* еще установлено свойство "Поставщик" (VENDOR_ID) с ID - 345. * Для профиля с id=2, должны обновляться товары, которые нашлись по артикулу, свойство "Поставщик" (VENDOR_ID) с ID = 339. */ Bitrix\Main\EventManager::getInstance()->addEventHandler('acrit.import', 'OnBeforeFindExistsItemInSaveIBData', /** * @param \Acrit\Import\Import $profile * @param array $arInputRow RAW-data from input file * @param array $arFilter filter to find exists item */ static function (\Acrit\Import\Import $profile, &$arInputRow, &$arFilter) { if ($profile->getArProfile()['ID'] == 1) { $arFilter['=PROPERTY_VENDOR_ID'] = 345; } if ($profile->getArProfile()['ID'] == 2) { $arFilter['=PROPERTY_VENDOR_ID'] = 339; } } );
Назад в раздел