Настройка экспорта в YML Яндекс-маркет
Для настройки экспорта в 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 указать идентификатор для этого поля.