Настройка экспорта в YML Яндекс-маркет — различия между версиями
VITL' (обсуждение | вклад)  | 
				Stexe (обсуждение | вклад)   | 
				||
| (не показано 5 промежуточных версий 3 участников) | |||
| Строка 12: | Строка 12: | ||
Основным шаблоном формирования XML-файла для Яндекс-маркета является xsl/export/YML.xsl. Если необходимо изменить формирование итогового файла, то необходимо переназначать существующие шаблоны из оригинального файла, записывая их в xsl/export/custom/YML.xsl. При обновлении сайта шаблон xsl/export/YML.xsl перезаписывается.  | Основным шаблоном формирования XML-файла для Яндекс-маркета является xsl/export/YML.xsl. Если необходимо изменить формирование итогового файла, то необходимо переназначать существующие шаблоны из оригинального файла, записывая их в xsl/export/custom/YML.xsl. При обновлении сайта шаблон xsl/export/YML.xsl перезаписывается.  | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
Одной из основных настроек которую требуется сделать, это исключить из экспорта неактивные объекты каталога в UMI.CMS, по мимо этого можно также исключить объекты каталога, которые находятся в неактивном разделе, но сами они могут быть активными.  | Одной из основных настроек которую требуется сделать, это исключить из экспорта неактивные объекты каталога в UMI.CMS, по мимо этого можно также исключить объекты каталога, которые находятся в неактивном разделе, но сами они могут быть активными.  | ||
| Строка 165: | Строка 155: | ||
</pre>  | </pre>  | ||
служат для проверки поля типа чекбокс, с идентификатором 'dvd', в случае если чекбокс установлен, будет выведено название данного поля.  | служат для проверки поля типа чекбокс, с идентификатором 'dvd', в случае если чекбокс установлен, будет выведено название данного поля.  | ||
| + | |||
| + | |||
| + | |||
| + | '''Отключение экспорта определенных товаров.'''  | ||
| + | |||
| + | Если необходимо исключить из выгрузки в YML определенные товары, то можно воспользоваться описанной ниже схемой.  | ||
| + | В модуле "Шаблоны данных", в вашем типе данных объекта каталога, допустим в группе полей "Ценовые свойства", добавляется  | ||
| + | поле "Не выгружать в YML" со строковым идентификатором 'nonyml' и типом "Кнопка-флажок". Далее для нужных объектов  | ||
| + | каталога, устанавливаем данный чек-бокс. Также необходимо изменить шаблон:  | ||
| + | <pre>  | ||
| + | <xsl:template match="page[basetype/@method = 'object']">  | ||
| + | </pre>  | ||
| + | в файле:  | ||
| + | <pre>  | ||
| + | xsl/export/custom/YML.xsl  | ||
| + | </pre>  | ||
| + | в самом начале шаблона, необходимо прописать параметр nonyml:  | ||
| + | <pre>  | ||
| + | <xsl:param name="nonyml" select="properties/group[@name = 'cenovye_svojstva']/property[@name = 'nonyml']/value" />  | ||
| + | </pre>  | ||
| + | и изменить if условие, т.е. добавить проверку по чекбоксу "Не выгружать в YML" :  | ||
| + | <pre>  | ||
| + | <xsl:if test="$price > 0 and not($nonyml)">  | ||
| + | </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-файле цена будет указана со скидкой.  | ||
| + | |||
| + | |||
| + | |||
| + | '''Произвольный товар (vendor.model)'''  | ||
| + | |||
| + | Если необходимо использовать схему '''vendor.model''', о которой более подробно рассказано на [http://help.yandex.ru/partnermarket/?id=1111483 help.yandex.ru] , то в файле '''\xsl\export\custom\YML.xsl''', в шаблоне:  | ||
| + | <source lang="xml">  | ||
| + | <xsl:template match="page[basetype/@method = 'object']">  | ||
| + | ...  | ||
| + | </xsl:template>  | ||
| + | </source>  | ||
| + | |||
| + | необходимо в блоке:  | ||
| + | <source lang="xml">  | ||
| + | <xsl:when test=".//property[@name = $vendor]/value != '' and .//property[@name = $model]/value != ''">  | ||
| + |   <xsl:attribute name="type">vendor.model</xsl:attribute>  | ||
| + | </xsl:when>  | ||
| + | </source>  | ||
| + | |||
| + | указать строковые идентификаторы полей для '''vendor''' и '''model''', в вашем объекте каталога на сайте, к примеру:  | ||
| + | <source lang="xml">  | ||
| + |   <xsl:when test=".//property[@name = 'vendor_object']/value != '' and .//property[@name = 'model_object']/value != ''">  | ||
| + |   <xsl:attribute name="type">vendor.model</xsl:attribute>  | ||
| + | </xsl:when>  | ||
| + | </source>  | ||
| + | |||
| + | на вашем сайте, строковые идентификаторы скорее всего другие, поэтому проверьте это.  | ||
| + | Далее, в блоке:  | ||
| + | <source lang="xml">  | ||
| + | <xsl:when test="(.//property[@name = $vendor]/value != '') and (.//property[@name = $model]/value != '')">  | ||
| + |   <xsl:if test=".//property[@name = $typePrefix]/value != ''">  | ||
| + | 	<typePrefix><xsl:value-of select=".//property[@name = $typePrefix]/value"/></typePrefix>  | ||
| + |   </xsl:if>  | ||
| + |   <vendor><xsl:value-of select=".//property[@name = $vendor]/value"/></vendor>  | ||
| + |   <model><xsl:value-of select=".//property[@name = $model]/value"/></model>  | ||
| + | </xsl:when>  | ||
| + | </source>  | ||
| + | |||
| + | необходимо еще раз заменить переменные $vendor и $model на строковые идентификаторы. В случае, если хотите указать также узел:  | ||
| + | <source lang="xml">  | ||
| + | <typePrefix>Принтер</typePrefix>  | ||
| + | </source>  | ||
| + | |||
| + | то необходимо вместо '''$typePrefix''' указать идентификатор для этого поля.  | ||
| + | [[Категория:Модуль Обмен данными]]  | ||
Текущая версия на 11:16, 1 июня 2014
Для настройки экспорта в 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 перезаписывается.
Одной из основных настроек которую требуется сделать, это исключить из экспорта неактивные объекты каталога в 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 > 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-файле цена будет указана со скидкой.
Произвольный товар (vendor.model)
Если необходимо использовать схему vendor.model, о которой более подробно рассказано на help.yandex.ru , то в файле \xsl\export\custom\YML.xsl, в шаблоне:
<xsl:template match="page[basetype/@method = 'object']">
...
</xsl:template>
необходимо в блоке:
<xsl:when test=".//property[@name = $vendor]/value != '' and .//property[@name = $model]/value != ''">
  <xsl:attribute name="type">vendor.model</xsl:attribute>
</xsl:when>
указать строковые идентификаторы полей для vendor и model, в вашем объекте каталога на сайте, к примеру:
  <xsl:when test=".//property[@name = 'vendor_object']/value != '' and .//property[@name = 'model_object']/value != ''">
  <xsl:attribute name="type">vendor.model</xsl:attribute>
</xsl:when>
на вашем сайте, строковые идентификаторы скорее всего другие, поэтому проверьте это. Далее, в блоке:
<xsl:when test="(.//property[@name = $vendor]/value != '') and (.//property[@name = $model]/value != '')">
  <xsl:if test=".//property[@name = $typePrefix]/value != ''">
	<typePrefix><xsl:value-of select=".//property[@name = $typePrefix]/value"/></typePrefix>
  </xsl:if>
  <vendor><xsl:value-of select=".//property[@name = $vendor]/value"/></vendor>
  <model><xsl:value-of select=".//property[@name = $model]/value"/></model>
</xsl:when>
необходимо еще раз заменить переменные $vendor и $model на строковые идентификаторы. В случае, если хотите указать также узел:
<typePrefix>Принтер</typePrefix>
то необходимо вместо $typePrefix указать идентификатор для этого поля.