Новый модуль для экспорта в Yandex Market (views плагин)
Прислано: trashgenerator
чт, 06/05/2010 - 22:26
Месяц назад написал модуль для интеграции друпала с Яндекс маркетом. Его долго не могли проаппрувить в оффициальный репозиторий, потом у меня долго не доходили руки его туда залить. И вот наконец это свершилось.
Модуль выполнен в качестве плагина для Views. То есть Вы абсолютно свободны в выборе и создании полей для экспорта. Вы добавляете любые фильтры, аргументы и поля. Потом в настройках views стиля указываете какие views поля должны отображаться для каких yml полей. Подробности в readme.txt
Прошу любить и жаловать. А так же критиковать и багрепортить.
P.S. обнаружил, что буквально на днях был создан модуль, предназначенный для тех же целей http://docs.drupal.ru/node/43738
Модули все таки получились очень разные, с разными стратегиями и способами достижения поставленной цели. Так что смотрите оба и выбирайте более подходящее лично для Вас.
- trashgenerator's blog
- Для комментирования войдите или зарегистрируйтесь
у вас ссылочка кривая на модуль, коллега :) когда используете кнопку "ссылка на модуль", надо писать только название, без предшествующих drupal.org/...
- Для комментирования войдите или зарегистрируйтесь
попробовал, судя по настройкам круто и гибче чем мое, но какие-то проблемы с подхватом views style (views 2.5):
в списке доступных стилей не видно.
Ну и не работает совсем :)

- Для комментирования войдите или зарегистрируйтесь
Пост стоит подправить (ссылку)
Теперь осталось импорт написать :)
- Для комментирования войдите или зарегистрируйтесь
Ссылка так и осталась кривой :(
Завел http://drupal.org/node/801502 - предлагаю обсудить импорт данных
На вскидку парсеры:
1) dom - уж очень ресурсоемок, для больших файлов хз сколько памяти нужно дават для php
2) simplexml - весьма тормознут
В обоих вариантах нужно задирать время выполнения скрипта или обрабоатывать в batch процессе
Неплохо продумать UI для отбора хотя бы нужных категорий
- Для комментирования войдите или зарегистрируйтесь
Я вот тут призадумался: если яша тянет каждый час yml-файл,а всем известны аппетиты вьюсов, то не откинет ли копыта весь сайт?
Кэширование встроенными средствами видов скажем на день - поможет ли?
- Для комментирования войдите или зарегистрируйтесь
Неплохо продумать UI для отбора хотя бы нужных категорий
Так там стандартный фильтр можно прикрутить, с указанием глубины категорий. Или я чего не понял?
- Для комментирования войдите или зарегистрируйтесь
А можно подробнее об аппетитах views? views UI для начала не пробовали отключить и руками управлять кешированием результатов?
PS: яша тянет файл как анонимный пользователь, так что получает почти статику... boost cacherouter...
- Для комментирования войдите или зарегистрируйтесь
импорт у меня уже готов в принципе, не на ya.market но на близкий по сути сайт, на simplexml - и реально на файлах больше 5 метров сайт валяется. Сначала переписал на simplexml+batchapi, один фиг.
Надо делать на sax+batchapi - как я понял это единственный вариант для больших файлов импорта.
( xslt_set_sax_handlers )
если на других модулях делать, то http://drupal.org/project/feeds а не FeedAPI наверно.
- Для комментирования войдите или зарегистрируйтесь
а разве стандартный
drupal_xml_parser_create() не sax пользуется?
xml_parser_create()
У меня именно на больших объемах затык и получается, про sax забыл, так что большое спасибо за напоминание!
Таким образом можно обойтись без промежуточного хранилища:
1) подгружаем внешний файл
2) парсим только категории
3) в неком ui отбираем нужные для импорта
4) стартуем batch импорта
- Для комментирования войдите или зарегистрируйтесь
поковырялся еще вчера, почитал, вообщем если >=php5.1, оптимальный вариант это XMLReader.
sax вроде как равный по эффективности, но устаревший что ли.
а разве стандартный drupal_xml_parser_create() не sax пользуется? xml_parser_create()
а хз, по-моему все равно что юзать, главное xml целиком в память не загружать, например как это делает xml_parse_into_struct или SimpleXML
вынес в итоге свой импорт в отдельный import.php, простейший ручной аналог BatchAPI + XMLReader ( http://ru.php.net/xmlreader ) + скачивание файла сменил с drupal_http_request на fopen с записыванием буфера сразу в файл, по сравнению с SimpleXML эта связка раз в 10 быстрее на глаз и память не жрет, 20 метров xml не страшны (код специфичный, поэтому не выкладываю)

- Для комментирования войдите или зарегистрируйтесь
XMLReader
Спасибо за направление, будем копать...
- Для комментирования войдите или зарегистрируйтесь
sax вроде как равный по эффективности, но устаревший что ли.
это 2 разных подхода...
- Для комментирования войдите или зарегистрируйтесь
а данный модуль всеж таки работает?
у меня нет в списках стилей, стиля Я-маркет
- Для комментирования войдите или зарегистрируйтесь
Я пользуюсь
yml_export - работает.
- Для комментирования войдите или зарегистрируйтесь
модуль не верно генерит порядок вывода переменных в xml
- Для комментирования войдите или зарегистрируйтесь
Спасибо за модуль.
Столкнулся с проблемой:
При выборе
type="vendor.model"
Яндекс не вопринимает поля name, description, delivery
Если этих полей нет, то YML-файл принимается системой.
Но как тогда добавить описание товара description?
Пример:
<offer id="5" available="true" type="vendor.model" > <url>http://safe24.ru/catalog/kartoteki-seriya-afc-standart-a4a5a6/shkaf-kartotechnyi-afc-2</url> <price>5120</price> <currencyId>RUR</currencyId> <categoryId>6</categoryId> <picture>http://safe24.ru/files/AFC02.jpg</picture> <typePrefix>Картотеки серия AFC (стандарт, А4,A5,A6)</typePrefix> <vendor></vendor> <model>Шкаф картотечный AFC-2</model> <name>Шкаф картотечный AFC-2</name> <manufacturer_warranty>true</manufacturer_warranty> <country_of_origin>Россия</country_of_origin> </offer> Определена кодировка: utf-8 (строка 0, столбец 0) Дата из файла: 2010-08-27 11:06 (строка 3, столбец 113) [2010-08-27 11:06:05] (Fatal) [80:13] (Fatal) 521 Error parsing XML feed: Element 'name' is not valid for content model: '(url,buyurl?,price,wprice?,currencyId,xCategory?,categoryId+,picture?,delivery?,deliveryIncluded?,local_delivery_cost?,orderingTime?,((typePrefix?,vendor,vendorCode?,model,((provider,tarifplan?))?)|(author?,name,publisher?,series?,year?,ISBN?,volume?,part?,language?,binding?,page_extent?,table_of_contents?)|(author?,name,publisher?,series?,year?,ISBN?,volume?,part?,language?,table_of_contents?,performed_by?,performance_type?,storage?,format?,recording_length?)|(artist?,title,year?,media?,starring?,director?,originalName?,country?)|(worldRegion?,country?,region?,days,dataTour*,name,hotel_stars?,room?,meal?,included,transport,price_min?,price_max?,options?)|(name,place,hall?,hall_part?,date,is_premiere?,is_kids?)|(name,vendor?,vendorCode?)),aliases?,additional*,description?,sales_notes?,promo?,manufacturer_warranty?,country_of_origin?,downloadable?,adult?,barcode*,param*)'
Если type="vendor.model" - отсутствует, то Яндекс принимает файл.
Но в настройках модуля этот параметр убрать нельзя.
Помогите пожалуйста.
- Для комментирования войдите или зарегистрируйтесь
Там в описании есть маленькая неточность: вначале создается Page with no layout а только после этого появляется Style: yandexmarket - с этим разобрался, далее произвожу настройку в соответствии с инструкцией но при обращении к site.name/yandexmarket получаю "Запрашиваемая страница не найдена"
- Для комментирования войдите или зарегистрируйтесь
Все баги пишите на орг в багтреккер.
1) Автору доп мотивация
2) Там удобнее отслеживать
Я переписывался с автором некоторое время назад, очень отзывчивый человек. Но писать нужно на орг
- Для комментирования войдите или зарегистрируйтесь
Пишу сюда, так как на drupal.org затык с аккаунтом.
Все делаю как в readme.txt
На выходе пустая страница.
такой код:
<html debug="true"> <head/> <body> </body> </html>
В "Тема оформления":
Стиль вывода: yandexmarket.tpl.php (Файл не найден в папке sites/all/modules/yandexmarket/theme/), yandexmarket--custom-yandexmarket.tpl.php, yandexmarket--default.tpl.php, yandexmarket--custom-yandexmarket--default.tpl.php
- Для комментирования войдите или зарегистрируйтесь
Спасибо за модуль.
Яндекс не вопринимает поля name, description, delivery
Убрал эти поля name, description, delivery из views.
Переписка с Яндексом о несоответствии в их документации ничего не дала.
- Для комментирования войдите или зарегистрируйтесь
Суть проблемы сводиться к:
Фатальная ошибка: Ошибка парсинга XML: Error parsing XML feed: Element 'delivery' is not valid for content model:
Судя по камментам в инете это из-за обязательного аттрибута 'type'.
Камменты тут:
Внимательно смотрим на этот ответ: "В файле не соблюдается верный порядок тегов.
Тег <delivery>false</delivery> должен следовать за тегом <picture>"
И это при условии что стоит тег "type".
Однако у маркета есть вариант когда атрибут type="vendor.model" необязательный. Смотреть тут
Предлагается убрать обязательность тега "type"
Есть альтернативный, как я понимаю вариант, правильно указать порядок тегов как указано в ответе:
'(url?,buyurl?,price,wprice?,currencyId,xCategory?,categoryId+,picture?,store?,pickup?,delivery?,deliveryIncluded?,local_delivery_cost?,orderingTime?,((typePrefix?,vendor,vendorCode?,model,((provider,tarifplan?))?)|(author?,name,publisher?,series?,year?,ISBN?,volume?,part?,language?,binding?,page_extent?,table_of_contents?)|(author?,name,publisher?,series?,year?,ISBN?,volume?,part?,language?,table_of_contents?,performed_by?,performance_type?,storage?,format?,recording_length?)|(artist?,title,year?,media?,starring?,director?,originalName?,country?)|(worldRegion?,country?,region?,days,dataTour*,name,hotel_stars?,room?,meal?,included,transport,price_min?,price_max?,options?)|(name,place,hall?,hall_part?,date,is_premiere?,is_kids?)|(name,vendor?,vendorCode?)),aliases?,additional*,description?,sales_notes?,promo?,manufacturer_warranty?,country_of_origin?,downloadable?,adult?,barcode*,param*)'
- Для комментирования войдите или зарегистрируйтесь
Да, поддерживаю. Просьба к автору модуля: уберите обязательность тега "type"
- Для комментирования войдите или зарегистрируйтесь
Я тоже наткнулся на ту же проблему: не удается включить в YML файл элемент 'delivery'.
Нужно, насколько я понимаю, поставить тег 'delivery' после тега 'picture'.
Нашел ли кто-нибудь способ это сделать?
- Для комментирования войдите или зарегистрируйтесь
У меня такая же проблема.
Вам удалось найти способ переставить тег 'delivery' в нужное положение?
И еще, если можно, посоветуйте вот что: какое именно поле вы вставляете в этот тег?
Я создал товарам дополнительное поле со значениями true / false.
В самой Ubercart присутствует чекбокс "Для данного товара и всех производных от него поддерживается доставка", но я не нашел способа увидеть его значение в представлении Yandexmarket, да и не уверен, честно говоря, что это то, что нужно.
А как делаете вы? Посоветуйте пожалуйста.
- Для комментирования войдите или зарегистрируйтесь
Предлагаю моё решение: Парсить вывод и удалять ненужный атрибут таки макаром (это файлег ym.sh):
wget -O - -q -t 1 http://<сайтец>/yandexmarket | sed 's/ type="vendor.model"//' > ./y-auto.yml
, здесь http://<сайтец>/yandexmarket - урл с выгрузкой для маркета
sed 's/ type="vendor.model"//' - часть что вырезает ненужный атрибут
./y-auto.yml - файл выложенный на сайте для яндекс бота.
Прописываем в кроне:
*/10 * * * * ./ym.sh
Таким образом каждые десять минут на сайте появляется статичный файл с текущими данными сайта и валидный к тому же. К тому же бот яндекса не будет непонятно когда нагружать сервак своими запросами... Хотя он канечна не так часто нагружает.
- Для комментирования войдите или зарегистрируйтесь
Спасибо!
Надежное и изящное решение!
Я тоже думал о чем-то подобном, но собирался не убирать атрибут vendor.model, а перловым скриптом переставлять тег на нужное место.
Не очень красиво, конечно, хотелось бы оставаться в рамках Друпала а не дополнять его палками-веревками, но видимо без этого не обойтись.
Видимо буду делать так как вы.
Спасибо!
- Для комментирования войдите или зарегистрируйтесь
Дорабатывал скрипт для своего магазина, может кому пригодится.
Поправил yandexmarket.module а именно порядок вывода (он правится именно в файле модуля)
<?php
function yandexmarket_offertags($type = FALSE) {
$general = array('url', 'price', 'currencyId', 'categoryId', 'picture');
$yandexmarket_offertags['vendor.model'] = array_merge($general, array('typePrefix',
'model', 'delivery', 'local_delivery_cost', 'name', 'vendor', 'vendorCode', 'description',
'sales_notes', 'manufacturer_warranty', 'country_of_origin', 'downloadable'));
$yandexmarket_offertags['book'] = array_merge($general, array('author', 'name',
'publisher', 'series', 'year', 'ISBN', 'description', 'volume', 'part', 'language', 'binding', 'page_extent',
'table_of_contents'));
$yandexmarket_offertags['audiobook'] = array_merge($general, array('author',
'name', 'publisher', 'series', 'year', 'ISBN', 'description', 'performed_by', 'performance_type',
'language', 'volume', 'part', 'format', 'storage', 'recording_length', 'table_of_contents'));
$yandexmarket_offertags['artist.title'] = array_merge($general, array('artist', 'title', 'year', 'media',
'starring', 'director', 'originalName', 'country'));
$yandexmarket_offertags['tour'] = array_merge($general, array('worldRegion', 'country', 'region', 'days',
'dataTour', 'name', 'hotel_stars', 'room', 'meal', 'included', 'transport', 'description'));
$yandexmarket_offertags['event-ticket'] = array_merge($general, array('name', 'place', 'hall plan',
'date', 'is_premiere', 'is_kids'));
if ($type) {
return $yandexmarket_offertags[$type];
}
return $yandexmarket_offertags;
}?>Так же хочется добавить, смотрите что бы в названия категорий не было знака & (нужно дописать amp; )а то могуть быть проблемы с маркетом, так же, хочу заметить, не удалось побороть первую пустую строку, но раз никто на неё не жалуется, подразумеваю, что проблемы в другом месте, а не в этом коде, если у кого-то было и кто-то справился с пустой строкой вначале XML файла, не стесняйтесь, пишите свои решения тут.
- Для комментирования войдите или зарегистрируйтесь
Сейчас тоже испытал проблемы с выгрузкой товаров. Помогла эта наводка:
Однако у маркета есть вариант когда атрибут type="vendor.model" необязательный.
Как решилось: переопределил theme_yandexmarket. В цикле foreach ($rows as $num => $row) есть условие: if ($v !== FALSE). Дополняем: if ($v !== FALSE && $v != 'vendor.model'). И всё, для vendor.model type выводиться не будет.
Для борьбы со спецсимволами типа можно применить такой ход. В цикле ниже foreach (yandexmarket_offertags(_yandexmarket_getattribute('type', $options, $renders[$num])) as $id) на месте вывода переменной $v прописать: ($id == 'description' ? str_replace(' ', ' ', $v) : $v). Пока весь список замен не составлял, но смысл, думаю, понятен :)
Надеюсь, кому-то пригодится. Мне этих двух действий хватило, чтобы яндекс скушал файл.
- Для комментирования войдите или зарегистрируйтесь
Сейчас тоже испытал проблемы с выгрузкой товаров. Помогла эта наводка:
Однако у маркета есть вариант когда атрибут type="vendor.model" необязательный.
Как решилось: переопределил theme_yandexmarket.
Для борьбы со спецсимволами типа
огромное спасибо
- Для комментирования войдите или зарегистрируйтесь
Модуль не верно генерит порядок вывода переменных в xml..
- Для комментирования войдите или зарегистрируйтесь
Vannss, Америку уже давно открыли, см. выше.
- Для комментирования войдите или зарегистрируйтесь
Дополняем: <?php if ($v !== FALSE && $v != 'vendor.model')?>. И всё, для vendor.model type выводиться не будет.
Решение не очень гуд.
Есть строки, которые нужно выводить как фиксированно 'vendor.model'...
Вместо этого используем любое другое ключевое слово, например Static value: none.
Тут и для
Marla не нужно убирать обязательность, и при выводе данных из полей можно использовать значение none и vendor.model остаётся.
Кусок заменим на:
<?phpif (($v !== FALSE) && ($v != 'none'))?>
Ну и к поправленному порядку в yandexmarket.module от
griz добавим ещё один вариант
<?php$yandexmarket_offertags['none'] = array_merge($general, array('delivery', 'local_delivery_cost', 'name',
'vendor', 'vendorCode', 'description', 'country_of_origin',));?>Заодно уж, там же, чуть ниже ещё чуть подфиксим:
<?php(($v!==FALSE) AND (strlen($v) > 0))?>
Чтобы пустые строки не попадали в окончательный файл(по спецификации их не должно быть).
- Для комментирования войдите или зарегистрируйтесь














Комментарии