Экспорт в YML (Ynadex Market XML) с помощью Views

Главные вкладки

Аватар пользователя karpov.anton karpov.anton 8 августа 2013 в 16:36

Приветствую всех.

В этой теме прошу помощи в попытке сделать полуавтоматический экспорт в файл поддерживаемый market.yandex.** (yml). По мотивам способа представленного здесь.

Что есть:

Drupal7+Commerce
Views
Views data export

Есть вьюха с дисплеем "Data Export" в формате вывода XML. У неё переопределен вывод стилей (XML выводится 3-мя частями - Header, Body и Footer).
В хедере переопределен вывод и прописаны Doctype и другие данные необходимые для маркета. Плюс програмно вставлена другая вьюха [источник], отвечающая за формирование категорий (...). Ниже код:

<?php
/**
 * file views-view-table.tpl.php
 * Template to display a view as a table.
 *
 * - $title : The title of this group of rows.  May be empty.
 * - $rows: An array of row items. Each row is an array of content
 *   keyed by field ID.
 * - $header: an array of headers(labels) for fields.
 * - $themed_rows: a array of rows with themed fields.
 * ingroup views_templates
 */

// Short tags act bad below in the html so we print it here.

print '<?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE yml_catalog SYSTEM "shops.dtd">
        <yml_catalog date=" ">
            <shop>
                <name>Имя магазина</name>
                <company>Компания</company>
                <url>http://mysite.com</url>
                <currencies>
                    <currency id="UAH" rate="1"/>
                </currencies>
                <categories>'
?>
                    <?php
  
// отображаем представление
  
print views_embed_view('yml_categories',$display_id='yml_cat');
  
// yml_categories - имя представления
  // yml_cat - идентификатор представления (внутреннее имя представления)
?>
                </categories>;

                <offers>?>

Темплейт Body тоже переопределен

Код:

<?php
/**
 * file views-view-table.tpl.php
 * Template to display a view as a table.
 *
 * - $title : The title of this group of rows.  May be empty.
 * - $rows: An array of row items. Each row is an array of content
 *   keyed by field ID.
 * - $header: an array of headers(labels) for fields.
 * - $themed_rows: a array of rows with themed fields.
 * ingroup views_templates
 */
?>
<?php 
foreach ($themed_rows as $count => $row): ?>
                    <<?php print 'offer available="true" id="Тут нужно отобразить ID товара"'?>>
<?php foreach ($row as $field => $content): ?>
                        <<?php print $xml_tag[$field]; ?>><?php print $content?></<?php print $xml_tag[$field]; ?>>
<?php endforeach; ?>
                    </<?php print 'offer' ?>>
<?php endforeach; ?>

Ну и Footer:

<?php
                
</offers>
            </
shop>
        </
yml_catalog>?>

В прикрепленном файле скрин текущего отображения файла.

C чем проблемы:
1. Не могу вывести значение поля в переопределенном шаблоне:

<?php<<?php print 'offer available="true" id="Тут нужно отобразить ID товара"'?>>?>

Поле загружается во вьюхе, (пробывал артикул [sku] и ID ноды [nid]), но вывести через шаблон не получилось...

Этот метод не получилось применить.
Это главная проблема, т.к. требуется выводить очень много подобных полей, вчастности полностью переопределенное представление категорий.

2. Вывод текущего времени/даты (на момент формирования) в шапке:

<?php<yml_catalog date="Текущая дата">?>

Это что касается вопросов.
Теперь оправдания:

PHP? - знаю ооочень поверхностно, учу, но пока недоучил до понимания решения этих задач, честно - недавно приступил к обучению, а времени на него не всегда хватает;
API Друпала? - попытался разобраться, и понял что без PHP не разберусь;
Заказать разработку модуля - со стыдом сознаюсь что не имею достаточного бюджета, потому и пытаюсь сделать все сам. Как только появится заработок - обязательно закажу профессиональное решение у спецов;
Почему Views? - с ним я умею работать, плюс есть необходимость делать дискрипшн из комбинаций разных полей. Есть необходимость создания разных прайсов с разными значениями цены, взятых с разных полей (отличных от поля "price").
Почему Data export? - умеет работать с большим количеством данных (batch);
Google? - был там, правда. Очень много тем - очень мало решений, решения своих не нашел, только по тому и создал эту тему.

Буду очень признателен за любую помощь и наводку на решения! Уверен что вопрос актуален для многих, т.к. это универсальное решение.

ВложениеРазмер
Иконка изображения tekushchee_otobrazhenie_predstavleniya.png6.43 КБ

Комментарии

Аватар пользователя deadie deadie 10 ноября 2016 в 20:44

Не знаю, поможет вам или нет...
Я не очень давно делал экспорт в XLS через PHPExcel и для данных о позициях заказа использовал вьюс с экспортом в json (брал данные через $obj = drupal_json_decode(views_embed_view(...)), ну и потом foreache'м разбор данных ($objRow['sku'], например).

Аватар пользователя Enemy Enemy 30 ноября 2016 в 20:44

<?php<<?php print 'offer available="true" id="'?><?php print $row["product_id"]; ?><?php print '"'?>>?>

Итог вот что примерно так:
views-data-export-xml-header--yml.tpl.php

<?php print '<?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE yml_catalog SYSTEM "shops.dtd">
        <yml_catalog date="'
?><?php echo date('Y-m-d h:i'); ?><?php print '">
            <shop>
                <name>123</name>
                <company>456</company>
                <url>http://123.ru</url>
                <currencies>
                    <currency id="RUB" rate="1"/>
                </currencies>
                <categories>
                </categories>
                <offers>'
?>

views-data-export-xml-body--yml.tpl.php

<?php foreach ($themed_rows as $count => $row): ?>
                    <<?php print 'offer available="true" id="'?><?php print $row["product_id"]; ?><?php print '"'?>>
<?php foreach ($row as $field => $content): ?>
                        <<?php print $xml_tag[$field]; ?>><?php print $content?></<?php print $xml_tag[$field]; ?>>
<?php endforeach; ?>
                    </<?php print 'offer' ?>>
<?php endforeach; ?>

?php print $row["product_id"]; ?> - добавляется поле референс ID product commerce

views-data-export-xml-footer--yml.tpl.php
<?php</offers></shop></yml_catalog>?>

Аватар пользователя Kirill-SPB Kirill-SPB 2 января 2017 в 23:53

Работает спасибо!! но у меня с id получилось так: <offer id="<?php print $row['sku']; ?>" available="<?php print $row['field_available']; ?>">
но вот не знаю как побороть еще пару косяков Sad
1. если в views отключить вывод sku и available, php их тоже не выводит, а с включенными полями идет дубль и у маркета ошибка

<offer id="17001" available="false">
                        <id>17001</id>
                        <available>false</available>

2. как убрать 00 у цены? commerce