Кастомизация импорта из 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.".
"; $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; } ?>