+7 495 008 8452 пн.-пт. 10:00 – 17:00
Загрузка...

Не нашли ответы на свои вопросы в наших публикациях? Задайте вопрос в службу техподдержки!


В версии модуля 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; } } );


Назад в раздел



Часто задаваемые вопросы по модулям экспорта

Видео плейлист по настройке модулей экспорта