Единственный тип данных Объект каталога, при импорте из 1С

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

Актуально для 2.9.6


Задача: все свойства 1С размещать в родительском типе данных "Объект каталога", не создавая отдельных типов данных для каждого импортируемого вида товара.

Решение: Если по некоторым причинам, вам необходимо, чтобы при импорте данных из 1С использовался только родительский тип «Объект каталога» и не создавались дочерние типы, то необходимо использовать примерно следующий шаблон /xsl/import/custom/commerceML2.xsl, в случае не использования extended-pack:

<?xml version="1.0" encoding="UTF-8"?>
<!-- TODO: // Write here your own templates -->
  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl" xmlns:udt="http://umi-cms.ru/2007/UData/templates" extension-element-prefixes="php" exclude-result-prefixes="xsl php udt">
    <!-- переопределяем стандартные шаблоны преобразования -->
    <!-- выключаем создание новых типов данных для каждой группы товаров-->
    <xsl:template match="Группы/Группа" mode="types">
    <!-- do nothing -->
    </xsl:template>
    <!-- изменяем шаблон преобразования товара -->
  <xsl:template match="Товары/Товар">
  <xsl:param name="group_id" select="string(Группы/Ид)" />
  <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>
  <!-- Выставляем тип для всех импортируемых объектов: root-catalog-object-type (Обьект каталога) -->
    <page id="{Ид}" parentId="{$group_id}" type-id="root-catalog-object-type">
      <xsl:if test="Статус = 'Удален'">
        <xsl:attribute name="is-deleted">1</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>
      <name>
        <xsl:value-of select="$name" />
      </name>
      <xsl:if test="string-length($catalog_item_template)">
        <default-template>
          <xsl:value-of select="$catalog_item_template" />
        </default-template>
      </xsl:if>
      <properties>
        <group name="common">
          <title>Основные параметры</title>
          <property name="title" type="string">
            <title>Поле TITLE</title>
            <default-value>
              <xsl:value-of select="$name" />
            </default-value>
          </property>
          <property name="h1" type="string">
            <title>Поле H1</title>
            <default-value>
              <xsl:value-of select="$name" />
            </default-value>
          </property>
        </group>
        <group name="product" title="1C: Общие свойства">
          <title>1C: Общие свойства</title>
          <xsl:if test="string-length(Описание)">
            <property name="description" title="Описание" type="wysiwyg" visible="visible" 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" title="Идентификатор каталога 1С" type="string" allow-runtime-add="1">
            <title>Идентификатор каталога 1С</title>
            <type data-type="string"/>
            <value>
              <xsl:value-of select="$catalog-id" />
            </value>
          </property>
          <property name="1c_product_id" title="Идентификатор в 1С" type="string" allow-runtime-add="1">
            <title>Идентификатор в 1С</title>
            <type data-type="string"/>
            <value>
              <xsl:value-of select="Ид" />
            </value>
          </property>
          <property name="artikul" title="Артикул" type="string" allow-runtime-add="1">
            <title>Артикул</title>
            <type data-type="string"/>
            <value>
              <xsl:value-of select="Артикул" />
            </value>
          </property>
          <property name="bar_code" title="Штрих-код" type="string" allow-runtime-add="1">
            <title>Штрих-код</title>
            <type data-type="string"/>
            <value>
              <xsl:value-of select="Штрихкод" />
            </value>
          </property>
          <property name="weight" title="Вес" type="float" allow-runtime-add="1">
            <title>Вес</title>
            <type data-type="float"/>
            <value>
              <xsl:value-of select="ЗначенияРеквизитов/ЗначениеРеквизита[Наименование = 'Вес']/Значение"/>
            </value>
          </property>
          <xsl:apply-templates select="Картинка" />
        </group>
        <xsl:apply-templates select="ЗначенияСвойств" />
      </properties>
    </page>
  </xsl:template>

  <xsl:template match="ЗначенияСвойств/ЗначенияСвойства">
    <xsl:param name="property" select="key('property', Ид)" />
    <xsl:param name="data-type">
      <!-- Сопоставление между типом поля и Названием.Возможные варианты типов полей: relation, float, boolean, date-->
        <xsl:choose>
          <xsl:when test="$property/Наименование = 'Производитель'">relation</xsl:when>
          <xsl:when test="$property/Наименование = 'Вид товара'">relation</xsl:when>
          <xsl:when test="$property/Наименование = 'Канал сбыта'">relation</xsl:when>
          <xsl:otherwise>string</xsl:otherwise>
        </xsl:choose>
      </xsl:param>
      <xsl:if test="$property">
        <property name="{$property/Наименование}" title="{$property/Наименование}" type="{$data-type}" visible="visible"  is-public="1" allow-runtime-add="1">
          <type data-type="{$data-type}" />
          <title>
            <xsl:value-of select="$property/Наименование"/>
          </title>
          <value>
            <xsl:choose>
              <xsl:when test="$data-type = 'relation'">
                <item name="{Значение}" />
              </xsl:when>
              <xsl:otherwise>
                <xsl:value-of select="Значение" />
              </xsl:otherwise>
            </xsl:choose>
          </value>
        </property>
      </xsl:if>
    </xsl:template>

    <xsl:template match="Товар/Картинка">
      <xsl:if test="string-length(.)">
        <property name="photo" title="Картинка" type="img_file" visible="visible" allow-runtime-add="1">
          <type data-type="img_file"/>
          <title>Картинка</title>
          <value>./images/cms/data/<xsl:value-of select="."/></value>
        </property>
      </xsl:if>
    </xsl:template>
  </xsl:stylesheet>

В случае использования extended-pack, шаблон "ЗначенияСвойств/ЗначенияСвойства" необходимо удалить, т.к. достаточно использовать вариант по умолчанию, тот который в файле /xsl/import/commerceML2.xsl