Настройка экспорта в YML Яндекс-маркет — различия между версиями

Материал из Umicms
Перейти к:навигация, поиск
Строка 186: Строка 186:
 
<xsl:if test="$price &gt; 0 and not($nonyml)">
 
<xsl:if test="$price &gt; 0 and not($nonyml)">
 
</pre>
 
</pre>
 +
 +
 +
 +
Если на сайте планируется использование скидок, то в начале шаблона:
 +
<pre>
 +
<xsl:template match="page[basetype/@method = 'object']">
 +
...
 +
</xsl:template>
 +
</pre>
 +
необходимо вместо стандартного параметра 'price' прописать:
 +
<source lang=xml>
 +
<xsl:param name="price" select="document(concat('udata://emarket/price/', @id, '/0/0'))/udata/price/actual" />
 +
</source>
 +
 +
Тогда в YML-файле цена будет указана со скидкой.

Версия 19:44, 21 февраля 2011

Для настройки экспорта в YML, первое что необходимо сделать, это в модуле "Обмен данными", во вкладке "Экспорт" создать сценарий экспорта, указав формат экспорта: "Каталог в формате Яндекс-маркет(yml)", также указав разделы каталога, которые необходимо экспортировать. Произведя экспорт в YML и указав вариант "Получить ссылку на результат экспорта", мы указываем полученную ссылку в аккаунте Яндекс-Маркета, ссылка примерно следующего вида:

_http://ваш_сайт/admin/exchange/get_export/27697/?as_file=0

Также указываем логин/пароль пользователя, у которого в настройках, для блока "Обмен данными" стоит галка "Доступ к экспорту данных по http", либо можно просто для пользователя "Гость" поставить эту галку, тогда логин/пароль не надо будет указывать.

В настройках сценария экспорта можно прописать значение для параметра "Время кэширования результатов экспорта (в минутах)", это будет означать, что в течении времени между первым экспортом данных (time = X) и временем X+указанное_значение, данные будут браться из кэша, допустим из файла sys-temp/export/27697.xml. Каждый раз новый файл с данными формироваться не будет, т.е. необходимо учитывать, что при изменении цены товара на сайте, может возникнуть момент, что в Яндекс-маркет не сразу поступят обновленные данные, когда он их будет запрашивать по ссылке.

Теперь перейдем к настройкам формирования самого XML-файла для Яндекс-Маркета, ознакомиться с форматом YML, его требованиями, можно на данной странице: Описание формата данных YML

Основным шаблоном формирования XML-файла для Яндекс-маркета является xsl/export/YML.xsl. Если необходимо изменить формирование итогового файла, то необходимо переназначать существующие шаблоны из оригинального файла, записывая их в xsl/export/custom/YML.xsl. При обновлении сайта шаблон xsl/export/YML.xsl перезаписывается.

В итоговом файле, значение элемента <name> берется из первой вкладки модуля "Конфигурация", поле "Название сайта". У Яндекс-Маркета требование к этому полю, оно не должно быть длиной более 20 символов. В случаи надобности можно шаблон:

<xsl:template match="umidump[@version='2.0']">
...
</xsl:template>

скопировать в файл xsl/export/custom/YML.xsl, в основной узел "stylesheet", и уже там вручную прописать значение элемента <name>:

<name><xsl:value-of select="meta/site-name" /></name>

Одной из основных настроек которую требуется сделать, это исключить из экспорта неактивные объекты каталога в UMI.CMS, по мимо этого можно также исключить объекты каталога, которые находятся в неактивном разделе, но сами они могут быть активными. Для этого скопируем шаблон:

<xsl:template match="page[basetype/@method = 'object']">  
...
</xsl:template>

в файл xsl/export/custom/YML.xsl, в основной узел stylesheet. Можно скопировать целиком или только те элементы, которые вы используете. Для примера рассмотрим следующий шаблон:

<?xml version="1.0" encoding="UTF-8"?>
<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="page[basetype/@method = 'object']">
    <xsl:param name="price" select="number(.//property[@name = 'price']/value)" />
    <xsl:param name="parentactive" select="document(concat('upage://',@parentId))/udata/page/@is-active" />
    <xsl:if test="$price &gt; 0 and $parentactive = '1'">
      <offer>
        <xsl:attribute name="available">
          <xsl:text>true</xsl:text>
        </xsl:attribute>
        <url>
          <xsl:value-of select="concat('http://', /umidump/meta/domain, @link)" />
        </url>
        <price>
          <xsl:value-of select="$price"/>
        </price>
        <currencyId>
          <xsl:choose>
            <xsl:when test="string-length($default-currency)">
              <xsl:value-of select="$default-currency" />
            </xsl:when>
            <xsl:otherwise>RUR</xsl:otherwise>
          </xsl:choose>
        </currencyId>
        <categoryId>
          <xsl:value-of select="@parentId"/>
        </categoryId>
        <xsl:if test=".//property[@name = 'image']/value != ''">
          <picture>
            <xsl:value-of select="concat('http://', /umidump/meta/domain, .//property[@name = 'image']/value)"/>
          </picture>
        </xsl:if>
        <delivery>true</delivery>
        <name>
          <xsl:value-of select="name"/>
        </name>
        <description>
          <xsl:value-of select="properties/group/property[@name = 'opisanie']/value"/>Цвет:
          <xsl:value-of select="properties/group/property[@name = 'vid']/value/item/@name" />; Вес:
          <xsl:value-of select="properties/group/property[@name = 'ves']/value" />;
          <xsl:apply-templates select="properties/group/property[@name = 'dvd']" />
        </description>
      </offer>
    </xsl:if>
  </xsl:template>

  <xsl:template match="property[value = '1']">
    <xsl:value-of select="title" />;
  </xsl:template>

  <xsl:template match="page[basetype/@method = 'object'][not(@is-active)]"></xsl:template>

</xsl:stylesheet>

в его начало мы добавили параметр:

<xsl:param name="parentactive" select="document(concat('upage://',@parentId))/udata/page/@is-active" />

и изменили следующий за ним if, т.е. добавили проверку на активность раздела в котором находится объект. Экспорт неактивных объектов был исключен добавление шаблона:

<xsl:template match="page[basetype/@method = 'object'][not(@is-active)]"></xsl:template>

В данном примере считается, что в административной части нигде не указывается, сколько единиц того или иного товара осталось на складе, поэтому конструкция:

<xsl:attribute name="available">
 <xsl:choose>
  <xsl:when test=".//property[@name = 'common_quantity']/value > 0"><xsl:text>true</xsl:text></xsl:when>
 <xsl:otherwise><xsl:text>false</xsl:text></xsl:otherwise>
 </xsl:choose>
</xsl:attribute> 

была заменена на:

<xsl:attribute name="available">
    <xsl:text>true</xsl:text>
</xsl:attribute>

Т.к. поле с изображением товара, в данном примере, имеет идентификатор image, то конструкция:

<xsl:if test=".//property[@name = 'photo']/value != ''">
 <picture>
   <xsl:value-of select="concat('http://', /umidump/meta/domain, .//property[@name = 'photo']/value)"/>
 </picture>
 </xsl:if>

была заменена на:

<xsl:if test=".//property[@name = 'image']/value != ''">
 <picture>
  <xsl:value-of select="concat('http://', /umidump/meta/domain, .//property[@name = 'image']/value)"/>
 </picture>
</xsl:if>

С учетом того, что доставка имеется, была добавлена строка:

<delivery>true</delivery>

Блок описание (<description >) был оформлен следующим образом:

<description>
        <xsl:value-of select="properties/group/property[@name = 'opisanie']/value"/>
        Цвет: <xsl:value-of select="properties/group/property[@name = 'vid']/value/item/@name" />;
        Вес: <xsl:value-of select="properties/group/property[@name = 'ves']/value" />;
        <xsl:apply-templates select="properties/group/property[@name = 'dvd']" />
<description>

Поле Цвет имеет тип "Выпадающий список", поле Вес – "Строка". Для понимания запросов с помощью которых берутся те или иные значения, необходимо иметь представление об XSLT. UMI.CMS формирует XML-Данные в формате UMIDump2.0, с помощью нашего XSL-Шаблона мы трансформируем один XML-Файл в другой. Узел <page> в UMIDump, практически идентичен xml-данным полученным следующим образом: _http://ваш_сайт/upage/47 , используется протокол upage

Данный вызов:

<xsl:apply-templates select="properties/group/property[@name = 'dvd']" />

и сам шаблон:

<xsl:template match="property[value = '1']">
	<xsl:value-of select="title" />;
</xsl:template>

служат для проверки поля типа чекбокс, с идентификатором 'dvd', в случае если чекбокс установлен, будет выведено название данного поля.


Если необходимо исключить из выгрузки в YML определенные товары, то можно воспользоваться описанной ниже схемой. В модуле "Шаблоны данных", в вашем типе данных объекта каталога, допустим в группе полей "Ценовые свойства", добавляется поле "Не выгружать в YML" со строковым идентификатором 'nonyml' и типом "Кнопка-флажок". Далее для нужных объектов каталога, устанавливаем данный чек-бокс. Также необходимо изменить шаблон:

<xsl:template match="page[basetype/@method = 'object']">

в файле:

xsl/export/custom/YML.xsl

в самом начале шаблона, необходимо прописать параметр nonyml:

<xsl:param name="nonyml" select="properties/group[@name = 'cenovye_svojstva']/property[@name = 'nonyml']/value" />

и изменить if условие, т.е. добавить проверку по чекбоксу "Не выгружать в YML" :

<xsl:if test="$price > 0 and not($nonyml)">


Если на сайте планируется использование скидок, то в начале шаблона:

<xsl:template match="page[basetype/@method = 'object']">
...
</xsl:template>

необходимо вместо стандартного параметра 'price' прописать:

<xsl:param name="price" select="document(concat('udata://emarket/price/', @id, '/0/0'))/udata/price/actual" />

Тогда в YML-файле цена будет указана со скидкой.