Новый модуль для экспорта в Yandex Market (views плагин)

Прислано: trashgenerator

чт, 06/05/2010 - 22:26

Месяц назад написал модуль для интеграции друпала с Яндекс маркетом. Его долго не могли проаппрувить в оффициальный репозиторий, потом у меня долго не доходили руки его туда залить. И вот наконец это свершилось.

 yandexmarket

Модуль выполнен в качестве плагина для Views. То есть Вы абсолютно свободны в выборе и создании полей для экспорта. Вы добавляете любые фильтры, аргументы и поля. Потом в настройках views стиля указываете какие views поля должны отображаться для каких yml полей. Подробности в readme.txt

Прошу любить и жаловать. А так же критиковать и багрепортить.

P.S. обнаружил, что буквально на днях был создан модуль, предназначенный для тех же целей http://docs.drupal.ru/node/43738
Модули все таки получились очень разные, с разными стратегиями и способами достижения поставленной цели. Так что смотрите оба и выбирайте более подходящее лично для Вас.

Комментарии


Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Применить"
Опубликовано restyler в пт, 07/05/2010 - 06:07.

у вас ссылочка кривая на модуль, коллега :) когда используете кнопку "ссылка на модуль", надо писать только название, без предшествующих drupal.org/...


Опубликовано restyler в пт, 07/05/2010 - 08:19.

попробовал, судя по настройкам круто и гибче чем мое, но какие-то проблемы с подхватом views style (views 2.5): в списке доступных стилей не видно.
Ну и не работает совсем :)


Опубликовано andypost@drupal.org в вс, 16/05/2010 - 11:10.

Пост стоит подправить (ссылку)
Теперь осталось импорт написать :)


Опубликовано andypost@drupal.org в пн, 17/05/2010 - 21:24.

Ссылка так и осталась кривой :(

Завел http://drupal.org/node/801502 - предлагаю обсудить импорт данных

На вскидку парсеры:
1) dom - уж очень ресурсоемок, для больших файлов хз сколько памяти нужно дават для php
2) simplexml - весьма тормознут

В обоих вариантах нужно задирать время выполнения скрипта или обрабоатывать в batch процессе

Неплохо продумать UI для отбора хотя бы нужных категорий


Опубликовано volocuga в пн, 17/05/2010 - 21:59.

Я вот тут призадумался: если яша тянет каждый час yml-файл,а всем известны аппетиты вьюсов, то не откинет ли копыта весь сайт?

Кэширование встроенными средствами видов скажем на день - поможет ли?


Опубликовано volocuga в пн, 17/05/2010 - 22:01.

"andypost@drupal.org" написал(а):

Неплохо продумать UI для отбора хотя бы нужных категорий

Так там стандартный фильтр можно прикрутить, с указанием глубины категорий. Или я чего не понял?


Опубликовано andypost@drupal.org в пн, 17/05/2010 - 22:27.

А можно подробнее об аппетитах views? views UI для начала не пробовали отключить и руками управлять кешированием результатов?

PS: яша тянет файл как анонимный пользователь, так что получает почти статику... boost cacherouter...


Опубликовано restyler в вт, 18/05/2010 - 07:22.

импорт у меня уже готов в принципе, не на ya.market но на близкий по сути сайт, на simplexml - и реально на файлах больше 5 метров сайт валяется. Сначала переписал на simplexml+batchapi, один фиг.
Надо делать на sax+batchapi - как я понял это единственный вариант для больших файлов импорта.
( xslt_set_sax_handlers )

если на других модулях делать, то http://drupal.org/project/feeds а не FeedAPI наверно.


Опубликовано andypost@drupal.org в вт, 18/05/2010 - 13:59.

а разве стандартный  drupal_xml_parser_create() не sax пользуется?  xml_parser_create()
У меня именно на больших объемах затык и получается, про sax забыл, так что большое спасибо за напоминание!

Таким образом можно обойтись без промежуточного хранилища:
1) подгружаем внешний файл
2) парсим только категории
3) в неком ui отбираем нужные для импорта
4) стартуем batch импорта


Опубликовано restyler в ср, 19/05/2010 - 07:48.

поковырялся еще вчера, почитал, вообщем если >=php5.1, оптимальный вариант это XMLReader.
sax вроде как равный по эффективности, но устаревший что ли.

"andypost@drupal.org" написал(а):

а разве стандартный 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 не страшны (код специфичный, поэтому не выкладываю)


Опубликовано andypost@drupal.org в ср, 19/05/2010 - 12:30.

restyler написал(а):

XMLReader

Спасибо за направление, будем копать...


Опубликовано PVasili в ср, 19/05/2010 - 19:37.

"restyler" написал(а):

sax вроде как равный по эффективности, но устаревший что ли.

это 2 разных подхода...


Опубликовано Valeratal в вс, 04/07/2010 - 08:20.

а данный модуль всеж таки работает?
у меня нет в списках стилей, стиля Я-маркет


Опубликовано keereel@drupal.org в пт, 16/07/2010 - 14:08.

Я пользуюсь  yml_export - работает.


Опубликовано yurgon в чт, 29/07/2010 - 14:57.

модуль не верно генерит порядок вывода переменных в xml


Опубликовано Dimm в пт, 27/08/2010 - 07:27.

Спасибо за модуль.
Столкнулся с проблемой:
При выборе
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" - отсутствует, то Яндекс принимает файл.
Но в настройках модуля этот параметр убрать нельзя.

Помогите пожалуйста.


Опубликовано molp в чт, 02/09/2010 - 22:36.

Там в описании есть маленькая неточность: вначале создается Page with no layout а только после этого появляется Style: yandexmarket - с этим разобрался, далее произвожу настройку в соответствии с инструкцией но при обращении к site.name/yandexmarket получаю "Запрашиваемая страница не найдена"


Опубликовано volocuga@drupal.org в чт, 02/09/2010 - 23:01.

Все баги пишите на орг в багтреккер.
1) Автору доп мотивация
2) Там удобнее отслеживать

Я переписывался с автором некоторое время назад, очень отзывчивый человек. Но писать нужно на орг


Опубликовано F10 в пн, 22/11/2010 - 04:51.

Пишу сюда, так как на 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


Опубликовано Dimm в ср, 01/12/2010 - 05:59.

Dimm написал(а):

Спасибо за модуль.
Яндекс не вопринимает поля name, description, delivery

Убрал эти поля name, description, delivery из views.
Переписка с Яндексом о несоответствии в их документации ничего не дала.


Опубликовано andrey.kulagin в чт, 07/07/2011 - 17:41.

Суть проблемы сводиться к:
Фатальная ошибка: Ошибка парсинга 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*)'


Опубликовано Marla в пн, 25/07/2011 - 16:40.

Да, поддерживаю. Просьба к автору модуля: уберите обязательность тега "type"


Опубликовано dzah в вс, 16/10/2011 - 06:37.

Я тоже наткнулся на ту же проблему: не удается включить в YML файл элемент 'delivery'.
Нужно, насколько я понимаю, поставить тег 'delivery' после тега 'picture'.
Нашел ли кто-нибудь способ это сделать?


Опубликовано dzah в вс, 16/10/2011 - 06:38.

У меня такая же проблема.
Вам удалось найти способ переставить тег 'delivery' в нужное положение?

И еще, если можно, посоветуйте вот что: какое именно поле вы вставляете в этот тег?
Я создал товарам дополнительное поле со значениями true / false.
В самой Ubercart присутствует чекбокс "Для данного товара и всех производных от него поддерживается доставка", но я не нашел способа увидеть его значение в представлении Yandexmarket, да и не уверен, честно говоря, что это то, что нужно.

А как делаете вы? Посоветуйте пожалуйста.


Опубликовано andrey.kulagin в чт, 15/09/2011 - 16:56.

Предлагаю моё решение: Парсить вывод и удалять ненужный атрибут таки макаром (это файлег 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

Таким образом каждые десять минут на сайте появляется статичный файл с текущими данными сайта и валидный к тому же. К тому же бот яндекса не будет непонятно когда нагружать сервак своими запросами... Хотя он канечна не так часто нагружает.


Опубликовано dzah в чт, 15/09/2011 - 19:38.

Спасибо!
Надежное и изящное решение!

Я тоже думал о чем-то подобном, но собирался не убирать атрибут vendor.model, а перловым скриптом переставлять тег на нужное место.

Не очень красиво, конечно, хотелось бы оставаться в рамках Друпала а не дополнять его палками-веревками, но видимо без этого не обойтись.

Видимо буду делать так как вы.
Спасибо!


Опубликовано griz в ср, 05/10/2011 - 23:45.

Дорабатывал скрипт для своего магазина, может кому пригодится.

Поправил 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 файла, не стесняйтесь, пишите свои решения тут.


Опубликовано CSoft в сб, 08/10/2011 - 11:51.

Сейчас тоже испытал проблемы с выгрузкой товаров. Помогла эта наводка:

"andrey.kulagin" написал(а):

Однако у маркета есть вариант когда атрибут type="vendor.model" необязательный.

Как решилось: переопределил theme_yandexmarket. В цикле foreach ($rows as $num => $row) есть условие: if ($v !== FALSE). Дополняем: if ($v !== FALSE && $v != 'vendor.model'). И всё, для vendor.model type выводиться не будет.

Для борьбы со спецсимволами типа &nbsp; можно применить такой ход. В цикле ниже foreach (yandexmarket_offertags(_yandexmarket_getattribute('type', $options, $renders[$num])) as $id) на месте вывода переменной $v прописать: ($id == 'description' ? str_replace('&nbsp;', ' ', $v) : $v). Пока весь список замен не составлял, но смысл, думаю, понятен :)

Надеюсь, кому-то пригодится. Мне этих двух действий хватило, чтобы яндекс скушал файл.


Опубликовано mpa3b в вс, 16/10/2011 - 02:01.

CSoft написал(а):

Сейчас тоже испытал проблемы с выгрузкой товаров. Помогла эта наводка:

"andrey.kulagin" написал(а):

Однако у маркета есть вариант когда атрибут type="vendor.model" необязательный.

Как решилось: переопределил theme_yandexmarket.

Для борьбы со спецсимволами типа &nbsp;

огромное спасибо


Опубликовано Vannss в пн, 17/10/2011 - 12:29.

Модуль не верно генерит порядок вывода переменных в xml..


Опубликовано CSoft в пн, 17/10/2011 - 12:34.

Vannss, Америку уже давно открыли, см. выше.


Опубликовано PVasili в чт, 12/01/2012 - 22:45.

"CSoft" написал(а):

Дополняем: <?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))?>
Чтобы пустые строки не попадали в окончательный файл(по спецификации их не должно быть).


Новое на сайте

Ссылки партнёров