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

Материал из Umicms
Перейти к:навигация, поиск
Строка 2: Строка 2:
  
 
== Задача ==
 
== Задача ==
Проверять при импорте из 1С, заполнено ли определенное поле на сайте. Если не заполнено — записывать в него данные, а если заполнено — не изменять его значение.  
+
При импорте из 1С выполнять проверку на стороне UMI.CMS, заполнено ли определенное поле у объектов каталога. Если не заполнено — записывать в него данные, а если заполнено — не изменять его значение.  
 
   
 
   
 
== Решение ==
 
== Решение ==
Рассмотрим вариант выполнения нашей задачи на примере поля name.
+
Рассмотрим вариант выполнения нашей задачи на примере поля с идентификатором "name".
  
1. Открываем файл <b>~/xsl/import/commerceML2.xsl</b> и копируем из него весь блок:  
+
1. Открываем файл <b>~/xsl/import/commerceML2.xsl</b> и копируем из него шаблон:  
 
<source lang="xml">
 
<source lang="xml">
<xsl:template match="Группы/Группа" mode="groups">
+
<xsl:template match="Товары/Товар">
 
</source>
 
</source>
Копируем в файл ~/xsl/import/custom/commerceML2.xsl. В скопированном блоке первые несколько строк — описание параметров.
+
Копируем в файл <b>~/xsl/import/custom/commerceML2.xsl</b>.
  
2. Нам необходимо добавить свои параметры в начале блока, после объявления шаблона:
+
2. Добавляем параметры в начало шаблона:
 
<source lang="xml">
 
<source lang="xml">
<!-- Получаем "Ид" товара из файла import.xml -->
+
<!-- Получаем системный идентификатор объекта каталога, он совпадает с "Ид" товара в файле import.xml -->
<xsl:param name="pageId" select="Ид"/>
+
<xsl:param name="pageId" select="Ид" />
  
<!-- Получаем значение поля name со страницы товара -->
+
<!-- Получаем значение поля с идентификатором "name" объекта каталога -->
<xsl:param name="nameChecker" select="document(concat('upage://', $pageId))/udata/page/name" />
+
<xsl:param name="systemName" select="document(concat('upage://', $pageId))/udata/page/name" />
 
</source>
 
</source>
  
3. Теперь у нас есть необходимые данные и можно приступать к описанию логики:
+
3. Выполняем проверку:
 
<source lang="xml">
 
<source lang="xml">
<!-- Здесь мы задаем условие. Если поле $nameChecker пустое, мы добавляем в него значение из файла import.xml -->
+
<!-- Если у объекта каталога поле с идентификатором "name" пустое (пустая строка), мы добавляем в него значение при импорте -->
<xsl:if test="not(string-length($nameChecker))">
+
<xsl:if test="not(string-length($systemName))">
<name><xsl:value-of select="$nameChecker"/></name>
+
<name><xsl:value-of select="$systemName" /></name>
 
</xsl:if>
 
</xsl:if>
 
</source>
 
</source>
  
4. Теперь, при выгрузке каталога из 1С наш кастомный шаблон будет проверять, заполнено поле name на сайте и, если оно пустое — шаблон добавит соответствующую информацию из 1С, а если в поле уже есть какое-либо значение — проигнорирует данные из 1С.
+
В результате код в файле ~/xsl/import/custom/commerceML2.xsl будет выглядеть так:
 
 
В конечном счёте у вас должен получиться такой код:
 
 
<source lang="xml">
 
<source lang="xml">
 
<xsl:template match="Товары/Товар">
 
<xsl:template match="Товары/Товар">
<xsl:param name="group_id" select="string(Группы/Ид)" />
+
<xsl:param name="group_id" select="string(Группы/Ид)" />
<!-- Получаем "Ид" товара из файла import.xml -->
+
<!-- Получаем "Ид" товара из файла import.xml -->
<xsl:param name="pageId" select="Ид"/>
+
<xsl:param name="pageId" select="Ид"/>
 
 
<!-- Получаем в переменную значение поля name с страницы -->
+
<!-- Получаем в переменную значение поля name с страницы -->
<xsl:param name="pageName" select="document(concat('upage://', $pageId))/udata/page/name" />
+
<xsl:param name="pageName" 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:param name="name">
+
<xsl:when test="Статус = 'Удален'">
<xsl:choose>
+
<xsl:attribute name="is-deleted">1</xsl:attribute>
<xsl:when test="string-length(ПолноеНаименование)">
+
</xsl:when>
<xsl:value-of select="ПолноеНаименование" />
+
<xsl:when test="$isCatalogItemsRestoreOnImport = 1">
</xsl:when>
+
<xsl:attribute name="is-deleted">0</xsl:attribute>
<xsl:otherwise>
+
</xsl:when>
<xsl:value-of select="Наименование" />
+
</xsl:choose>
</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>
 
 
 
<!-- Здесь мы задаем условие. Если поле $nameChecker пустое, тогда мы добавляем в него значение из файла import.xml -->
+
<!-- Здесь мы задаем условие. Если поле $nameChecker пустое, тогда мы добавляем в него значение из файла import.xml -->
<xsl:if test="not(string-length($pageName))">
+
<xsl:if test="not(string-length($pageName))">
<name><xsl:value-of select="$pageName"/></name>
+
<name><xsl:value-of select="$pageName"/></name>
</xsl:if>
+
</xsl:if>
  
<xsl:if test="not(Группы/Ид)">
+
<xsl:if test="not(Группы/Ид)">
<xsl:attribute name="parentId"><xsl:value-of select="$catalog-id" /></xsl:attribute>
+
<xsl:attribute name="parentId"><xsl:value-of select="$catalog-id" /></xsl:attribute>
<xsl:attribute name="type-id">root-catalog-object-type</xsl:attribute>
+
<xsl:attribute name="type-id">root-catalog-object-type</xsl:attribute>
</xsl:if>
+
</xsl:if>
  
<default-active>
+
<default-active>
<xsl:value-of select="$catalog_item_activity" />
+
<xsl:value-of select="$catalog_item_activity" />
</default-active>
+
</default-active>
  
<default-visible>
+
<default-visible>
<xsl:value-of select="$catalog_item_visible" />
+
<xsl:value-of select="$catalog_item_visible" />
</default-visible>
+
</default-visible>
  
<basetype module="catalog" method="object">Объекты каталога</basetype>
+
<basetype module="catalog" method="object">Объекты каталога</basetype>
  
<xsl:if test="string-length($catalog_item_template)">
+
<xsl:if test="string-length($catalog_item_template)">
<default-template>
+
<default-template>
<xsl:value-of select="$catalog_item_template" />
+
<xsl:value-of select="$catalog_item_template" />
</default-template>
+
</default-template>
</xsl:if>
+
</xsl:if>
  
<properties>
+
<properties>
<xsl:call-template name="common-group">
+
<xsl:call-template name="common-group">
<xsl:with-param name="name" select="$name" />
+
<xsl:with-param name="name" select="$name" />
</xsl:call-template>
+
</xsl:call-template>
  
<group name="product">
+
<group name="product">
<title>1C: Общие свойства</title>
+
<title>1C: Общие свойства</title>
+
<xsl:if test="string-length(Описание)">
+
<xsl:if test="string-length(Описание)">
 
 
<property name="description" title="Описание" type="wysiwyg" allow-runtime-add="1">
+
<property name="description" title="Описание" type="wysiwyg" allow-runtime-add="1">
<type data-type="wysiwyg" />
+
<type data-type="wysiwyg" />
<title>Описание</title>
+
<title>Описание</title>
<value>
+
<value>
<xsl:choose>
+
<xsl:choose>
<xsl:when test="Описание/@ФорматHTML = 'true'">
+
<xsl:when test="Описание/@ФорматHTML = 'true'">
<xsl:value-of select="Описание"/>
+
<xsl:value-of select="Описание"/>
</xsl:when>
+
</xsl:when>
<xsl:otherwise>
+
<xsl:otherwise>
<xsl:value-of select="php:function('nl2br', string(Описание))" disable-output-escaping="yes" />
+
<xsl:value-of select="php:function('nl2br', string(Описание))" disable-output-escaping="yes" />
</xsl:otherwise>
+
</xsl:otherwise>
</xsl:choose>
+
</xsl:choose>
</value>
+
</value>
</property>
+
</property>
</xsl:if>
+
</xsl:if>
  
<property name="1c_catalog_id" type="string">
+
<property name="1c_catalog_id" type="string">
<title>Идентификатор каталога 1С</title>
+
<title>Идентификатор каталога 1С</title>
<value><xsl:value-of select="$catalog-id" /></value>
+
<value><xsl:value-of select="$catalog-id" /></value>
</property>
+
</property>
  
<property name="1c_product_id" type="string">
+
<property name="1c_product_id" type="string">
<title>Идентификатор в 1С</title>
+
<title>Идентификатор в 1С</title>
<value><xsl:value-of select="Ид" /></value>
+
<value><xsl:value-of select="Ид" /></value>
</property>
+
</property>
  
<property name="artikul" type="string">
+
<property name="artikul" type="string">
<title>Артикул</title>
+
<title>Артикул</title>
<value><xsl:value-of select="Артикул" /></value>
+
<value><xsl:value-of select="Артикул" /></value>
</property>
+
</property>
  
<property name="bar_code" type="string">
+
<property name="bar_code" type="string">
<title>Штрих-код</title>
+
<title>Штрих-код</title>
<value><xsl:value-of select="Штрихкод" /></value>
+
<value><xsl:value-of select="Штрихкод" /></value>
</property>
+
</property>
  
<property name="weight" type="float">
+
<property name="weight" type="float">
<title>Вес</title>
+
<title>Вес</title>
<value><xsl:value-of select="ЗначенияРеквизитов/ЗначениеРеквизита[Наименование = 'Вес']/Значение"/></value>
+
<value><xsl:value-of select="ЗначенияРеквизитов/ЗначениеРеквизита[Наименование = 'Вес']/Значение"/></value>
</property>
+
</property>
  
<xsl:apply-templates select="Картинка" />
+
<xsl:apply-templates select="Картинка" />
</group>
+
</group>
  
<xsl:apply-templates select="ЗначенияСвойств" />
+
<xsl:apply-templates select="ЗначенияСвойств" />
</properties>
+
</properties>
</page>
+
</page>
</xsl:template>
+
</xsl:template>
 
</source>
 
</source>
</li>
 
</ol>
 
 
  
 
[[category:Интеграция с 1С]]
 
[[category:Интеграция с 1С]]
 
[[category:Модуль Обмен Данными]]
 
[[category:Модуль Обмен Данными]]

Версия 14:04, 11 июля 2019

Актуально для версии 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="systemName" select="document(concat('upage://', $pageId))/udata/page/name" />

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

<!-- Если у объекта каталога поле с идентификатором "name" пустое (пустая строка), мы добавляем в него значение при импорте -->
<xsl:if test="not(string-length($systemName))">
	<name><xsl:value-of select="$systemName" /></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="pageName" 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>
			
		<!-- Здесь мы задаем условие. Если поле $nameChecker пустое, тогда мы добавляем в него значение из файла import.xml -->
		<xsl:if test="not(string-length($pageName))">
			<name><xsl:value-of select="$pageName"/></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>