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

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

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

Задача

Проверять при импорте из 1С, заполнено ли определенное поле на сайте. Если не заполнено — записывать в него данные, а если заполнено — не изменять его значение.

Решение

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

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

<xsl:template match="Группы/Группа" mode="groups">

Копируем в файл ~/xsl/import/custom/commerceML2.xsl. В скопированном блоке первые несколько строк — описание параметров.

2. Нам необходимо добавить свои параметры в начале блока, после объявления шаблона:

<!-- Получаем "Ид" товара из файла import.xml -->
<xsl:param name="pageId" select="Ид"/>

<!-- Получаем значение поля name со страницы товара -->
<xsl:param name="nameChecker" select="document(concat('upage://', $pageId))/udata/page/name" />

3. Теперь у нас есть необходимые данные и можно приступать к описанию логики:

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

4. Теперь, при выгрузке каталога из 1С наш кастомный шаблон будет проверять, заполнено поле name на сайте и, если оно пустое — шаблон добавит соответствующую информацию из 1С, а если в поле уже есть какое-либо значение — проигнорирует данные из 1С.

В конечном счёте у вас должен получиться такой код:

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