Выгрузка нескольких изображений для шаблона Demomarket

Материал из Umicms
Перейти к:навигация, поиск

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

Задача

Выгрузить несколько изображений из 1С на сайт с шаблоном Demomarket так, что-бы они сразу отображались на сайте.

Решение

Основная задача которую надо решить это реализация кастомного шаблона преобразования информации об изображениях из файла с форматом CommerceML 2.0 в данные формата umiDump 2.0.

Фрагмент данных файла выгрузки из 1С содержащий информацию об изображениях:

<Картинка>import_files/15/15db4a947d4f11e9499ffa163e9c8758_1ba9b1727d4f11e9499ffa163e9c8758.png</Картинка>
<Картинка>import_files/15/15db4a947d4f11e9499ffa163e9c8758_2390e7a27d4f11e9499ffa163e9c8758.jpg</Картинка>
<Картинка>import_files/15/15db4a947d4f11e9499ffa163e9c8758_9ff1425a7d5511e9499ffa163e9c8758.jpg</Картинка>

Фрагмент данных файла umiDump 2.0 который должен получиться после применения шаблона преобразования:

<property name="photo" type="img_file">
	<title>Картинка</title>
	<value><![CDATA[./images/cms/data/import_files/15/15db4a947d4f11e9499ffa163e9c8758_1ba9b1727d4f11e9499ffa163e9c8758.png]]></value>
</property>
<property name="photos" type="multiple_image">
	<title>Дополнительные фотографии товара</title>
	<value path="./images/cms/data/import_files/15/15db4a947d4f11e9499ffa163e9c8758_2390e7a27d4f11e9499ffa163e9c8758.jpg"/>
	<value path="./images/cms/data/import_files/15/15db4a947d4f11e9499ffa163e9c8758_9ff1425a7d5511e9499ffa163e9c8758.jpg"/>
</property>

Ознакомится со стандартным шаблоном преобразования данных из 1С можно в файле /xsl/import/commerceML2.xsl

Для реализации задачи необходимо переопределить шаблон Товары/Товар и добавить один дополнительный шаблон Товар/Картинка[position() &gt; 1].

Переопределять и добавлять кастомные шаблоны преобразования можно в файле /xsl/import/custom/commerceML2.xsl.

После внесения изменений шаблон Товары/Товар будет выглядеть следующим образом (все внесенные изменения отмечены комментариями):

	<xsl:template match="Товары/Товар">
		<xsl:param name="group_id" select="string(Группы/Ид)" />

		<xsl:param name="name">
			<xsl:choose>
				<xsl:when test="string-length(ПолноеНаименование)">
					<xsl:value-of select="ПолноеНаименование" />
				</xsl:when>
				<xsl:otherwise>
					<xsl:value-of select="Наименование" />
				</xsl:otherwise>
			</xsl:choose>
		</xsl:param>

		<page id="{Ид}" parentId="{$group_id}" type-id="{$group_id}">
			<xsl:choose>
				<xsl:when test="Статус = 'Удален'">
					<xsl:attribute name="is-deleted">1</xsl:attribute>
				</xsl:when>
				<xsl:when test="$isCatalogItemsRestoreOnImport = 1">
					<xsl:attribute name="is-deleted">0</xsl:attribute>
				</xsl:when>
			</xsl:choose>

			<xsl:if test="not(Группы/Ид)">
				<xsl:attribute name="parentId"><xsl:value-of select="$catalog-id" /></xsl:attribute>
				<xsl:attribute name="type-id">root-catalog-object-type</xsl:attribute>
			</xsl:if>

			<default-active>
				<xsl:value-of select="$catalog_item_activity" />
			</default-active>

			<default-visible>
				<xsl:value-of select="$catalog_item_visible" />
			</default-visible>

			<basetype module="catalog" method="object">Объекты каталога</basetype>

			<name><xsl:value-of select="$name" /></name>

			<xsl:if test="string-length($catalog_item_template)">
				<default-template>
					<xsl:value-of select="$catalog_item_template" />
				</default-template>
			</xsl:if>			
			<properties>
				<xsl:call-template name="common-group">
					<xsl:with-param name="name" select="$name" />
				</xsl:call-template>

				<group name="product">
					<title>1C: Общие свойства</title>

					<xsl:if test="string-length(Описание)">
						<property name="description" title="Описание" type="wysiwyg" allow-runtime-add="1">
							<type data-type="wysiwyg" />
							<title>Описание</title>
							<value>
								<xsl:choose>
									<xsl:when test="Описание/@ФорматHTML = 'true'">
										<xsl:value-of select="Описание"/>
									</xsl:when>
									<xsl:otherwise>
										<xsl:value-of select="php:function('nl2br', string(Описание))" disable-output-escaping="yes" />
									</xsl:otherwise>
								</xsl:choose>
							</value>
						</property>
					</xsl:if>

					<property name="1c_catalog_id" type="string">
						<title>Идентификатор каталога 1С</title>
						<value><xsl:value-of select="$catalog-id" /></value>
					</property>

					<property name="1c_product_id" type="string">
						<title>Идентификатор в 1С</title>
						<value><xsl:value-of select="Ид" /></value>
					</property>

					<property name="artikul" type="string">
						<title>Артикул</title>
						<value><xsl:value-of select="Артикул" /></value>
					</property>

					<property name="bar_code" type="string">
						<title>Штрих-код</title>
						<value><xsl:value-of select="Штрихкод" /></value>
					</property>

					<property name="weight" type="float">
						<title>Вес</title>
						<value><xsl:value-of select="ЗначенияРеквизитов/ЗначениеРеквизита[Наименование = 'Вес']/Значение"/></value>
					</property>			

					<!-- Вызываем стандартный шаблон Картинка только для 1 элемента -->
					<xsl:apply-templates select="Картинка[1]" />
	
					<!-- Вызываем кастомный шаблон Картинка[position() &gt; 1] для последующих изображений -->
					<property name="photos" type="multiple_image">
						<title>Дополнительные фотографии товара</title>
						<xsl:apply-templates select="Картинка[position() &gt; 1]" />
					</property>
				</group>

				<xsl:apply-templates select="ЗначенияСвойств" />
			</properties>
		</page>
	</xsl:template>

Далее необходимо добавить шаблон Товар/Картинка[position() &gt; 1] который будет выглядеть следующим образом:

	<xsl:template match="Товар/Картинка[position() &gt; 1]">		
		<xsl:if test="string-length(.)">			
			<value><xsl:attribute name="path">./images/cms/data/<xsl:value-of select="." /></xsl:attribute></value>
		</xsl:if>
	</xsl:template>

После внесения всех изменений файл /xsl/import/custom/commerceML2.xsl, если Вы не вносили другие изменения, будет выглядеть вот так:

<?xml version="1.0" encoding="UTF-8"?>
<!--
TODO: // Write here your own templates
-->

<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="Товары/Товар">
		<xsl:param name="group_id" select="string(Группы/Ид)" />

		<xsl:param name="name">
			<xsl:choose>
				<xsl:when test="string-length(ПолноеНаименование)">
					<xsl:value-of select="ПолноеНаименование" />
				</xsl:when>
				<xsl:otherwise>
					<xsl:value-of select="Наименование" />
				</xsl:otherwise>
			</xsl:choose>
		</xsl:param>

		<page id="{Ид}" parentId="{$group_id}" type-id="{$group_id}">
			<xsl:choose>
				<xsl:when test="Статус = 'Удален'">
					<xsl:attribute name="is-deleted">1</xsl:attribute>
				</xsl:when>
				<xsl:when test="$isCatalogItemsRestoreOnImport = 1">
					<xsl:attribute name="is-deleted">0</xsl:attribute>
				</xsl:when>
			</xsl:choose>

			<xsl:if test="not(Группы/Ид)">
				<xsl:attribute name="parentId"><xsl:value-of select="$catalog-id" /></xsl:attribute>
				<xsl:attribute name="type-id">root-catalog-object-type</xsl:attribute>
			</xsl:if>

			<default-active>
				<xsl:value-of select="$catalog_item_activity" />
			</default-active>

			<default-visible>
				<xsl:value-of select="$catalog_item_visible" />
			</default-visible>

			<basetype module="catalog" method="object">Объекты каталога</basetype>

			<name><xsl:value-of select="$name" /></name>

			<xsl:if test="string-length($catalog_item_template)">
				<default-template>
					<xsl:value-of select="$catalog_item_template" />
				</default-template>
			</xsl:if>			
			<properties>
				<xsl:call-template name="common-group">
					<xsl:with-param name="name" select="$name" />
				</xsl:call-template>

				<group name="product">
					<title>1C: Общие свойства</title>

					<xsl:if test="string-length(Описание)">
						<property name="description" title="Описание" type="wysiwyg" allow-runtime-add="1">
							<type data-type="wysiwyg" />
							<title>Описание</title>
							<value>
								<xsl:choose>
									<xsl:when test="Описание/@ФорматHTML = 'true'">
										<xsl:value-of select="Описание"/>
									</xsl:when>
									<xsl:otherwise>
										<xsl:value-of select="php:function('nl2br', string(Описание))" disable-output-escaping="yes" />
									</xsl:otherwise>
								</xsl:choose>
							</value>
						</property>
					</xsl:if>

					<property name="1c_catalog_id" type="string">
						<title>Идентификатор каталога 1С</title>
						<value><xsl:value-of select="$catalog-id" /></value>
					</property>

					<property name="1c_product_id" type="string">
						<title>Идентификатор в 1С</title>
						<value><xsl:value-of select="Ид" /></value>
					</property>

					<property name="artikul" type="string">
						<title>Артикул</title>
						<value><xsl:value-of select="Артикул" /></value>
					</property>

					<property name="bar_code" type="string">
						<title>Штрих-код</title>
						<value><xsl:value-of select="Штрихкод" /></value>
					</property>

					<property name="weight" type="float">
						<title>Вес</title>
						<value><xsl:value-of select="ЗначенияРеквизитов/ЗначениеРеквизита[Наименование = 'Вес']/Значение"/></value>
					</property>			

					<!-- Вызываем стандартный шаблон Картинка только для 1 элемента -->
					<xsl:apply-templates select="Картинка[1]" />
	
					<!-- Вызываем кастомный шаблон Картинка[position() &gt; 1] для последующих изображений -->
					<property name="photos" type="multiple_image">
						<title>Дополнительные фотографии товара</title>
						<xsl:apply-templates select="Картинка[position() &gt; 1]" />
					</property>
				</group>

				<xsl:apply-templates select="ЗначенияСвойств" />
			</properties>
		</page>
	</xsl:template>
	
	<xsl:template match="Товар/Картинка[position() &gt; 1]">		
		<xsl:if test="string-length(.)">			
			<value><xsl:attribute name="path">./images/cms/data/<xsl:value-of select="." /></xsl:attribute></value>
		</xsl:if>
	</xsl:template>		
</xsl:stylesheet>

Теперь при выгрузке из 1С все дополнительные изображения товаров будут сразу отображаться на сайте:

Multiple image.png