Импорт характеристик товаров из offers
Актуально для версии 2.9.5
Задача
Если у Вас часть характеристик товаров выгружается в файле offers, например:
<Предложение>
<Ид>cd9289c1-3759-11e2-b000-0015175f17cd#4fdsf5fd-3759-11e2-b000-0015175f17cd</Ид>
<Наименование>Предложение3</Наименование>
<ХарактеристикиТовара>
<ХарактеристикаТовара>
<Наименование>Ширина</Наименование>
<Значение>150</Значение>
</ХарактеристикаТовара>
</ХарактеристикиТовара>
<Цены>
<Цена>
<Представление>300 RUR за шт</Представление>
<ИдТипаЦены>948abd4a-a835-11e3-a14f-406186c19995</ИдТипаЦены>
<ЦенаЗаЕдиницу>300.00</ЦенаЗаЕдиницу>
<Валюта>RUR</Валюта>
<Единица>шт</Единица>
<Коэффициент>1</Коэффициент>
</Цена>
</Цены>
</Предложение>
И ид предложения строится по принципу 'ид_товара'#'ид_предложения', то такие предложения не будут нормально интерпретироваться UMI.CMS. Данные характеристики удобно будет импортировать в виде опционных свойств, для этого необходимо кастомизировать шаблон импорта данных в формате commerceML. Системный шаблон лежит по пути /xsl/import/commerceML2.xsl, редактировать его ни в коем случае нельзя, если Вы не хотите нарушить лицензионный договор. Все кастомизации нужно проводить в файле /xsl/import/custom/commerceML2.xsl, Вы можете прямо копировать целые template'ы и переносить их из системного шаблона в кастомный, в котором уже можно вносить правки.
Ниже приведен пример кастомного шаблона, для его применений скопируйте код шаблона в файл /xsl/import/custom/commerceML2.xsl.
Решение
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:php="http://php.net/xsl"
xmlns:udt="http://umi-cms.ru/2007/UData/templates"
extension-element-prefixes="php"
exclude-result-prefixes="xsl php udt">
<xsl:template match="ПакетПредложений">
<meta>
<source-name>commerceML2</source-name>
</meta>
<types>
<type id="root-guides-type" guid="root-guides-type" title="Справочники" parent-id="0" locked="locked">
<base/>
<fieldgroups/>
</type>
<xsl:apply-templates select="Предложения/Предложение" mode="types"/>
</types>
<objects>
<xsl:apply-templates select="Предложения/Предложение" mode="objects"/>
</objects>
<pages>
<xsl:apply-templates select="Предложения/Предложение" mode="pages"/>
</pages>
<options>
<xsl:apply-templates select="Предложения/Предложение" mode="entities"/>
</options>
</xsl:template>
<xsl:key name="guid_name" match="ПакетПредложений/Предложения/Предложение/ХарактеристикиТовара/ХарактеристикаТовара" use="Наименование"/>
<xsl:template match="Предложения/Предложение" mode="types">
<xsl:for-each select="ХарактеристикиТовара">
<xsl:if test="generate-id(ХарактеристикаТовара) = generate-id(key('guid_name', ХарактеристикаТовара/Наименование))">
<type parent-id="root-guides-type" guide="guide" public="public">
<xsl:attribute name="id">
<xsl:value-of select="concat('Справочник для поля ', ХарактеристикаТовара/Наименование)"/>
</xsl:attribute>
<xsl:attribute name="title">
<xsl:value-of select="concat('Справочник для поля ', ХарактеристикаТовара/Наименование)"/>
</xsl:attribute>
<base/>
<fieldgroups/>
</type>
</xsl:if>
</xsl:for-each>
</xsl:template>
<xsl:template match="Предложения/Предложение" mode="objects">
<xsl:for-each select="ХарактеристикиТовара">
<object id="{php:function('md5', concat(substring-after(../Ид, '#'), ХарактеристикаТовара/Значение))}" name="{ХарактеристикаТовара/Значение}">
<xsl:attribute name="type-id">
<xsl:value-of select="concat('Справочник для поля ', ХарактеристикаТовара/Наименование)"/>
</xsl:attribute>
</object>
</xsl:for-each>
</xsl:template>
<xsl:template match="Предложения/Предложение" mode="pages">
<xsl:choose>
<xsl:when test="contains(Ид, '#')">
<page id="{substring-before(Ид, '#')}">
<properties>
<xsl:apply-templates select="Цены" />
<group name="catalog_stores_props" title="Склады">
<property name="common_quantity" title="Общее количество на складах" type="float" is-public="1" allow-runtime-add="1">
<type data-type="float" />
<title>Общее количество на складах</title>
<value><xsl:value-of select="Количество"/></value>
</property>
</group>
<group name="catalog_option_props" title="Опционные свойства" visible="visible">
<xsl:for-each select="ХарактеристикиТовара">
<property name="{ХарактеристикаТовара/Наименование}" type="optioned" allow-runtime-add="1" visible="visible" >
<type name="Составное" data-type="optioned" multiple="multiple"/>
<title>
<xsl:value-of select="ХарактеристикаТовара/Наименование"/>
</title>
<value/>
</property>
</xsl:for-each>
</group>
</properties>
</page>
</xsl:when>
<xsl:otherwise>
<page id="{Ид}" update-only="1">
<properties>
<xsl:apply-templates select="Цены" />
<group name="catalog_stores_props" title="Склады">
<property name="common_quantity" title="Общее количество на складах" type="float" is-public="1" allow-runtime-add="1">
<type data-type="float" />
<title>Общее количество на складах</title>
<value><xsl:value-of select="Количество"/></value>
</property>
</group>
</properties>
</page>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="Предложения/Предложение" mode="entities">
<xsl:for-each select="ХарактеристикиТовара">
<entity page-id="{substring-before(../Ид, '#')}" field-name='{ХарактеристикаТовара/Наименование}'>
<xsl:apply-templates select="//Предложения/Предложение" mode="options">
<xsl:with-param name="char_name" select="ХарактеристикаТовара/Наименование"/>
</xsl:apply-templates>
</entity>
</xsl:for-each>
</xsl:template>
<xsl:template match="Предложение" mode="options">
<xsl:param name="char_name" />
<xsl:variable name="offer_id" select="substring-after(Ид, '#')"/>
<xsl:for-each select="ХарактеристикиТовара/ХарактеристикаТовара">
<xsl:if test="Наименование = $char_name">
<option int="1" float="0" object-id="{php:function('md5', concat($offer_id, Значение))}"/>
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>