Как не выгружать данные из 1С в определенные поля, если эти поля уже заполнены — различия между версиями
Материал из Umicms
Denisov (обсуждение | вклад) (Новая страница: «'''Актуально для версии 20''' == Задача == Проверять, заполнено ли поле на сайте и, если не зап…») |
Aposio (обсуждение | вклад) |
||
(не показано 8 промежуточных версий 2 участников) | |||
Строка 2: | Строка 2: | ||
== Задача == | == Задача == | ||
− | + | При импорте из 1С выполнять проверку на стороне UMI.CMS: заполнено ли определенное поле у объектов каталога. Если не заполнено — записывать в него данные, а если заполнено — не изменять его значение. | |
− | |||
== Решение == | == Решение == | ||
− | Рассмотрим вариант выполнения нашей задачи на примере поля name. | + | Рассмотрим вариант выполнения нашей задачи на примере поля с идентификатором "name". |
− | < | + | 1. Открываем файл <b>~/xsl/import/commerceML2.xsl</b> и копируем из него шаблон: |
− | |||
− | |||
<source lang="xml"> | <source lang="xml"> | ||
− | <xsl:template match=" | + | <xsl:template match="Товары/Товар"> |
− | </source | + | </source> |
− | + | Копируем в файл <b>~/xsl/import/custom/commerceML2.xsl</b>. | |
− | </ | + | |
− | + | 2. Добавляем параметры в начало шаблона: | |
− | |||
<source lang="xml"> | <source lang="xml"> | ||
− | <!-- Получаем "Ид" товара | + | <!-- Получаем системный идентификатор объекта каталога, он совпадает с "Ид" товара в файле import.xml --> |
− | <xsl:param name="pageId" select="Ид"/> | + | <xsl:param name="pageId" select="Ид" /> |
+ | <!-- Получаем значение поля с идентификатором "name" объекта каталога --> | ||
+ | <xsl:param name="objectName" select="document(concat('upage://', $pageId))/udata/page/name" /> | ||
+ | </source> | ||
− | + | 3. Выполняем проверку: | |
− | |||
− | |||
− | |||
− | |||
− | |||
<source lang="xml"> | <source lang="xml"> | ||
− | <!-- | + | <!-- Если у объекта каталога поле с идентификатором "name" пустое (пустая строка), мы добавляем в него значение при импорте --> |
− | <xsl:if test="not(string-length($ | + | <xsl:if test="not(string-length($objectName))"> |
− | <name><xsl:value-of select="$ | + | <name><xsl:value-of select="$objectName" /></name> |
</xsl:if> | </xsl:if> | ||
− | </source | + | </source> |
− | + | ||
− | + | В результате шаблон в файле ~/xsl/import/custom/commerceML2.xsl будет выглядеть так: | |
− | |||
− | |||
− | |||
− | |||
<source lang="xml"> | <source lang="xml"> | ||
<xsl:template match="Товары/Товар"> | <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> | </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> | |
− | <xsl: | + | <property name="weight" type="float"> |
− | </ | + | <title>Вес</title> |
+ | <value><xsl:value-of select="ЗначенияРеквизитов/ЗначениеРеквизита[Наименование = 'Вес']/Значение"/></value> | ||
+ | </property> | ||
− | <xsl:apply-templates select=" | + | <xsl:apply-templates select="Картинка" /> |
− | </ | + | </group> |
− | |||
− | |||
− | |||
− | |||
− | |||
+ | <xsl:apply-templates select="ЗначенияСвойств" /> | ||
+ | </properties> | ||
+ | </page> | ||
+ | </xsl:template> | ||
+ | </source> | ||
[[category:Интеграция с 1С]] | [[category:Интеграция с 1С]] | ||
− | [[category:Модуль Обмен | + | [[category:Модуль Обмен данными]] |
Текущая версия на 09:14, 31 июля 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="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>