Кастомизация импорта из CommerceML, каталог
Описание
Формат обмена коммерческой информацией CommerceML имеет строго определённую структуру. Поэтому импорт данных из этого формата на сайт производится без дополнительных вопросов и настроек. Между тем при использовании 7-й версии 1с есть потребность несколько изменить логику импорта и/или физический смысл некоторых полей файла 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.".<br>";
$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;
}
?>