Курс 2016 года “Разработка на UMI.CMS от 0 до готового сайта”

0 Пользователей и 1 Гость просматривают эту тему.

*

hs_sergey

  • *
  • 7
  • +0/-0
    • Просмотр профиля
Здравствуйте

Я разрабатываю интернет-магазин на базе UMI-CMS и мне необходимо настроить
интеграцию сайта с 1С Управление торговлей 11. Согласно техническому
заданию товары должны быть заданы в 1С и затем выгружаться на сайт. Я
проанализировал XML-файлы, которые отдает 1С, добавил в шаблон импорта
custom/commerceML2.xsl инструкции для заполнения свойств товара (так как
структура XML, что отдает УТ11 немного отличается от примера в
files/filesToImport/CML2.0/import.xml), но столкнулся со следующей
проблемой:

У нас товар задан как свойствами, так и характеристиками, от которых
зависит цена. Однако в систему UMI-CMS импортируются свойства товара, но
не импортируются характеристики. В документации сказано, что в текущей
версии UMI характеристики не импортируются, однако в дальнейшем они
будут использованы для создания опционных свойств товара. А мне
необходимо использовать их для создания опционных свойств товара уже
сейчас. В XML файле, что приходит с 1С, характеристики выглядят
следующим образом:

            <Предложение>

<Ид>ab54bc85-df9b-11e1-82b1-001e8cd2c7e0#ab54bc87-df9b-11e1-82b1-001e8cd2c7e0</Ид>
                <Наименование>Conte Prisrige12 (Conte Prestige12 Bronz
(оттенок загара) 3)</Наименование>
                <ХарактеристикиТовара>
                    <ХарактеристикаТовара>
                        <Наименование>Колготки цвета</Наименование>
                        <Значение>Bronz (оттенок загара)</Значение>
                    </ХарактеристикаТовара>
                    <ХарактеристикаТовара>
                        <Наименование>Модель</Наименование>
                        <Значение>Prestige12</Значение>
                    </ХарактеристикаТовара>
                    <ХарактеристикаТовара>
                        <Наименование>Размер</Наименование>
                        <Значение>3</Значение>
                    </ХарактеристикаТовара>
                    <ХарактеристикаТовара>
                        <Наименование>Бренд</Наименование>
                        <Значение>Conte</Значение>
                    </ХарактеристикаТовара>
                    <ХарактеристикаТовара>
                        <Наименование>Плотность</Наименование>
                        <Значение>12</Значение>
                    </ХарактеристикаТовара>
                </ХарактеристикиТовара>
                <Цены>
                    <Цена>
                        <Представление>250 RUB за шт</Представление>

<ИдТипаЦены>24b66d81-d18f-11e1-9436-001e8cd2c7e0</ИдТипаЦены>
                        <ЦенаЗаЕдиницу>250.00</ЦенаЗаЕдиницу>
                        <Валюта>RUB</Валюта>
                        <Единица>шт</Единица>
                        <Коэффициент>1</Коэффициент>
                    </Цена>
                </Цены>
                <Количество>5</Количество>
            </Предложение>


Я добавляю в шаблон импорта следующие инструкции:

    <xsl:template match="Предложения/Предложение">
        <page id="{substring-before(Ид,'#')}" update-only="1">
            <properties>
                <group name="optioned_properties" title="Опционные
свойства">
                    <property name="Характеристики" type="optioned"
multiple="multiple" is-public="1" visible="visible" allow-runtime-add="1">
                        <type data-type="optioned" />
                        <title>Характеристики</title>
                            <value>
                                <option int="{Количество}"
float="{Цены/Цена/ЦенаЗаЕдиницу}">
                                    <object name="{Наименование}"
data-type="relation" allow-runtime-add="1">
                                        <properties>
                                            <xsl:apply-templates
select="ХарактеристикиТовара/ХарактеристикаТовара" />
                                        </properties>
                                    </object>
                                </option>
                            </value>
                    </property>
                </group>
            </properties>
        </page>
    </xsl:template>

    <xsl:template match="ХарактеристикиТовара/ХарактеристикаТовара">
        <properties>
            <property name="{Наименование}" type="string"  is-public="1"
visible="visible" allow-runtime-add="1">
                <type data-type="string" />
                <title><xsl:value-of select="Наименование" /></title>
                <value><xsl:value-of select="Значение" /></value>
            </property>
        </properties>
    </xsl:template>

В результате опционное свойство создается, но оно не задано, справочник
для поля Характеристики создается, но он оказывается пустым, сами
характеристики никуда не добавляются. Кто может помочь или подсказать с
шаблоном
импорта, чтобы на сайт могли импортироваться опционные свойства товара?
Или где мне можно посмотреть пример добавления опционных свойств?

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
я бы на твоем месте попробовал выгрузить через модуль "Обмен данных" страницы у которых есть опционные свойства (руками созданные) в формате umidump20 и на основе этого делал инструкции для импорта

*

hs_sergey

  • *
  • 7
  • +0/-0
    • Просмотр профиля
Пробовал это. Но там проблема в том, что когда делаешь экспорт данных, справочники выгружаются отдельно в тег <object>, а в опционных свойствах товара дальше идет ссылка на этот объект по его id. Но когда импортируешь товары, у тебя нет заранее сформированных справочников, объекты в них заносятся по ходу импорта товара, то есть id объекта не известен.

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
разве ты не можешь прописать объекты справочника с произвольным id и по нему привязать эти объекты к опционным свойствам?

посмотри пример с импортом страниц к которым надо указать id типа данных и созданные выше типы данных с указанным id

*

hs_sergey

  • *
  • 7
  • +0/-0
    • Просмотр профиля
А как я их пропишу, если я их узнаю только во время импорта товаров? Или как-то можно парсить один и тот же XML импорта дважды, и сначала выцепить из товаров все характеристики в справочник и запомнить его id, а затем добавлять товары, используя уже сформированный справочник?

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
у вас же всегда есть возможность один и тот же кусок xml обработать 2 и более количество раз.

Например, покажу подобную реализацию, на примере вызова макроса вывода фоток из альбома
<xsl:apply-templates select="document('udata://photoalbum/album/(/butterfly/)')/udata" />

пишем для данного вызова обработчик который 2 раза пробегает по полученному списку фотографий и выводит ul список с ссылками на каждую фото и div блоки с самими фотками
<xsl:template match="udata[@module = 'photoalbum' and @method = 'album']" />

     <xsl:template match="udata[@module = 'photoalbum' and @method = 'album'][total]" >
          <xsl:apply-templates select="." mode="div" />
          <xsl:apply-templates select="." mode="ul" />
     </xsl:template>
   
          <!-- ul -->
          <xsl:template match="udata[@module = 'photoalbum'][@method = 'album'][total]" mode="ul">
               <ul>
                    <xsl:apply-templates select="items/item" mode="ul" />
               </ul>
          </xsl:template>

          <xsl:template match="item" mode="ul">
               <li >
                    <a href="{@link}">
                         <xsl:value-of select="position()"/>
                    </a>
               </li>
          </xsl:template>
          <!-- \ul -->
         
          <!-- div -->
          <xsl:template match="udata[@module = 'photoalbum'][@method = 'album'][total]" mode="div">
               <div>
                    <xsl:apply-templates select="items/item" mode="div" />
               </div>
          </xsl:template>   
         
          <xsl:template match="item" mode="div">
               <xsl:apply-templates select="document(concat('upage://',@id))/udata/page" mode="div" />
          </xsl:template>

          <xsl:template match="page" mode="div">             
<a href="{//property[@name='ssylka']/value}" >
<xsl:call-template name="catalog-thumbnail">
  <xsl:with-param name="element-id" select="@id" />
  <xsl:with-param name="field-name">photo</xsl:with-param>
  <xsl:with-param name="width">auto</xsl:with-param>
  <xsl:with-param name="height">323</xsl:with-param>
</xsl:call-template>
</a>
          </xsl:template>
          <!-- \div -->

В итоге, мы 2 раза обработали один и тот же xml

*

hs_sergey

  • *
  • 7
  • +0/-0
    • Просмотр профиля
Мммм спасибо за наводку... сейчас попробую таким образом вынести создание объектов справочников до описания страниц...

*

hs_sergey

  • *
  • 7
  • +0/-0
    • Просмотр профиля
Вынес создание объектов до страниц, теперь другая ошибка)

Вот как было сделано:
	<!-- Предложения -->
<xsl:template match="ПакетПредложений">
<meta>
<source-name>commerceML2</source-name>
</meta>
<objects>
<xsl:apply-templates select="Предложения/Предложение"  mode="objects"/>
</objects>
<pages>
<xsl:apply-templates select="Предложения/Предложение"  mode="items"/>
</pages>
</xsl:template>

<!-- описание объектов справочников -->

<xsl:template match="Предложения/Предложение"  mode="objects">
<object id="{substring-after(Ид,'#')}" name="{Наименование}" type-id="288">
<properties>
                <group name="varianty_harakteristik_kolgotok">
                 <xsl:apply-templates select="ХарактеристикиТовара/ХарактеристикаТовара[Наименование = 'Колготки цвета']" mode="color" />
                 <xsl:apply-templates select="ХарактеристикиТовара/ХарактеристикаТовара[Наименование = 'Модель']" mode="model" />
                 <xsl:apply-templates select="ХарактеристикиТовара/ХарактеристикаТовара[Наименование = 'Размер']" mode="size" />
                 <xsl:apply-templates select="ХарактеристикиТовара/ХарактеристикаТовара[Наименование = 'Бренд']" mode="brand" />
                 <xsl:apply-templates select="ХарактеристикиТовара/ХарактеристикаТовара[Наименование = 'Плотность']" mode="density" />
</group>
</properties>
</object>
</xsl:template>

<xsl:template match="ХарактеристикиТовара/ХарактеристикаТовара" mode="color" >
<property name="color" type="string"  is-public="1" visible="visible">
<title><xsl:value-of select="Наименование" /></title>
<value><xsl:value-of select="Значение" /></value>
</property>
</xsl:template>

....

<!-- описание страниц, ссылающихся на эти объекты -->

<xsl:template match="Предложения/Предложение" mode="items">
<page id="{substring-before(Ид,'#')}" update-only="1">
<properties>
<group name="optioned_properties" title="Опционные свойства">
<property name="Характеристики" type="optioned" multiple="multiple" is-public="1" visible="visible" allow-runtime-add="1">
<type data-type="optioned" />
<title>Характеристики</title>
<value>
<option int="{Количество}" float="{Цены/Цена/ЦенаЗаЕдиницу}">
<object id="{substring-after(Ид,'#')}" name="{Наименование}" type-id="288" />
</option>
</value>
</property>
</group>
</properties>
</page>
</xsl:template>


То есть в начале задаются объекты, а затем уже товары ссылаются на эти объекты.

В преобразованном в UmiDump XML-нике тоже вроде все красиво:

  <objects>
    <object id="ab54bcb0-df9b-11e1-82b1-001e8cd2c7e0" name="Trasparenze Sophie (Trasparenze Sophie  Cina (синий) 1)" type-id="288">
      <properties>
        <group name="varianty_harakteristik_kolgotok">
          <property name="color" type="string" is-public="1" visible="visible">
            <title>Колготки цвета</title>
            <value><![CDATA[ Cina (синий)]]></value>
          </property>
...

      </properties>
    </object>

...

  </objects>
  <pages>
    <page id="ab54bcaf-df9b-11e1-82b1-001e8cd2c7e0" update-only="1">
      <properties>
        <group name="optioned_properties" title="Опционные свойства">
          <property name="Характеристики" type="optioned" multiple="multiple" is-public="1" visible="visible" allow-runtime-add="1">
            <type data-type="optioned"/>
            <title>Характеристики</title>
            <value>
              <option int="7" float="650.00">
                <object id="ab54bcb0-df9b-11e1-82b1-001e8cd2c7e0" name="Trasparenze Sophie (Trasparenze Sophie  Cina (синий) 1)" type-id="288"/>
              </option>
            </value>
          </property>
        </group>
      </properties>
    </page>

...

Но теперь импорт выдает ошибки вида:

невозможно импортировать объект "Conte Prisrige12 (Conte Prestige12 Bronz (оттенок загара) 2)" (#ab54bc86-df9b-11e1-82b1-001e8cd2c7e0): невозможно определить тип данных #288

288 - это созданный предварительно мной справочник "Варианты характеристик", тип с таким id есть. Почему система не может его найти?
« Последнее редактирование: 27 Августа 2012, 13:32:10 от hs_sergey »

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
я бы начал с того, что изменил то, что у вас у object, page и свойства page - "Колготки цвета".... один и тот же id ="ab54bcaf-df9b-11e1-82b1-001e8cd2c7e0"
Вот система и пытается читая строчку

page id="ab54bcaf-df9b-11e1-82b1-001e8cd2c7e0"

создать страницу с id, который уже закреплен как id для object

*

hs_sergey

  • *
  • 7
  • +0/-0
    • Просмотр профиля
Это не так, ID разные, хотя и кажется что похожие. 1С присылает характеристики товара в виде

			<Предложение>
<Ид>ab54bc85-df9b-11e1-82b1-001e8cd2c7e0#ab54bc86-df9b-11e1-82b1-001e8cd2c7e0</Ид>

Где до # идет id товара (под этим id) товары идут в import.xml, а после # идет id характеристики.  Они хоть внешне похожие, но значения у них разные, если присмотреться....

Создание объектов я победил, добавив секцию <types> :

	<!-- Предложения -->
<xsl:template match="ПакетПредложений">
<meta>
<source-name>commerceML2</source-name>
</meta>
<types>
<!-- описание типа для справочника вариантов характеристик колготок -->
<type id="charakteristics-kinds" title="Варианты характеристик колготок" parent-id="1" guide="guide">
<fieldgroups>
<group name="varianty_harakteristik_kolgotok">
<field name="color" title="Цвет" field-type-id="3" >
          <type id="3" name="Строка" data-type="string"/>
        </field>
...
</group>
</fieldgroups>
</type>
</types>
<objects>
<xsl:apply-templates select="Предложения/Предложение"  mode="objects"/>
..

и соответственно указав тип charakteristics-kinds при создании объекта:

	<xsl:template match="Предложения/Предложение"  mode="objects">
<object id="{substring-after(Ид,'#')}" name="{Наименование}" type-id="charakteristics-kinds">
<properties>

а также при задании опционного свойства

					<property name="Характеристики" type="optioned" is-public="1" visible="visible" allow-runtime-add="1">
<type data-type="optioned" />
<title>Характеристики</title>
<value>
<option int="{Количество}" float="{Цены/Цена/ЦенаЗаЕдиницу}">
<object id="{substring-after(Ид,'#')}" name="{Наименование}" type-id="charakteristics-kinds" />
</option>
</value>
</property>


Что происходит теперь: справочник "Варианты характеристик колготок" создается, данные туда добавляются. В типе данных для товара создается поле "Характеристики". Но оно оказывается пустым :( мало того, у него не задан даже тип данных (когда смотришь редактирование поля, в выпадающем списке "тип данных" ничего не выбрано). Единственное что там выбрано - это справочник "Варианты характеристик колготок". Получается, что где-то есть ошибка в задании property товара? Не пойму в чем дело, по синтаксису все похоже как в примере...

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
вот тут уже надо выделять время влазить и тестировать, чтобы сказать где именно у вас может быть огрех)

*

hs_sergey

  • *
  • 7
  • +0/-0
    • Просмотр профиля
Во вложении находится измененный шаблон импорта commerceML2.xsl

Что удалось сделать:

- Создан тип данных -  справочник "Варианты характеристик колготок"
- Задан единый тип товара -  "1C: Колготки" (до этого пыталось на каждую группу создать свой тип товара)
- В этом типе товара определено опционное свойство "Характеристики", которое должно ссылаться на этот справочник
- Предложения с характеристиками товара парсятся теперь два раза:
1. формируется секция <objects>, в которой происходит наполнение справочника "Варианты характеристик колготок"
2. формируется секция <pages>, в которую в опционные свойства должны записываться ссылки на созданные объекты справочника.

Что не получилось:

- справочник "Варианты характеристик колготок" формируется не в разделе "Справочники", а в корневом разделе "Шаблоны данных", хотя в описании типа указано:

            <type id="charakteristics-kinds" title="Варианты характеристик колготок" parent-id="{root-guides-type}" guide="guide">

- опционное поле у товара формируется со ссылкой не на справочник "Варианты характеристик колготок", а на какой-то другой справочник "Справочник для поля "Характеристики"" (?), который видимо создается как-то автоматически, хотя в описании опционного поля явно прописано:

                        <field name="charakteristics" title="Характеристики" visible="visible" guide-id="charakteristics-kinds">
                            <type name="Составное" data-type="optioned"  multiple="multiple" />
                        </field>

Соответственно при добавлении товаров, хотя сами характеристики и добавляются в справочник, в самих товарах поле "Характеристики" оказывается не заполненным...

Поэтому если возможно помогите разобраться в следующих вопросах:
1. Как сформировать справочник справочник в разделе данных "Справочники", а не в корневом разделе "Шаблоны данных"?
2. Как заставить создаваться опционное поле со ссылкой на мой справочник, а не на какой-то Справочник для поля "Характеристики"?

то, что в товарах оказывается незаполненным поле, может быть следствием пункта 2.

*

Rodogor

  • ***
  • 189
  • +24/-0
    • Просмотр профиля
Здравствуйте.
Аналогичную задачу решаю, различие такое:
Характеристики будут создаваться как объекты каталога, т.к. для каждой характеристики нужно помнить склад и т.п.., а для основного объекта они будут привязаны через ссылку типа дерево.

Вот при добавление такого объекта у меня есть ИД  уже созданного объекта,  "расширенную" характеристику которого я и создаю, мне нужно получить его данные - Группы/Ид и т.п, когда у меня есть только ИД 1с. Сейчас пишу кастом, который поиск по этому ИД выполнит, а может быть есть какой-нибудь "штатный" способ получить page по ИД из 1с ?

Вообще такая структура, в которой доп.характеристики как полноценные объекты, имеет право на существование ?

*

KTI

  • **
  • 72
  • +1/-0
    • Просмотр профиля
Есть в вики статейка "Обновление объектов созданных вручную данными из 1С", там описано соответствие page_id и ИД из 1С. И примеры есть, на основе их можно попробовать получить page по ИД из 1с. Если получится, можете выложить код, лишним не будет

*

hnika206

  • *
  • 15
  • +0/-0
    • Просмотр профиля
Во вложении находится измененный шаблон импорта commerceML2.xsl

Что удалось сделать:

- Создан тип данных -  справочник "Варианты характеристик колготок"
- Задан единый тип товара -  "1C: Колготки" (до этого пыталось на каждую группу создать свой тип товара)
- В этом типе товара определено опционное свойство "Характеристики", которое должно ссылаться на этот справочник
- Предложения с характеристиками товара парсятся теперь два раза:
1. формируется секция <objects>, в которой происходит наполнение справочника "Варианты характеристик колготок"
2. формируется секция <pages>, в которую в опционные свойства должны записываться ссылки на созданные объекты справочника.

Что не получилось:

- справочник "Варианты характеристик колготок" формируется не в разделе "Справочники", а в корневом разделе "Шаблоны данных", хотя в описании типа указано:

            <type id="charakteristics-kinds" title="Варианты характеристик колготок" parent-id="{root-guides-type}" guide="guide">

- опционное поле у товара формируется со ссылкой не на справочник "Варианты характеристик колготок", а на какой-то другой справочник "Справочник для поля "Характеристики"" (?), который видимо создается как-то автоматически, хотя в описании опционного поля явно прописано:

                        <field name="charakteristics" title="Характеристики" visible="visible" guide-id="charakteristics-kinds">
                            <type name="Составное" data-type="optioned"  multiple="multiple" />
                        </field>

Соответственно при добавлении товаров, хотя сами характеристики и добавляются в справочник, в самих товарах поле "Характеристики" оказывается не заполненным...

Поэтому если возможно помогите разобраться в следующих вопросах:
1. Как сформировать справочник справочник в разделе данных "Справочники", а не в корневом разделе "Шаблоны данных"?
2. Как заставить создаваться опционное поле со ссылкой на мой справочник, а не на какой-то Справочник для поля "Характеристики"?

то, что в товарах оказывается незаполненным поле, может быть следствием пункта 2.
Такая же проблема как у вас! Создается два справочника: один создается прямо от корня и в него записываются опционные свойства, и второй который является дочерним к "Справочники", он пустой и его использует как объект для данных сотавное поле в товарах.
Я читала ваш пост на ХабраХабре http://habrahabr.ru/post/166647/, делала все как сказано там (кстати там опечатка в описании типа для справочника вариантов характеристик футболок id=charaсteristics-kinds, а потом везде указывается guide-id="charakteristics-kinds" и type-id="charakteristics-kinds")