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

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

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

Задача

Проверять, заполнено ли поле на сайте и, если не заполнено — выгружать в него данные, а если заполнено — не выгружать.


Решение

Рассмотрим вариант выполнения нашей задачи на примере поля 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С.
  5. В конечном счёте у вас должен получиться такой код:
    <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>