Задача: добавить в экспорт каталога в формате Google Merchant Feed. Подробнее о спецификации.
Спецификация данных о товарах.
Статьи в вики справочнике UMI, которые могут пригодиться:
- Добавление нового формата экспорта данных
- Настройка экспорта в YML Яндекс-маркет
- Отключение экспорта виртуальных копий в YML
- Экспорт в YML списка объектов каталога
- В Шаблонах Данных в справочник Форматы Экспорта добавляем наименование. Произвольное название и идентификатор, например «FEED«.
- В директорию /classes/system/subsystems/export/exporters добавляем файл FEEDExporter.php
- Содержимое файла. Берем за основу например YMLExporter.php или catalogCommerceMLExporter.php
<?php
class FEEDExporter extends umiExporter {
public function setOutputBuffer() {
$buffer = outputBuffer::current('HTTPOutputBuffer');
$buffer->charset("utf-8");
$buffer->contentType("text/xml");
return $buffer;
}
public function export($branches, $excludedBranches) {
if (!count($branches)) {
$sel = new selector('pages');
$sel->where('hierarchy')->page(0)->childs(0);
$branches = $sel->result();
}
$exporter = new xmlExporter("FEED");
$exporter->addBranches($branches);
$exporter->setIgnoreRelations(array('guides'));
$exporter->excludeBranches($excludedBranches);
$result = $exporter->execute();
$umiDump = $result->saveXML();
$style_file = './xsl/export/' . $this->type . '.xsl';
if (!is_file($style_file)) {
throw new publicException("Can't load exporter {$style_file}");
}
$doc = new DOMDocument("1.0", "utf-8");
$doc->formatOutput = XML_FORMAT_OUTPUT;
$doc->loadXML($umiDump);
$templater = umiTemplater::create('XSLT', $style_file);
return $templater->parse($doc);
}
}
?>
4. В строках 3 и 18 используется идентификатор FEED из пункта 1
5. В директории /xsl/export создаем файл FEED.xsl Пример файла:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:g="http://base.google.com/ns/1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:php="http://php.net/xsl"
extension-element-prefixes="php"
exclude-result-prefixes="xsl php">
<xsl:output method="xml" encoding="utf-8"/>
<xsl:key name="property" match="/umidump/types/type[base/@module = 'catalog']//field" use="@id"/>
<xsl:template match="umidump[@version='2.0']">
<rss version="2.0">
<!-- <xsl:copy-of select="."/> --> <!-- Так можно увидеть входные данные -->
<channel>
<title>Магазин Номер 1</title>
<link>https://<xsl:value-of select="meta/domain"/>/</link> <!-- Домен -->
<xsl:apply-templates select="pages/page[basetype/@module = 'catalog' and basetype/@method = 'object' and @type-id='123']" mode="good-feed" /> <!-- Берем только композиции -->
</channel>
</rss>
</xsl:template>
<xsl:template match="page" mode="good-feed">
<xsl:param name="parent-id" select="@parentId" />
<xsl:param name="property" select="properties/group/property" />
<xsl:param name="id" select="@id"/>
<xsl:variable name="original-price" select="document(concat('udata://emarket/price/', $id))/udata/price/original" />
<xsl:variable name="price-old" select="$property[@name = 'price_old']/value" />
<xsl:variable name="price" select="round(document(concat('udata://emarket/price/', $id))/udata/price/actual)" />
<item>
<g:id><xsl:value-of select="$property[@name = 'artikul']/value" /></g:id> <!-- ID = артикул -->
<g:title><xsl:value-of select="name" /></g:title> <!-- Название товара -->
<g:description> <!-- Составное описание -->
<xsl:value-of select="name" />
<xsl:if test="$property[@name = 'cvet_proizvoditelya']/value">
<xsl:text> с цветом фасада </xsl:text><xsl:value-of select="$property[@name = 'cvet_proizvoditelya']/value"/>
</xsl:if>
<xsl:if test="$property[@name = 'material_fasada']/value/item/@name">
<xsl:text> выполнена из </xsl:text><xsl:value-of select="$property[@name = 'material_fasada']/value/item/@name"/>
</xsl:if>
<xsl:if test="$property[@name = 'cvet_korpusa_text']/value">
<xsl:text>. Цвет корпуса: </xsl:text><xsl:value-of select="$property[@name = 'cvet_korpusa_text']/value"/>
</xsl:if>
<xsl:if test="($property[@name = 'dlina']/value) or ($property[@name = 'vysota']/value) or ($property[@name = 'glubina']/value)">
<xsl:text>. Размеры: </xsl:text>
</xsl:if>
<xsl:if test="$property[@name = 'dlina']/value">
<xsl:value-of select="$property[@name = 'dlina']/value"/>
</xsl:if>
<xsl:if test="($property[@name = 'dlina']/value) and ($property[@name = 'vysota']/value)">
<xsl:text>x</xsl:text>
</xsl:if>
<xsl:if test="$property[@name = 'vysota']/value">
<xsl:value-of select="$property[@name = 'vysota']/value"/>
</xsl:if>
<xsl:if test="($property[@name = 'vysota']/value) and ($property[@name = 'glubina']/value)">
<xsl:text>x</xsl:text>
</xsl:if>
<xsl:if test="$property[@name = 'glubina']/value">
<xsl:value-of select="$property[@name = 'glubina']/value"/>
</xsl:if>
<xsl:if test="($property[@name = 'dlina']/value) or ($property[@name = 'vysota']/value) or ($property[@name = 'glubina']/value)">
<xsl:text>мм.</xsl:text>
</xsl:if>
</g:description>
<xsl:apply-templates select="/umidump/pages/page[@id = $parent-id and basetype/@module = 'catalog' and basetype/@method = 'category']" mode="goods" /> <!-- Продуктовая категория -->
<g:link><xsl:value-of select="concat('https://', /umidump/meta/domain, @link)" /></g:link> <!-- Ссылка на товар -->
<g:condition>new</g:condition> <!-- Товар не бу -->
<xsl:choose> <!-- Цена и валюта -->
<xsl:when test="$price-old > 0">
<g:price><xsl:value-of select="$price-old" /> RUB</g:price>
<g:sale_price><xsl:value-of select="$price" /> RUB</g:sale_price>
</xsl:when>
<xsl:when test="($price-old = 0) and ($original-price > $price)">
<g:price><xsl:value-of select="$original-price" /> RUB</g:price>
<g:sale_price><xsl:value-of select="$price" /> RUB</g:sale_price>
</xsl:when>
<xsl:when test="not($price-old) and ($original-price > $price)">
<g:price><xsl:value-of select="$original-price" /> RUB</g:price>
<g:sale_price><xsl:value-of select="$price" /> RUB</g:sale_price>
</xsl:when>
<xsl:otherwise>
<g:price><xsl:value-of select="$price" /> RUB</g:price>
</xsl:otherwise>
</xsl:choose>
<g:availability>in stock</g:availability> <!-- В наличии -->
<g:image_link><xsl:value-of select="concat('https://', /umidump/meta/domain, $property[@name = 'photo']/value)" /></g:image_link> <!-- Картинка -->
<!-- Доп. Картинки -->
<xsl:if test="$property[@name = 'photo1']">
<g:additional_image_link><xsl:value-of select="concat('https://', /umidump/meta/domain, $property[@name = 'photo1']/value)" /></g:additional_image_link>
</xsl:if>
<xsl:if test="$property[@name = 'photo2']">
<g:additional_image_link><xsl:value-of select="concat('https://', /umidump/meta/domain, $property[@name = 'photo2']/value)" /></g:additional_image_link>
</xsl:if>
<xsl:if test="$property[@name = 'photo3']">
<g:additional_image_link><xsl:value-of select="concat('https://', /umidump/meta/domain, $property[@name = 'photo3']/value)" /></g:additional_image_link>
</xsl:if>
<xsl:if test="$property[@name = 'photo4']">
<g:additional_image_link><xsl:value-of select="concat('https://', /umidump/meta/domain, $property[@name = 'photo4']/value)" /></g:additional_image_link>
</xsl:if>
<xsl:if test="$property[@name = 'brand']">
<g:brand><xsl:value-of select="$property[@name = 'brand']/value/item/@name"/></g:brand>
</xsl:if>
<g:identifier_exists>нет</g:identifier_exists> <!-- Нет цифрового кода -->
<g:material><xsl:value-of select="$property[@name = 'material_fasada']/value/item/@name"/></g:material> <!-- Материал -->
<g:color><xsl:value-of select="$property[@name = 'cvet_proizvoditelya']/value"/></g:color> <!-- Цвет -->
<g:size> <!-- Размер -->
<xsl:if test="$property[@name = 'dlina']/value">
<xsl:value-of select="$property[@name = 'dlina']/value"/>
</xsl:if>
<xsl:if test="($property[@name = 'dlina']/value) and ($property[@name = 'vysota']/value)">
<xsl:text>x</xsl:text>
</xsl:if>
<xsl:if test="$property[@name = 'vysota']/value">
<xsl:value-of select="$property[@name = 'vysota']/value"/>
</xsl:if>
<xsl:if test="($property[@name = 'vysota']/value) and ($property[@name = 'glubina']/value)">
<xsl:text>x</xsl:text>
</xsl:if>
<xsl:if test="$property[@name = 'glubina']/value">
<xsl:value-of select="$property[@name = 'glubina']/value"/>
</xsl:if>
<xsl:if test="($property[@name = 'dlina']/value) or ($property[@name = 'vysota']/value) or ($property[@name = 'glubina']/value)">
<xsl:text>мм.</xsl:text>
</xsl:if>
</g:size>
<xsl:if test="$property[@name = 'weight']">
<g:shipping_weight><xsl:value-of select="$property[@name = 'weight']/value"/> kg</g:shipping_weight> <!-- Вес -->
</xsl:if>
</item>
</xsl:template>
<xsl:template match="page" mode="goods">
<xsl:param name="parent-id" select="@parentId" />
<xsl:if test="document(concat('upage://', $parent-id))//property[@name='google_product_category']/value">
<!-- Вывод цифрового ID категории товаров из файла http://www.google.com/basepages/producttype/taxonomy-with-ids.ru-RU.xls -->
<g:google_product_category><xsl:value-of select="document(concat('upage://', $parent-id))//property[@name='google_product_category']/value" /></g:google_product_category>
<!-- Тип товара. Полезен для назначения ставок -->
<g:product_type>Главная > <xsl:value-of select="document(concat('upage://', $parent-id))/udata/page/name" /> > <xsl:value-of select="name" /></g:product_type>
</xsl:if>
</xsl:template>
<!-- -->
<xsl:template match="umidump">
<error>Unknown umidump version</error>
</xsl:template>
</xsl:stylesheet>
6. Создаем новый экспорт в админке.
7. Запускаем экспорт и проверяем полученный файл в отладчике фидов

Александр
Спасибо! очень помогло!