Как не выгружать данные из 1С в определенные поля, если эти поля уже заполнены

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

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

Задача

При импорте из 1С выполнять проверку на стороне UMI.CMS: заполнено ли определенное поле у объектов каталога. Если не заполнено — записывать в него данные, а если заполнено — не изменять его значение.

Решение

Рассмотрим вариант выполнения нашей задачи на примере поля с идентификатором "name".

1. Открываем файл ~/xsl/import/commerceML2.xsl и копируем из него шаблон:

<xsl:template match="Товары/Товар">

Копируем в файл ~/xsl/import/custom/commerceML2.xsl.

2. Добавляем параметры в начало шаблона:

<!-- Получаем системный идентификатор объекта каталога, он совпадает с "Ид" товара в файле import.xml -->
<xsl:param name="pageId" select="Ид" />
<!-- Получаем значение поля с идентификатором "name" объекта каталога -->
<xsl:param name="objectName" select="document(concat('upage://', $pageId))/udata/page/name" />

3. Выполняем проверку:

<!-- Если у объекта каталога поле с идентификатором "name" пустое (пустая строка), мы добавляем в него значение при импорте -->
<xsl:if test="not(string-length($objectName))">
	<name><xsl:value-of select="$objectName" /></name>
</xsl:if>

В результате шаблон в файле ~/xsl/import/custom/commerceML2.xsl будет выглядеть так:

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

	<!-- Получаем системный идентификатор объекта каталога, он совпадает с "Ид" товара в файле import.xml -->
	<xsl:param name="pageId" select="Ид"/>		
	<!-- Получаем значение поля с идентификатором "name" объекта каталога -->
	<xsl:param name="objectName" select="document(concat('upage://', $pageId))/udata/page/name" />
	
	<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>
			
		<!-- Если у объекта каталога поле с идентификатором "name" пустое (пустая строка), мы добавляем в него значение при импорте -->
		<xsl:if test="not(string-length($objectName))">
			<name><xsl:value-of select="$objectName"/></name>
		</xsl:if>

		<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>

		<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>

				<xsl:apply-templates select="Картинка" />
			</group>

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