Импорт характеристик из offers дополнительный шаблон — различия между версиями

Материал из Umicms
Перейти к:навигация, поиск
(Новая страница: «'''Актуально для версии 2.9.6''' == Проблема == Если Вы хотите использовать шаблон из статьи [[Им…»)
 
Строка 34: Строка 34:
 
</ХарактеристикиТовара>
 
</ХарактеристикиТовара>
 
</source>
 
</source>
 +
 +
То имеющийся шаблон не подойдет, его нужно переделывать, пример ниже.
  
 
== Шаблон ==
 
== Шаблон ==
  
 +
<source lang="xml">
 +
<?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="page_id" select="substring-before(../../Ид, '#')"/>
 +
<xsl:with-param name="char_name" select="Наименование"/>
 +
</xsl:apply-templates>
 +
</entity>
 +
</xsl:for-each>
 +
</xsl:template>
 +
 +
<xsl:template match="Предложение" mode="options">
 +
<xsl:param name="page_id" />
 +
<xsl:param name="char_name" />
 +
<xsl:variable name="offer_id" select="substring-after(Ид, '#')"/>
 +
<xsl:variable name="product_id" select="substring-before(Ид, '#')"/>
 +
<xsl:for-each select="ХарактеристикиТовара/ХарактеристикаТовара">
 +
<xsl:if test="Наименование = $char_name and $page_id = $product_id">
 +
<option int="1" float="0" object-id="{php:function('md5', concat($offer_id, Значение, Наименование))}"/>
 +
</xsl:if>
 +
</xsl:for-each>
 +
</xsl:template>
 +
 +
</xsl:stylesheet>
 +
</source>
 
  [[category:Интеграция с 1С]]
 
  [[category:Интеграция с 1С]]

Версия 13:51, 4 апреля 2014

Актуально для версии 2.9.6

Проблема

Если Вы хотите использовать шаблон из статьи Импорт_характеристик_товаров_из_offers, но структура характеристик в offers у Вас имеет вид:

<ХарактеристикиТовара>
	<ХарактеристикаТовара>
		<Наименование>Ширина</Наименование>
		<Значение>150</Значение>
	</ХарактеристикаТовара>
	<ХарактеристикаТовара>
		<Наименование>Длина</Наименование>
		<Значение>300</Значение>
	</ХарактеристикаТовара>
</ХарактеристикиТовара>

а не как было рассмотрено:

<ХарактеристикиТовара>
	<ХарактеристикаТовара>
		<Наименование>Ширина</Наименование>
		<Значение>150</Значение>
	</ХарактеристикаТовара>
</ХарактеристикиТовара>
<ХарактеристикиТовара>
	<ХарактеристикаТовара>
		<Наименование>Длина</Наименование>
		<Значение>300</Значение>
	</ХарактеристикаТовара>
</ХарактеристикиТовара>

То имеющийся шаблон не подойдет, его нужно переделывать, пример ниже.

Шаблон

<?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="page_id" select="substring-before(../../Ид, '#')"/>
					<xsl:with-param name="char_name" select="Наименование"/>
				</xsl:apply-templates>
			</entity>
		</xsl:for-each>
	</xsl:template>
 
	<xsl:template match="Предложение" mode="options">
		<xsl:param name="page_id" />
		<xsl:param name="char_name" />
		<xsl:variable name="offer_id" select="substring-after(Ид, '#')"/>	
		<xsl:variable name="product_id" select="substring-before(Ид, '#')"/>	
		<xsl:for-each select="ХарактеристикиТовара/ХарактеристикаТовара">
			<xsl:if test="Наименование = $char_name and $page_id = $product_id">
				<option int="1" float="0" object-id="{php:function('md5', concat($offer_id, Значение, Наименование))}"/>
			</xsl:if>
		</xsl:for-each>
	</xsl:template>
 
</xsl:stylesheet>