Документация для разработчиков
Темная тема

Кастомизация импорта из CommerceML, каталог

Описание

Формат обмена коммерческой информацией CommerceML имеет строго определённую структуру. Поэтому импорт данных из этого формата на сайт производится без дополнительных вопросов и настроек. Между тем при использовании 7-й версии 1с есть потребность несколько изменить логику импорта и/или физический смысл некоторых полей файла CommerceML. В этом случае для изменения логики загрузки данных можно воспользоваться специальным механизмом "мутации" данных.

Примечание. Подробное описание структуры CommerceML

Допускается мутация свойств товаров, параметров и свойств элемента инфоблока, который является товаром, а так же параметров товара как такового. Мутация каждого из элементов осуществляется независимо с помощью специальных функций, которые должны быть реализованы в файле
/bitrix/php_interface/include/1c_mutator.php
(файл необходимо создать, если его ещё нет).

Мутация свойств


function catalog_property_mutator_1c();

Для мутации свойств необходимо создать функцию с таким именем и реализовать в ней логику изменения свойств товаров. Эта функция будет вызвана непосредственно после создания (обновления) всех свойств из файла CommerceML.
В функции можно получить доступ к следующим переменным, которые могут / должны быть использованы и / или изменены:
$IBLOCK_ID - код инфоблока,
$tmpid - код текущего импорта,
$strError - строка для оповещения об ошибке,
$STT_PROP_ERROR - счетчик ошибок при создании свойств,
$STT_PROP_ADD - счетчик успешно созданных свойств,
$STT_PROP_UPDATE - счетчик успешно обновленных свойств,
$arProperties - массив соответствий между внешним и внутренним кодами свойства, ключами в котором являются внешние коды свойств, а значениями - соответствующие внутренние; этот массив должен быть соответствующим образом изменен при изменении набора свойств.

Пример использования

<?
// Создадим функцию, которая будет добавлять или обновлять свойство 
// "Оригинальный номер", которого нет в CommerceML файле
function catalog_property_mutator_1c()
{
	global $IBLOCK_ID, $tmpid, $strError, $STT_PROP_ERROR, $STT_PROP_ADD, $STT_PROP_UPDATE, $arProperties;
	$ibp = new CIBlockProperty;
	$PROP_XML_ID = "ORIGINOMER";
	$PROP_NAME = "Оригинальный номер";
	$PROP_MULTIPLE = "N";
	$PROP_DEF = "";
	$res = CIBlock::GetProperties($IBLOCK_ID, Array(), Array("XML_ID"=>$PROP_XML_ID, "IBLOCK_ID"=>$IBLOCK_ID));
	$bNewRecord_tmp = False;
	if ($res_arr = $res->Fetch())
	{
		$PROP_ID = $res_arr["ID"];
		$res = $ibp->Update($PROP_ID,
			Array(
				"NAME" => $PROP_NAME,
				"MULTIPLE" => $PROP_MULTIPLE,
				"DEFAULT_VALUE" => $PROP_DEF,
				"TMP_ID" => $tmpid
			)
		);
	}
	else
	{
		$bNewRecord_tmp = True;
		$arFields = Array(
			"NAME" => $PROP_NAME,
			"ACTIVE" => "Y",
			"SORT" => "500",
			"DEFAULT_VALUE" => $PROP_DEF,
			"XML_ID" => $PROP_XML_ID,
			"TMP_ID" => $tmpid,
			"MULTIPLE" => $PROP_MULTIPLE,
			"IBLOCK_ID" => $IBLOCK_ID
		);
		$PROP_ID = $ibp->Add($arFields);
		$res = (IntVal($PROP_ID)>0);
	}
	if (!$res)
	{
		$strError .= "Ошибка загрузки свойства [".$PROP_ID."] \"".$PROP_NAME."\" (".$PROP_XML_ID."): ".$ibp->LAST_ERROR.".
"; $STT_PROP_ERROR++; } else { if ($bNewRecord_tmp) $STT_PROP_ADD++; else $STT_PROP_UPDATE++; $arProperties[$PROP_XML_ID] = $PROP_ID; } } ?>

Мутация параметров и свойств товара


array
function  catalog_product_mutator_1c( array &arLoadProduct, object &xProductNode, bool bInsert );

Для мутации параметров и свойств товара необходимо создать функцию с таким именем и реализовать в ней логику изменения параметров товаров. Эта функция будет вызываться для каждого товара непосредственно перед его сохранением.
В функции можно получить доступ к следующим переменным:
$arProperties - массив соответствий между внешним и внутренним кодами свойства, ключами в котором являются внешние коды свойств, а значениями - соответствующие внутренние.

Параметры функции

Параметр Описание
arLoadProduct Массив параметров товара, которые были бы сохранены, если бы не было функции мутации. Типичный массив имеет структуру
Array(
	"MODIFIED_BY" => код текущего пользователя,
	"IBLOCK_SECTION" => массив групп, в которых лежит товар,
	"IBLOCK_ID" => код информационного блока,
	"NAME" => "название товара",
	"XML_ID" => "внешний код товара",
	"TMP_ID" => "код текущего импорта",
	"PROPERTY_VALUES" => массив свойств товара
);
Структура совпадает со структурой массива, который используется для сохранения элемента информационного блока. Для более подробного описания смотрите соответствующую статью из API модуля инфоблоков.
xProductNode Объект класса XMLNode, указывающий на элемент CommerceML файла, который соответствует текущему товару.
bInsert Флаг, который имеет значение True, если это новый товар, и False - в противном случае.

Возвращаемое значение

Функция должна вернуть новый массив параметров для сохранения товара

Пример использования

<?
// Создадим функцию, которая будет обновлять нестандартное свойство
// "Оригинальный номер", значения которого идут как атрибуты элемента
// Товар в CommerceML файле, и делать товар активным
// Кроме того запишем "Оригинальный номер" без пробелов в поле описания
// товара для предварительного просмотра
function catalog_product_mutator_1c(&$arLoadProduct, &$xProductNode, $bInsert)
{
	global $arProperties;
	$sOriginomer = $xProductNode->GetAttribute("ОригинальныйНомер");
	$sOriginomer1 = preg_replace("/\s/i", "", $sOriginomer);
	$arLoadProduct["PREVIEW_TEXT"] = $sOriginomer1;
	$arLoadProduct["PROPERTY_VALUES"][$arProperties["ORIGINOMER"]][] = $sOriginomer;
	return $arLoadProduct;
}
?>

Мутация параметров товара как такового


Пример функции

array function catalog_offer_mutator_1c(   
	array &arLoadOffer, 
	object &xOfferNode 
);

Для мутации параметров товара как такового необходимо создать функцию с таким именем и реализовать в ней логику изменения параметров товара. Эта функция будет вызываться для каждого товара непосредственно перед сохранением параметров.

Параметры функции

Параметр Описание
arLoadOffer Массив параметров товара как такового, которые были бы сохранены, если бы не было функции мутации. Типичный массив имеет структуру
array(
   "ID" => код товара, которому принадлежит предложение,
   "QUANTITY" => количество товара на складе
)
Структура совпадает со структурой массива, который используется для сохранения параметров товара в каталоге. Для более подробного описания смотрите соответствующую статью из API модуля Торгового каталога.
xOfferNode Объект класса XMLNode, указывающий на элемент CommerceML файла, который соответствует текущему предложению.

Возвращаемое значение

Функция должна вернуть новый массив параметров для сохранения свойств товара как такового

Пример использования

<?
// Установим флаг "Уменьшать количество товаров при заказе"
function catalog_offer_mutator_1c(&$arLoadOffer, &$xOfferNode)
{
	$arLoadOffer["QUANTITY_TRACE"] = "Y";
	return $arLoadOffer;
}
?>


© «Битрикс», 2001-2024, «1С-Битрикс», 2024