joomla:virtuemart4
Table of Contents
Экспорт в формат Yandex Market из VirtueMart 1.1.5
Задача
Настроить выгрузку данных (шлюз) из Virtuemart 1.1.5 (Joomla 1.5.21) в Yandeх Market. Для этого надо выгрузить информацию о продукции в формат YML.
Решение
Для этого делаем скрипт, который при вызове обращается к таблицам VirtueMart, хранящимся в Б/Д джумлы и выводит инфу в формате YML. К сожалению, формат YML не совсем соответствует спецификации XML, так что приходится создавать его “ручками” без использования XML библиотек. Итак:
Скрипт market.yml
Создаём в корневой папке джумлы файл market.yml следующего содержания (сохраняем файл в кодировке utf-8):
<?php //*********************************************************** // // Версия коннектора к Yandex.Market от 18.04.2009 // автор доработок Саид Дашук (dashuk@ngs.ru) // // Доработки: // 1. Подключение к настройкам Joomla (теперь не надо прописывать реквизиты доступа к БД, // а достаточно указать конфигурационный файл 'configuration.php') // 2. Добавлены комментарии для новичков // 3. ВЫБОРКА ВСЕХ ТОВАРОВ ПРОИСХОДИТ ОДНИМ ЗАПРОСОМ! // 4. Добавлен шаблон для описания товара (тег <description>) // 5. Курсы валют, приравнены к курсу ЦБРФ // 6. Добавлены теги "доставка" и "производитель" (просто мне они нужны, а Вы решайте сами) // а также: форматирование для удобства кода и вывода и еще что то по мелочам. // // Проверялось на Joomla! 1.5.9 Production/Stable / VirtueMart 1.1.2 stable // //*********************************************************** // Пропишите относительный путь к 'configuration.php' (он находится в корне Joomla) // Например: include '../configuration.php'; include 'configuration.php'; $cfg = new JConfig(); //NAME - Короткое название магазина (название, которое выводится в списке найденных на Яндекс.Маркете товаров. //Не должно содержать более 20 символов). Нельзя использовать слова, не имеющие отношения к //наименованию магазина ("лучший", "дешевый"), указывать номер телефона и т.п. Название магазина, //должно совпадать с фактическим названием магазина, которое публикуется на сайте. При несоблюдении //данного требования наименование может быть изменено Яндексом самостоятельно без уведомления Клиента. $cfg_name = $cfg->fromname; //Полное наименование компании, владеющей магазином. Не публикуется, используется для внутренней идентификации. $cfg_company = $cfg->sitename; //URL-адрес главной страницы магазина без http:// $cfg_url = 'test.ru'; // Шаблон для описания товара // Вместо {product_name} - будет вставлено наименование товара // Вместо {product_desc} - будет вставлено краткое описание // ПРИМЕР: // $description_template = '{product_name} от производителя'; $description_template = '{product_desc}'; // Ставка за клик (в центах) $bid = '11'; $hostname = $cfg->host; $username = $cfg->user; $password = $cfg->password; $dbName = $cfg->db; $category = $cfg->dbprefix."vm_category"; $category_xref = $cfg->dbprefix."vm_category_xref"; $userstable = $cfg->dbprefix."vm_product"; $pricetable = $cfg->dbprefix."vm_product_price"; $product_category_xref = $cfg->dbprefix."vm_product_category_xref"; mysql_connect($hostname,$username,$password) OR DIE("Не могу создать соединение "); mysql_select_db($dbName) or die(mysql_error()); // Исправьте, если у вас другая кодировка в БД mysql_query('set names utf8'); echo"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"; echo"<!DOCTYPE yml_catalog SYSTEM \"shops.dtd\">\n"; echo"<yml_catalog date=\""; echo date('Y-m-d H:i'); echo"\">\n"; echo"<shop>\n"; echo"<name>$cfg_name</name>\n"; echo"<company>$cfg_company</company>\n"; echo"<url>$cfg_url</url>\n"; // курсы валют, приравнены к курсу ЦБРФ echo"<currencies>\n"; echo"<currency id=\"RUR\" rate=\"1\"/>\n"; echo"<currency id=\"USD\" rate=\"CBRF\"/>\n"; echo"<currency id=\"EUR\" rate=\"CBRF\"/>\n"; echo"</currencies>\n"; // Секция категорий echo"<categories>\n"; $query_cat = "SELECT * FROM $category_xref"; $res_cat = mysql_query($query_cat) or die(mysql_error()); $rw=1; while ($row_cat=mysql_fetch_array($res_cat)) { $cat_parent_id=$row_cat['category_parent_id']; $cat_child_id=$row_cat['category_child_id']; $query2 = "SELECT category_name FROM $category WHERE category_id=".$row_cat['category_child_id']; $res_cat1 = mysql_query($query2) or die(mysql_error()); $name_cat=mysql_fetch_array($res_cat1); $cat_name=$name_cat['category_name']; if ($cat_parent_id==0) { echo"<category id=\"".$cat_child_id."\">".$cat_name."</category>\n"; } else { echo"<category id=\"".$cat_child_id."\" parentId=\"".$cat_parent_id."\">".$cat_name."</category>\n"; } $rw++; } echo"</categories>\n"; // Секция описания товаров echo"<offers>\n"; $tb_product = $cfg->dbprefix."vm_product"; $tb_manufacturer = $cfg->dbprefix."vm_manufacturer"; $tb_product_mf_xref = $cfg->dbprefix."vm_product_mf_xref"; $tb_category = $cfg->dbprefix."vm_category"; $tb_product_category_xref = $cfg->dbprefix."vm_product_category_xref"; $tb_price = $cfg->dbprefix."vm_product_price"; $query = " SELECT $tb_product.product_id, $tb_product.product_name, $tb_manufacturer.mf_name, $tb_manufacturer.manufacturer_id, $tb_category.category_name, $tb_category.category_id, $tb_product_category_xref.category_id, $tb_price.product_price, $tb_product.product_sku, $tb_product.product_in_stock, $tb_product.product_unit, $tb_product.product_full_image, $tb_product.product_s_desc, $tb_product.product_weight FROM ($tb_product_category_xref RIGHT JOIN ($tb_price RIGHT JOIN (($tb_product_mf_xref RIGHT JOIN $tb_product ON $tb_product_mf_xref.product_id = $tb_product.product_id) LEFT JOIN $tb_manufacturer ON $tb_product_mf_xref.manufacturer_id = $tb_manufacturer.manufacturer_id) ON $tb_price.product_id = $tb_product.product_id) ON $tb_product_category_xref.product_id = $tb_product.product_id) LEFT JOIN $tb_category ON $tb_product_category_xref.category_id = $tb_category.category_id WHERE $tb_product.product_publish='Y' "; $row = d2a($query); $product_log = Array(); for($i=0;$i<count($row);$i++) { if (!in_array($row[$i]['product_id'],$product_log) AND ($row[$i]['product_price'])) { $product_log[] = $row[$i]['product_id']; $url="http://$cfg_url/index.php?page=shop.product_details&flypage=shop.flypage&option=com_virtuemart&product_id=".$row[$i]['product_id']; //$url="http://$cfg_url/client?page=shop.product_details&flypage=flypage-ask.tpl&product_id=".$row[$i]['product_id']."&category_id=".$row[$i]['category_id']."&manufacturer_id=".$row[$i]['manufacturer_id']; $product_full_image = "http://$cfg_url/components/com_virtuemart/shop_image/product/".$row[$i]['product_full_image']; $tags = Array ('{product_name}','{product_desc}'); $repl = Array ($row[$i]['product_name'],$row[$i]['product_s_desc']); $product_price = substr($row[$i]['product_price'], 0, -3); $product_cat_id=$row[$i]['category_id']; echo"\n<offer id=\"".$row[$i]['product_id']."\" available=\"true\" bid=\"$bid\">\n"; echo"<url>".$url."</url>\n"; echo"<price>$product_price</price>\n"; // Валюта в которой указаны Ваши цены echo"<currencyId>RUR</currencyId>\n"; echo"<categoryId>".$product_cat_id."</categoryId>\n"; echo"<picture>".$product_full_image ."</picture>\n"; // Возможность доставки echo"<delivery>true</delivery> \n"; echo"<name>".strip_tags($row[$i]['product_name'])."\"</name>\n"; echo"<description>".strip_tags(str_replace($tags,$repl,$description_template))."</description>\n"; echo"</offer>\n"; } } echo"</offers>\n"; echo"</shop>\n"; echo"</yml_catalog>\n"; function d2a($query){ $result = mysql_query($query) or die("Query failed : " . mysql_error()); while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) {$res[] = $line;} mysql_free_result($result); return $res; } ?>
Правка .htaccess
Добавляем в .htaccess директиву обрабатывать PHP в YML файлах:
# Чтобы в файлах .html и .htm работали включения PHP вида <?php:?> RemoveHandler .html .htm AddType application/x-httpd-php .php .html .phtml .htm .yml
Проверка работы
- Проверяем работу скрипта: открываем страницу http://test.ru/market.yml в браузере и смотрим исходный код страницы. Убеждаемся, что идёт выгрузка.
- Проверяем работу скрипта через интерфейс Яндекс-Маркета или Яндекс-Вебмастера (там тоже есть возможность подключить YML файл).
joomla/virtuemart4.txt · Last modified: 2010/12/11 14:10 by kibi
Discussion
Большое спасибо! Столько раз пробовал его настроить и все никак, но с Вашей помощью все получилось. Все работает. Благодарю за работу!
Дописал код, теперь стоимость идет сос кидкой. (и с абсолютной и с относительной).
в строке 59 (около) объявляем новую переменную: $disciunttable = $cfg→dbprefix.«vm_product_discount»; Добавляем ссылку на таблицу со скидками в строке 133 добавляем еще одно поле, которое берет из базы «есть ли скидка». В примере ставлю между ближайших строк: $tb_product.product_s_desc, $tb_product.product_discount_id, $tb_product.product_weight И, наконец, со 150 строки исправленный код: $product_full_image = «http:$cfg_url/components/com_virtuemart/shop_image/product/».$row[$i]['product_full_image'];
Спасибо ГРОМАДНОЕ!!! Все сразу заработало как надо, яндекс скушал, автору респект! На фрилансе попросили с меня 3000 рублей за этот скрипт! Повезло что на Вас наткнулся на просторах инета!
VM 1.1.4 Фатальная ошибка: Ошибка парсинга XML: Error parsing XML feed: Expected entity name for reference (строка 131, столбец 34)
в строке 131 запись <offer id=«4237» available=«true» bid=«11»>
URL товара формируется правильно.
как исправить ошибку?
В версии от 3.12.12 исправлено: пробелы в названии картинки товаров теперь правильно отображаются http://fobfreeman.pp.ua/123/virtuemart-yml-export-script Ссылка на файл http://fobfreeman.pp.ua/123/virtuemart-yml-export-script?aid=256&sa=0
http://fobfreeman.pp.ua/123/virtuemart-yml-export-script Версия коннектора от 16.07.2012 7. Правильный вывод цен для товаров со скидками
8. Вывод названия товаров без заглавных букв, html тегов и спецсимволов, а также
перечисления и различные варианты написания товарного
предложения, а также слова: скидка, распродажа, дешевый,
подарок, бесплатно, акция, специальная цена, новинка, new,
аналог, заказ, приз.
9. Вывод только опубликованных товаров с ценой больше 0.01
10. Вывод доступности товаров, остальные товары показываются как товары под заказ
Подскажите у меня выдает ошибку mysql_query('set names windows1251'); echo»\n»; ставил и mysql_query('set names utf8');
echo»\n» не помогает .Есть какие то идей .
у меня ошибка
Не найдено описание для элемента «yml_catalog». Возможно неверно указан корневой элемент.
Строка: 3 Позиция: 38
Подробнее
cvc-elt.1.a: Cannot find the declaration of element 'yml_catalog'. Что это может быть?
Вот файл http://zapravkacity.ru/market.yml
Всем привет! как прописать чтобы выгружать не все, что на сайте, а определенные группы товаров.
Спасибо огромное! На VM 1.1.9 - прекрасно работает.
Яндекс пишет: Фатальная ошибка: Ошибка парсинга XML: Error parsing XML feed: Unterminated entity reference, 'Cantry' (строка 5716, столбец 71)
Подскажите пожалуйста в чём ошибка, как её можно исправить?
Доброго время суток!
Поправочка:
Что надо дописать в скрипте, чтобы сохранялся файл, типа http://www.сайт.ru/export/fajl.yml или http://www.сайт.ru/export/fajl.xml?
Здравствуйте! Подскажите, чем открыть файл yml?? У меня просто скачивается документ market.yml, а посмотреть его нечем… И самое главное, Яндекс пишет - Фатальная ошибка: Ошибка парсинга XML: Error parsing XML feed: Invalid document structure (строка 67, столбец 48), а я их даже посмотреть не могу…
ПОМОГИТЕ ПОЖАЛУЙСТА!
А как сделать, чтобы создавался файл xml с теми же данными?
Добрый день. Спасибо Вам за то что вы выкладываете свои работы на всеобщее обозрение. Я всё сделал как вы написали, зашёл на тестовую страницу там получилось вот это - http://floomby.ru/content/HjT8UeuvNk Просмотр кода страницы выдал - http://floomby.ru/content/NrzbhV0Gc1
Хотел спросить - это всё правильно? И второй вопрос: а как мне проставить цены только в долларах США? Если я правильно понял, то просто вот здесь банально удалить евро и рубли? курсы валют, приравнены к курсу ЦБРФ echo»<currencies>\n»; echo»<currency id=\»RUR\» rate=\»1\»/>\n»; echo»<currency id=\»USD\» rate=\»CBRF\»/>\n»; echo»<currency id=\»EUR\» rate=\»CBRF\»/>\n»; echo»</currencies>\n»; удалить евро и рубли?
Я теперь зарегистрированный пользователь, так что можете мне и здесь отвечать, если это возможно.
Здравствуйте. А может подскажите как выгрузить в xml?
Joomla 2.5.3 Virtuemart 2.0.2
не работает
другие имена таблиц, вроде поправил, теперь ошибка «You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1»
файл market.yml переименовал в .PHP - но не должно из-за этого глючить
Автор скрипта. Если есть такая возможность свяжитесь со мной при загрузке в яндекс он выдает: Определена кодировка: utf-8 (строка 0, столбец 0) Дата из файла: 2012-03-16 12:54 (строка 3, столбец 38) Ошибка: Не указано название магазина (строка 100, столбец 9) Фатальная ошибка: Фид отклонен Гдето я не догнал чтото. За вознаграждение может поправите?
Добрый день! Огромное спасибо автору Вопрос:для virtuemart 2 скрипт уже есть?
Спасибо, конечно, что помогли )))
Разобралась сама, в коде нужно удалить строки:
Затем в этих строках:
Заменить на:
Спасибо за публикацию вашего решения проблемы!
Здравствуйте! Подскажите, при проверке скрипта выдает ошибку:
Notice: Undefined property: JConfig::$(кириллицу не воспринимает, в латинице пишу в транслите) in /home/идентификатор хостинга/xn–80adngcmr4b.xn–p1ai/docs/market.yml on line 32
Notice: Undefined property: JConfig::$vintaik in /home/идентификатор хостинга/xn–80adngcmr4b.xn–p1ai/docs/market.yml on line 35
может скрипт конфликтовать с кириллическим доменом? в чем может быть дело? причем товар выгружает, но перед этим пишет эти ошибки
:-P Просто громадное спасибо! все работает! :-P
Есть вопросик: можно ли сделать следующее: В таблицах virtuemart есть вес товара в свойствах, допустим это некое «N», необходимо чтобы этот показатель в файле YML был представлен как стоимость доставки для yandex.market по формуле :
(стоимость доставки для yandex.market)=N*10 [так как в самом магазине будем использовать стандартный модуль доставки и доставка будет считаться через виртуальный вес товара(который был придуман для каждой категории отдельно) но чтобы не пугать покупателей 3-значными числами в значении вес было принято решение добавить соимость доставки через вес по формуле: вес=стоимость доставки/10]
Если вкратце то так : нужно значение «ВЕС» в virtuamarte перенести в значение «СТОИМОСТЬ ДОСТАВКИ» для yandex.marketa но умноженное на 10 Пожалуйста помогите очень нуна сам как свинья в помидорах
Здравствуйте, у меня возникла проблема: При экспорте в маркет, не отображается артикул товара используется joomla 1.5.23Stable virtuemart 1.1.9Stable YML Exporter Адрес сайта watches-the-best.ru
URL для экспорта в Яндекс.Маркет: http://watches-the-best.ru/index.php?option=com_vmymlexport&view=yml&no_html=1 для предварительного просмотра http://watches-the-best.ru/index.php?option=com_vmymlexport&view=yml
Подскажите как решить данною проблему?
Заранее спасибо.
чтобы добавить производителя нужно после
$product_cat_id=$row[$i]['category_id'];
добавить$manufacturer=$row[$i]['mf_name'];
и послеecho»<categoryId>».$product_cat_id.»</categoryId>\n»;
добавитьecho»<vendor>».$manufacturer.»</vendor>\n»;
Вот код для функции которая учитывала бы скидку, если кто нибудь переделает его и добавит - это будет очень хорошо.
Доброго время суток!
Что надо дописать в скрипте, чтобы сохранялся файл, типа http://www/сайт.ru/eport/fajl.yml или http://www/сайт.ru/eport/fajl.yml?
http://podushechka.net/market.yml белый экран… база данных сама подключается в случаи если я правильно указал путь к configuration.php /domains/podushechka.net/public_html/configuration.php или http://podushechka.net/configuration.php я имею в виду пароль и логин в базу данных нужно вводить в скрипте или это автоматически? подскажите пожалуйста!! :) спасибо!
Моя база, в маркете мне сказали, что проблема с пробелами, я в этом не разбираюсь, помогите пожалуйста.
Удалил и заново создал товары на которые жаловался yandex и все заработало. Спасибо автору огромное!!!
Удалил данные товары яндекс принял, интересно в чем была проблема
Не получается загрузить файл на yandex пишет Определена кодировка: utf-8 (строка 0, столбец 0) Дата из файла: 2011-12-16 21:41 (строка 3, столбец 38) Ошибка: Для предложения указана неизвестная категория: 0 (строка 3337, столбец 9) Ошибка: Предложение отклонено: http://test.ru/index.php?page=shop.product_details&flypage=shop.flypage&option=com_virtuemart&product_id=323 (строка 3337, столбец 9) Ошибка: Для предложения указана неизвестная категория: 0 (строка 3370, столбец 9) Ошибка: Предложение отклонено: http://test.ru/index.php?page=shop.product_details&flypage=shop.flypage&option=com_virtuemart&product_id=325 (строка 3370, столбец 9) Успешно обработано 334 предложений из 336
Скажите, пожалуйста, как сделать, чтоб выгружались не все товары и категории, а только выбранные или же, чтоб выбранные категории и товары в них не выгружались.. Спасибо.
Подскажите как сделать чтобы в YML указывалась цена со скидкой?
Все работает, но ссылки почему-то обычного вида без SEF. Как можно исправить?
Подскажите пожалeйста что означает такая строчка при запуске market.yml
Parse error: syntax error, unexpected T_STRING in Z:\home\magazin\www\market.yml on line 35
Запускал через локальный сайт (denwer)
А на втором магазине beauty-health.com.ua другая ошибка: Определена кодировка: utf-8 (строка 0, столбец 0) Дата из файла: 2011-10-17 20:42 (строка 3, столбец 38) Фатальная ошибка: Ошибка парсинга XML: Error parsing XML feed: Unterminated entity reference, 'Health' (строка 5, столбец 56)
Доброго времени суток, обращаюсь к файлу через брайзер - все выдает, товары ссылки, гружу в яндекс маркет, выдает ошибку: Определена кодировка: utf-8 (строка 0, столбец 0) Дата из файла: 2011-10-17 20:35 (строка 3, столбец 38) Фатальная ошибка: Ошибка парсинга XML: Error parsing XML feed: Expected entity name for reference (строка 139, столбец 29)
Насколько я понял это из-за символов & и » в названии товаров, где мне это менять, сайт - littlestar.com.ua Надеюсь на помощь.
обращаюсь через браузер к файлу мне открывается как еткстовый с полным кодом. Яндекс маркет говорит ошибку:Ошибка: Ошибка распаковки архива: unsupported mime type «text/x-php» Фатальная ошибка: Внутренняя ошибка во время патчинга файла: 1 в haccess Добавил код выглядит так:
В чем дело?
Видимо не отработала директива в .htaccess обрабатывать PHP в YML файлах. Обратитесь с просьбой к хостеру - может у него не включена обработка пользовательских .htaccess файлов и эту настройку надо прописывать куда-то еще.
Либо можно попробовать изменить расширение файла скрипта на *.php.
попробуй на ftp посмотреть или браузером другим
Подскажите. Обращаюсь к market.yml, а он просто скачивается. Как его проверить?
Мужики, а как быть с ЧПУ? На сайте установлены ЧПУ с router.php а в файл выгружаются обычные урлы. :(
Смотря какой роутер стоит. Под каждый отдельный роутер надо править.
Я уже разобрался, это Яндекс не допускает некоторых вещей в названиях товара, у меня выгрузка идет из 1С, там впереди в некоторых товарах было слово АКЦИЯ видимо там хорошо настроенные фильтры, это слово и есть ошибка а строка это первого слова, прикол то что если подчистить первое нозвание по строке но оставить подобное снизу, то потом второй раз выдаст ошибку с шагом ниже по ст роке до этого слова, я подчистил все названия и проблема пропала) С кодировкой все нормально БД у меня UTF8
При проверке в браузере все работает нормально, при проверке в сервисе Яндекс маркет выдает ошибку: Определена кодировка: utf-8 (строка 0, столбец 0) Дата из файла: 2011-07-31 14:54 (строка 3, столбец 38) Фатальная ошибка: Ошибка парсинга XML: Error parsing XML feed: Expected entity name for reference (строка 326, столбец 25)
Подскажите как ее исправить
А у вас база данных в какой кодировке? Если не в UTF-8, то надо исправить соответствующую строку в скрипте.
А как зделать, что бы цены с налогом указывались?
Спасибо! Однако, есть недоработка. Если для товаров применяется скидка, то цена в YML указывается все равно без скидки. ПС Что бы не долбаться с типами MIME можно поставить расширение PHP и все. Яндекс кушает на отлично. Пользователи IIS оценят ) ППС Если поправите недаработочку сообщите мне плиз на мыло.
Работает! Ещё раз спасибо! :)
Спасибо, добрый человек!!! Сейчас протестируем на 1.1.9
Отличный скрипт, Парень ты молодец!!! работает даже на VM 1.1.8
«Добрый день, а чем может быть вызван белый экран? Просто ничего нет?» - аналогично VM 1.1.6
Спасибо друг, очень полезный скрипт, не пришлось самому писать!
Добрый день, а чем может быть вызван белый экран? Просто ничего нет?
VM 1.1.4
Спасибо.