Настройка экспорта в 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 перезаписывается.
В итоговом файле, значение элемента <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 > 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)">