Изменение иерархии при обмене данными с 1С — различия между версиями

Материал из Umicms
Перейти к:навигация, поиск
(Новая страница: «При импорте из CommerceML2.0 объекты располагаются в том иерархическом порядке, в котором они бы…»)
 
 
(не показано 6 промежуточных версий 2 участников)
Строка 1: Строка 1:
 +
'''В статье [[Как_переместить_страницу_если_её_раздел_поменялся]] есть более простое решение'''
 +
 
При импорте из CommerceML2.0 объекты располагаются в том иерархическом порядке, в котором они были в исходном файле, в дальнейшем, при обновлении данных средствами импорта их положение уже не изменяется, а обращение к объекту идёт напрямую по его идентификатору. Если требуется при обмене данными с 1С изменять иерархию в соответствии с импортируемыми данными, то необходимо добавить соответствующую обработку в шаблон импорт.<br />
 
При импорте из CommerceML2.0 объекты располагаются в том иерархическом порядке, в котором они были в исходном файле, в дальнейшем, при обновлении данных средствами импорта их положение уже не изменяется, а обращение к объекту идёт напрямую по его идентификатору. Если требуется при обмене данными с 1С изменять иерархию в соответствии с импортируемыми данными, то необходимо добавить соответствующую обработку в шаблон импорт.<br />
Перед импортом входящая информация из commerceML2.0 трансформируется по XSLT шаблону в формат UmiDump2.0. За иерархические связи в UmiDump отвечает нода <hierarchy>. Для того чтобы при импорте структура каталога обновлялась, необходимо чтобы после трансформации в UmiDump в нём бли записи об иерархических связях. Для этого скопируем содержимое файла ~/xsl/import/commerceML2.xsl в ~/xsl/import/custom/commerceML2.xsl удалив строку <xsl:include href="custom/commerceML2.xsl" />.
+
Перед импортом входящая информация из commerceML2.0 трансформируется по XSLT шаблону в формат UmiDump2.0. За иерархические связи в UmiDump отвечает нода <hierarchy>. Для того чтобы при импорте структура каталога обновлялась, необходимо чтобы после трансформации в UmiDump в нём были записи об иерархических связях. Для этого скопируем содержимое файла ~/xsl/import/commerceML2.xsl в ~/xsl/import/custom/commerceML2.xsl удалив строку <xsl:include href="custom/commerceML2.xsl" />.
 
После этого находим шаблон
 
После этого находим шаблон
 
<source lang=xml>
 
<source lang=xml>
Строка 25: Строка 27:
 
             <xsl:apply-templates select="КоммерческаяИнформация/Классификатор" />
 
             <xsl:apply-templates select="КоммерческаяИнформация/Классификатор" />
 
             <xsl:apply-templates select="КоммерческаяИнформация/Каталог" />
 
             <xsl:apply-templates select="КоммерческаяИнформация/Каталог" />
 
+
 
             <xsl:apply-templates select="КоммерческаяИнформация/ПакетПредложений" />
 
             <xsl:apply-templates select="КоммерческаяИнформация/ПакетПредложений" />
 
+
 
             <xsl:if test="count(КоммерческаяИнформация/Документ)">
 
             <xsl:if test="count(КоммерческаяИнформация/Документ)">
 
                 <xsl:apply-templates select="КоммерческаяИнформация" mode="document" />
 
                 <xsl:apply-templates select="КоммерческаяИнформация" mode="document" />
 
             </xsl:if>
 
             </xsl:if>
 +
 +
    <xsl:variable name="classid" select="КоммерческаяИнформация/Классификатор/Ид" />
 +
 
             <hierarchy>
 
             <hierarchy>
 
                 <xsl:apply-templates select="КоммерческаяИнформация/Каталог/Товары/Товар" mode="hierarchy"/>
 
                 <xsl:apply-templates select="КоммерческаяИнформация/Каталог/Товары/Товар" mode="hierarchy"/>
                 <xsl:apply-templates select="КоммерческаяИнформация/Классификатор/Группы" mode="hierarchy"/>
+
                 <xsl:apply-templates select="КоммерческаяИнформация/Классификатор/Группы" mode="hierarchy">
 +
    <xsl:with-param name="classid">
 +
        <xsl:copy-of select="$classid" />
 +
    </xsl:with-param>
 +
</xsl:apply-templates>
 
             </hierarchy>
 
             </hierarchy>
 
         </umidump>
 
         </umidump>
Строка 42: Строка 51:
 
теперь добавим эти шаблоны в наш кастомный файл:
 
теперь добавим эти шаблоны в наш кастомный файл:
 
<source lang=xml>
 
<source lang=xml>
<xsl:template match="КоммерческаяИнформация/Каталог/Товары/Товар" mode="hierarchy">
+
    <xsl:template match="КоммерческаяИнформация/Каталог/Товары/Товар" mode="hierarchy">
 
         <relation id="{Ид}" parent-id="{Группы/Ид}"/>
 
         <relation id="{Ид}" parent-id="{Группы/Ид}"/>
 
     </xsl:template>
 
     </xsl:template>
       
+
 
     <xsl:template match="КоммерческаяИнформация/Классификатор/Группы" mode="hierarchy">
 
     <xsl:template match="КоммерческаяИнформация/Классификатор/Группы" mode="hierarchy">
         <xsl:apply-templates select="//Группа"/>
+
        <xsl:param name="classid" />
 +
         <xsl:apply-templates select="//Группа" >
 +
    <xsl:with-param name="classid">
 +
<xsl:copy-of select="$classid" />
 +
    </xsl:with-param>
 +
</xsl:apply-templates>
 
     </xsl:template>
 
     </xsl:template>
       
+
 
     <xsl:template match="//Группа" >
 
     <xsl:template match="//Группа" >
         <xsl:apply-templates select="Группы/Группа/Ид" mode="ghierarchy">
+
<xsl:param name="classid" />
 +
<xsl:if test="name(../../.) = 'Классификатор'">
 +
<relation id="{Ид}" parent-id="{$classid}"/>
 +
</xsl:if>
 +
         <xsl:apply-templates select="Группы/Группа" mode="ghierarchy">
 
             <xsl:with-param name="parent">
 
             <xsl:with-param name="parent">
 
                 <xsl:copy-of select="Ид" />
 
                 <xsl:copy-of select="Ид" />
Строка 57: Строка 75:
 
         </xsl:apply-templates>
 
         </xsl:apply-templates>
 
     </xsl:template>
 
     </xsl:template>
 
+
     <xsl:template match="Группы/Группа/Ид" mode="ghierarchy">
+
     <xsl:template match="Группы/Группа" mode="ghierarchy">
 
         <xsl:param name="parent" />
 
         <xsl:param name="parent" />
        <relation id="{.}" parent-id="{$parent}"/>
+
<relation id="{Ид}" parent-id="{$parent}"/>
 +
<xsl:apply-templates select="Группы/Группа" mode="ghierarchy">
 +
            <xsl:with-param name="parent">
 +
                <xsl:copy-of select="Ид" />
 +
            </xsl:with-param>
 +
</xsl:apply-templates>
 
     </xsl:template>
 
     </xsl:template>
 
</source>
 
</source>
  
 
теперь при обмене данными с 1С иерархия будет изменятся в соответствии с иерархией из импортируемого файла.
 
теперь при обмене данными с 1С иерархия будет изменятся в соответствии с иерархией из импортируемого файла.
[[Категория:Модуль Обмен данными]]
+
[[Категория:Модуль Обмен данными]] [[category:Интеграция с 1С]]

Текущая версия на 08:44, 13 сентября 2016

В статье Как_переместить_страницу_если_её_раздел_поменялся есть более простое решение

При импорте из CommerceML2.0 объекты располагаются в том иерархическом порядке, в котором они были в исходном файле, в дальнейшем, при обновлении данных средствами импорта их положение уже не изменяется, а обращение к объекту идёт напрямую по его идентификатору. Если требуется при обмене данными с 1С изменять иерархию в соответствии с импортируемыми данными, то необходимо добавить соответствующую обработку в шаблон импорт.
Перед импортом входящая информация из commerceML2.0 трансформируется по XSLT шаблону в формат UmiDump2.0. За иерархические связи в UmiDump отвечает нода <hierarchy>. Для того чтобы при импорте структура каталога обновлялась, необходимо чтобы после трансформации в UmiDump в нём были записи об иерархических связях. Для этого скопируем содержимое файла ~/xsl/import/commerceML2.xsl в ~/xsl/import/custom/commerceML2.xsl удалив строку <xsl:include href="custom/commerceML2.xsl" />. После этого находим шаблон

    <xsl:template match="/">

        <umidump xmlns:xlink="http://www.w3.org/TR/xlink" version="2.0">
            <xsl:apply-templates select="КоммерческаяИнформация/Классификатор" />
            <xsl:apply-templates select="КоммерческаяИнформация/Каталог" />

            <xsl:apply-templates select="КоммерческаяИнформация/ПакетПредложений" />

            <xsl:if test="count(КоммерческаяИнформация/Документ)">
                <xsl:apply-templates select="КоммерческаяИнформация" mode="document" />
            </xsl:if>
        </umidump>

    </xsl:template>

и изменяем его, подключив два шаблона

    <xsl:template match="/">

        <umidump xmlns:xlink="http://www.w3.org/TR/xlink" version="2.0">
            <xsl:apply-templates select="КоммерческаяИнформация/Классификатор" />
            <xsl:apply-templates select="КоммерческаяИнформация/Каталог" />
 
            <xsl:apply-templates select="КоммерческаяИнформация/ПакетПредложений" />
 
            <xsl:if test="count(КоммерческаяИнформация/Документ)">
                <xsl:apply-templates select="КоммерческаяИнформация" mode="document" />
            </xsl:if>
			
	    <xsl:variable name="classid" select="КоммерческаяИнформация/Классификатор/Ид" />
			
            <hierarchy>
                <xsl:apply-templates select="КоммерческаяИнформация/Каталог/Товары/Товар" mode="hierarchy"/>
                <xsl:apply-templates select="КоммерческаяИнформация/Классификатор/Группы" mode="hierarchy">
		    <xsl:with-param name="classid">
		        <xsl:copy-of select="$classid" />
		    </xsl:with-param>
		</xsl:apply-templates>					
            </hierarchy>
        </umidump>

    </xsl:template>

теперь добавим эти шаблоны в наш кастомный файл:

    <xsl:template match="КоммерческаяИнформация/Каталог/Товары/Товар" mode="hierarchy">
        <relation id="{Ид}" parent-id="{Группы/Ид}"/>
    </xsl:template>
 
    <xsl:template match="КоммерческаяИнформация/Классификатор/Группы" mode="hierarchy">
        <xsl:param name="classid" />
        <xsl:apply-templates select="//Группа" >
	    <xsl:with-param name="classid">
		<xsl:copy-of select="$classid" />
	    </xsl:with-param>
	</xsl:apply-templates>		
    </xsl:template>
 
    <xsl:template match="//Группа" >
	<xsl:param name="classid" />
	<xsl:if test="name(../../.) = 'Классификатор'">
		<relation id="{Ид}" parent-id="{$classid}"/>
	</xsl:if>	
        <xsl:apply-templates select="Группы/Группа" mode="ghierarchy">
            <xsl:with-param name="parent">
                <xsl:copy-of select="Ид" />
            </xsl:with-param>
        </xsl:apply-templates>
    </xsl:template>
 
    <xsl:template match="Группы/Группа" mode="ghierarchy">
        <xsl:param name="parent" />
	<relation id="{Ид}" parent-id="{$parent}"/>
	<xsl:apply-templates select="Группы/Группа" mode="ghierarchy">
            <xsl:with-param name="parent">
                <xsl:copy-of select="Ид" />
            </xsl:with-param>
	</xsl:apply-templates>			
    </xsl:template>

теперь при обмене данными с 1С иерархия будет изменятся в соответствии с иерархией из импортируемого файла.