Не нашли ответы на свои вопросы в наших публикациях? Задайте вопрос в службу техподдержки!
В версии модуля 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; } } );
Назад в раздел
