Joomla 3.x Скрипт экспорта товаров в Яндекс Маркет Joomshopping 4.10

Тема в разделе "JoomShopping", создана пользователем eword, 13.06.2015.

?

Удалось ли внедрить скрипт?

  1. ДА

    1 голосов
    25.0%
  2. НЕТ

    1 голосов
    25.0%
  3. Я, вообще, ничего не понял.

    2 голосов
    50.0%
  1. Offline

    eword Недавно здесь

    Регистрация:
    13.06.2015
    Сообщения:
    6
    Симпатии:
    1
    Пол:
    Мужской
    Сам искал бесплатный вариант, но не нашел. По-этому, пришлось собрать всю информацию и "слепить" самому. Именно "слепить", мои знания php и mysqli очень поверхностны, профессионалы, наверняка, заметят это по коду, но факт остается фактом, скрипт успешно работает и проходит проверку. Пример работающего скрипта здесь.
    Выкладываю скрипт из идеологических соображений - код должен быть открытым и бесплатным Всегда!
    Код (PHP):
    1. <?php
    2.     include 'configuration.php';
    3.  
    4.     $cfg             = new JConfig();
    5.     $cfg_name         = $cfg->sitename;
    6.     $cfg_company     = $cfg->fromname;
    7.     $cfg_url         = 'Ваш_сайт.ru'; //Адрес Вашего сайта без http://
    8.     $hostname         = $cfg->host;
    9.     $username         = $cfg->user;
    10.     $password         = $cfg->password;
    11.     $dbName         = $cfg->db;
    12.  
    13.     $ct                = $cfg->dbprefix."jshopping_categories";
    14.     $pt             = $cfg->dbprefix."jshopping_products";
    15.     $pc                = $cfg->dbprefix."jshopping_products_to_categories";
    16.  
    17.     echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";         //кодировка самого .xml файла
    18.     echo "<!DOCTYPE yml_catalog SYSTEM \"shops.dtd\">\n";
    19.     echo "<yml_catalog date=\"".date("Y-m-d H:i")."\">\n";
    20.     echo "<shop>\n";
    21.     echo "<name>$cfg_name</name>\n";
    22.     echo "<company>$cfg_company</company>\n";
    23.     echo "<url>$cfg_url</url>\n";
    24.     echo "<currencies>\n\t<currency id=\"RUR\" rate=\"1\"/>\n</currencies>\n";
    25.  
    26.     $mysqli = new mysqli($hostname, $username, $password, $dbName);
    27.     if (mysqli_connect_errno()) {
    28.           printf("Подключение к серверу MySQL невозможно. Код ошибки: %s\n", mysqli_connect_error());
    29.           exit;
    30.     }
    31.  
    32.     mysqli_query($mysqli, "SET NAMES 'utf8' COLLATE 'utf8_general_ci'");    //кодировка подключения к БД
    33.     mysqli_query($mysqli, "SET CHARACTER SET 'utf8'");
    34.  
    35.     echo "<categories>\n";
    36.     if ($res = $mysqli->query("SELECT `name_ru-RU` AS cat_name, category_id FROM $ct WHERE category_publish = 1 ORDER BY category_id"))
    37.  
    38.     while( $row = $res->fetch_assoc() ) {
    39.         printf("\t<category id=\"".$row['category_id']."\">".$row['cat_name']."</category>\n");
    40.         }
    41.     echo "</categories>\n";
    42.  
    43.     echo "<offers>\n";
    44.     if ($res = $mysqli->query("
    45.        SELECT
    46.        $pt.product_id,
    47.        $pt.product_url,
    48.        $pt.product_ean,
    49.        $pt.`product_quantity` AS quantity,
    50.        $pt.product_price,
    51.        $pt.`name_ru-RU` AS name,
    52.        $pt.image,
    53.        $pt.`short_description_ru-RU` AS description,
    54.        $ct.`alias_ru-RU` AS cat_url,
    55.        $ct.category_id
    56.        FROM $pt
    57.        LEFT JOIN $pc ON $pt.product_id = $pc.product_id
    58.        LEFT JOIN $ct ON $pc.`category_id` = $ct.category_id
    59.        WHERE
    60.        product_publish = 1
    61.        ORDER BY product_id"))
    62.  
    63.     while( $row = $res->fetch_assoc() ) {
    64.  
    65.         if($row['quantity']>0) { $available = 'true'; }
    66.         else { $available = 'false'; }
    67.      
    68. echo "\t<offer id=\"".$row['product_id']."\" available=\"".$available."\" bid=\"10\">\n"; //bid = цена в центах за переход, 10 = 3 руб.
    69.         echo "\t\t<url>http://".$cfg_url.'/'.$row['cat_url'].'/'.$row['product_url']."</url>\n";
    70.         echo "\t\t<price>".$row['product_price']."</price>\n";
    71.           echo "\t\t<currencyId>RUR</currencyId>\n"; // выборка не реализована, у меня только рубли
    72.         echo "\t\t<categoryId>".$row['category_id']."</categoryId>\n";
    73.         if(!empty($row['image'])) {
    74.         echo "\t\t<picture>http://$cfg_url/components/com_jshopping/files/img_products/".$row['image']."</picture>\n"; }
    75.         echo "\t\t<store>true</store> \n";
    76.         echo "\t\t<delivery>true</delivery> \n"; //Возможность доставки
    77.         echo "\t\t<local_delivery_cost>500</local_delivery_cost> \n"; //Стоимость доставки в рублях в домашнем регионе
    78.         echo "\t\t<name>".strip_tags($row['name'])."</name>\n";
    79.         echo "\t\t<vendor>ПРОИЗВОДИТЕЛЬ</vendor> \n"; //Выборка не реализована, параметр не обязательный, можно удалить строку
    80.         echo "\t\t<vendorCode>".$row['product_ean']."</vendorCode>\n";
    81.         echo "\t\t<description>".strip_tags($row['description'])."</description>\n";
    82. echo "\t\t<country_of_origin>СТРАНА</country_of_origin> \n"; //Выборка не реализована, параметр не обязательный, можно удалить строку
    83.         echo "\t</offer>\n";
    84.     }
    85.     echo "</offers>\n";
    86.  
    87.     $res->close();
    88.     $mysqli->close();
    89.  
    90. echo "</shop>\n";
    91. echo "</yml_catalog>";
    92. ?>

    Меняем параметры "под себя", создаем файл .php (напр. market.php) в корне сайта с указанным кодом.
    Если нужно вывод как .yml файл, создаем перенаправление в файле .htaccess
    После RewriteEngine On
    Добавляем
    #yandex url's
    RewriteRule ^market.yml? market.php [QSA,L]

    P.S. Будете править скрипт, будьте внимательны. Достаточно попутать "косые одиночные кавычки" ` с "прямыми" ', и все скрипт не работает. Удачи.
     
    Последнее редактирование: 13.06.2015
    Asylum нравится это.
  2.  
  3. OlegK
    Offline

    OlegK Russian Joomla! Team Команда форума ⇒ Профи ⇐

    Регистрация:
    17.01.2011
    Сообщения:
    7 813
    Симпатии:
    771
    Пол:
    Мужской
    Прикреплю пока.А потом будет видно по отзывам.
     
  4. Offline

    vorona34 Недавно здесь

    Регистрация:
    20.04.2009
    Сообщения:
    27
    Симпатии:
    0
    Здравствуйте. Спасибо за богоугодное дело ))
    Установил скрипт, поменял только название сайта. При загрузке Яша ругается:

    Дата из файла: 2015-08-09 09:09 (строка 3, столбец 37)
    Фатальная ошибка: Ошибка парсинга XML: Error parsing XML feed: Input is not proper UTF-8, indicate encoding ! (строка 34, столбец 11)
    Bytes: 0xCF 0xD0 0xCE 0xC8 (азборный "Стэнли"</name>
    <vendor> )

    Нужно еще что-то менять в скрипте?
     
  5. OlegK
    Offline

    OlegK Russian Joomla! Team Команда форума ⇒ Профи ⇐

    Регистрация:
    17.01.2011
    Сообщения:
    7 813
    Симпатии:
    771
    Пол:
    Мужской
     
  6. Offline

    vorona34 Недавно здесь

    Регистрация:
    20.04.2009
    Сообщения:
    27
    Симпатии:
    0
    А я кавычки не трогал, заменил фразу Ваш_сайт.ru на свой сайт и все.
     
  7. Offline

    eword Недавно здесь

    Регистрация:
    13.06.2015
    Сообщения:
    6
    Симпатии:
    1
    Пол:
    Мужской
    В принципе, в ответе уже все написано... Строка 34 устанавливает кодировку подключения к базе данных, скорее всего, у Вас кодировка БД другая.
    если моя догадка верна, надо менять кодировку во все скрипте с UTF-8 на Вашу. Дайте ссылку на файл .xml
     
  8. Offline

    vorona34 Недавно здесь

    Регистрация:
    20.04.2009
    Сообщения:
    27
    Симпатии:
    0
    http://turnik-grizzly.ru/yandex.php
    --- добавлено: 09.08.2015, первое сообщение размещено: 09.08.2015 ---
    Проверил кодировку. По умолчанию идет UTF-8. Я настройки не менял.
     
  9. Offline

    eword Недавно здесь

    Регистрация:
    13.06.2015
    Сообщения:
    6
    Симпатии:
    1
    Пол:
    Мужской
    Перейдите по ссылке, правой кнопкой мыши => просмотреть код страницы. <vendor> и <country_of_origin> не в UTF-8. смотрите кодировку в этих таблиц БД с помощью php myadmin.
    --- добавлено: 09.08.2015 ---
    Скрипт здесь не причем.
     
  10. Offline

    vorona34 Недавно здесь

    Регистрация:
    20.04.2009
    Сообщения:
    27
    Симпатии:
    0
    Вот что нашел в php myadmin.
    xpnkh_jshopping_vendors InnoDB utf8_general_ci
    xpnkh_jshopping_countries InnoDB utf8_general_ci
    --- добавлено: 09.08.2015, первое сообщение размещено: 09.08.2015 ---
    Если в исходном коде страницы поменять кодировку на Кириллицу (Windows-1251), то эти поля становятся читаемыми. Возникает вопрос, что нужно менять. Кодировку этих двух элементов или скрипт? Ну и как это менять, конечно?
    --- добавлено: 09.08.2015 ---
    Выкинул 2 эти параметра из скрипта и все стало красивее, но на много дальше я не продвинулся. Теперь Яша ругается кучей ошибок типа:

    Дата из файла: 2015-08-09 22:26 (строка 3, столбец 37)
    Ошибка: URL предложения не соответствует стандарту RFC-1738: http://turnik-grizzly.ru/турник-брусья-пресс-3-в-1/ (строка 36, столбец 10)

    Ругается на кириллицу?
     
  11. Offline

    eword Недавно здесь

    Регистрация:
    13.06.2015
    Сообщения:
    6
    Симпатии:
    1
    Пол:
    Мужской
    ДА. Вот описание ошибок
    https://yandex.ru/support/partnermarket/export/errors.xml
    Прочитайте требования к .yml в помощи Яндекса

    без понимания - что зачем и как Вам будет трудно.
    В данном случая я могу помочь Вам, если скрипт не работает,
    но он Работает, у Вас на сайте есть проблема адаптации к стандартам Яндекс. Партнер.
     
  12. Offline

    vorona34 Недавно здесь

    Регистрация:
    20.04.2009
    Сообщения:
    27
    Симпатии:
    0
    Чем дальше, тем интереснее:confused:.

    Решил попробовать отправить прайс без кириллических урлов. Отключил все, а скрипт все-равно выдает кириллицу. Он берет урлы пунктов "алиас" и "псевдоним"? Нельзя заставить его брать чупакабру вида http://turnik-grizzly.ru/index.php?...ory_id=24&product_id=459&Itemid=512......Хотя я не уверен, что и такой урл пройдет проверку, но пытаться ведь нужно.
    --- добавлено: 10.08.2015, первое сообщение размещено: 10.08.2015 ---
    Кстати, нормально, что скрипт в поле url пишет адрес категории, а не адрес товара?

    <offer id="428" available="true" bid="10">
    <url>http://turnik-grizzly.ru/турник-брусья-пресс-3-в-1/</url>
    <price>2700.000000</price>
    <currencyId>RUR</currencyId>
    <categoryId>26</categoryId>
    <picture>http://turnik-grizzly.ru/components/com_jshopping/files/img_products/____________01-2.jpg</picture>
    <store>true</store>
    <delivery>true</delivery>
    <local_delivery_cost>500</local_delivery_cost>
    <name>Турник настенный 3 в 1 разборный "Стэнли"</name>
    <vendorCode>1</vendorCode>
    <description>Основные преимущества:Мягкие подлокотники и спинка,Навесная конструкция позволяет быстро менять положение турника,Мягкие ручки - в комплекте,Тренажер 3 в 1: пресс + турник + брусья.</description>
    </offer>
     
  13. Offline

    eword Недавно здесь

    Регистрация:
    13.06.2015
    Сообщения:
    6
    Симпатии:
    1
    Пол:
    Мужской
    Еще раз: проблема не скрипте!
    А в Вашей БД. Скрипт только выводит то, что записано в таблицах!
    Прочитайте https://yandex.ru/support/partnermarket/offers.xml
    Начните все с начала.
    "Экспериментировать" без понимания задачи можно до бесконечности!
     
  14. Offline

    vorona34 Недавно здесь

    Регистрация:
    20.04.2009
    Сообщения:
    27
    Симпатии:
    0
    Как раз сейчас читаю:
    "url-URL страницы товара. Максимальная длина URL — 512 символов.
    Необязательный элемент для магазинов-салонов."

    Сказать, что "проблема в моей БД" - это тоже самое , что сказать "проблема в Джумле" "или проблема в Шопе". Потому что не я пишу название категории в название товара.
     
  15. Offline

    eword Недавно здесь

    Регистрация:
    13.06.2015
    Сообщения:
    6
    Симпатии:
    1
    Пол:
    Мужской
    Блин, Вы сами написали, что одна таблица в одной кодировки, другая в другой. Это не проблема?
    Далее, цену товара выводит с 4-мя 0 - это не проблема?
     
  16. Offline

    vorona34 Недавно здесь

    Регистрация:
    20.04.2009
    Сообщения:
    27
    Симпатии:
    0
    Проблем куча.
    Получается, что скрипт работает, но не с джумлой или не с шопом, потому что у них база кривая.
     
  17. Offline

    -sp- Недавно здесь

    Регистрация:
    02.06.2017
    Сообщения:
    1
    Симпатии:
    0
    Пришлось скрипт исправить.

    1. исправлены url страниц товаров, они теперь генерируются из category_id и product_id
    2. выкинуты необязательные поля, обязательные приведены в соответствие с спецификацией
    3. адрес сайта берётся из переменных окружения, при переносе на другой сайт не требуется никаких правок

    Работает с joomshopping-4.16.1 и joomla-3.7.2

    Код (CODE):
    1. <?php
    2.     include 'configuration.php';
    3.  
    4.     $cfg             = new JConfig();
    5.     $cfg_name         = $cfg->sitename;
    6.     $cfg_company     = $cfg->fromname;
    7.     $cfg_url         = $_SERVER['HTTP_HOST'].dirname($_SERVER['REQUEST_URI']);
    8.     $hostname         = $cfg->host;
    9.     $username         = $cfg->user;
    10.     $password         = $cfg->password;
    11.     $dbName         = $cfg->db;
    12.  
    13.     $ct                = $cfg->dbprefix."jshopping_categories";
    14.     $pt             = $cfg->dbprefix."jshopping_products";
    15.     $pc                = $cfg->dbprefix."jshopping_products_to_categories";
    16.  
    17.     echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";         //кодировка самого .xml файла
    18.     echo "<!DOCTYPE yml_catalog SYSTEM \"shops.dtd\">\n";
    19.     echo "<yml_catalog date=\"".date("Y-m-d H:i")."\">\n";
    20.     echo "<shop>\n";
    21.     echo "<name>$cfg_name</name>\n";
    22.     echo "<company>$cfg_company</company>\n";
    23.     echo "<url>http://".$cfg_url."</url>\n";
    24.     echo "<currencies>\n\t<currency id=\"RUR\" rate=\"1\"/>\n</currencies>\n";
    25.  
    26.     $mysqli = new mysqli($hostname, $username, $password, $dbName);
    27.     if (mysqli_connect_errno()) {
    28.           printf("Подключение к серверу MySQL невозможно. Код ошибки: %s\n", mysqli_connect_error());
    29.           exit;
    30.     }
    31.  
    32.     mysqli_query($mysqli, "SET NAMES 'utf8' COLLATE 'utf8_general_ci'");    //кодировка подключения к БД
    33.     mysqli_query($mysqli, "SET CHARACTER SET 'utf8'");
    34.  
    35.     echo "<categories>\n";
    36.     if ($res = $mysqli->query("SELECT `name_ru-RU` AS cat_name, category_id FROM $ct WHERE category_publish = 1 ORDER BY category_id"))
    37.  
    38.     while( $row = $res->fetch_assoc() ) {
    39.         printf("\t<category id=\"".$row['category_id']."\">".$row['cat_name']."</category>\n");
    40.         }
    41.     echo "</categories>\n";
    42.     echo "<delivery-options>\n\t<option cost=\"500\" days=\"32\"/>\n</delivery-options>\n";
    43.  
    44.     echo "<offers>\n";
    45.     if ($res = $mysqli->query("
    46.        SELECT
    47.        $pt.product_id,
    48.        $pt.product_url,
    49.        $pt.product_ean,
    50.        $pt.`product_quantity` AS quantity,
    51.        $pt.product_price,
    52.        $pt.`name_ru-RU` AS name,
    53.        $pt.image,
    54.        $pt.`short_description_ru-RU` AS description,
    55.        $ct.`alias_ru-RU` AS cat_url,
    56.        $ct.category_id
    57.        FROM $pt
    58.        LEFT JOIN $pc ON $pt.product_id = $pc.product_id
    59.        LEFT JOIN $ct ON $pc.`category_id` = $ct.category_id
    60.        WHERE
    61.        product_publish = 1
    62.        ORDER BY product_id"))
    63.  
    64.     while( $row = $res->fetch_assoc() ) {
    65.  
    66.         if($row['quantity']>0) { $available = 'true'; }
    67.         else { $available = 'false'; }
    68.  
    69.     echo "\t<offer id=\"".$row['product_id']."\" available=\"".$available."\" bid=\"10\">\n"; //bid = цена в центах за переход, 10 = 3 руб.
    70.         echo "\t\t<url>http://".$cfg_url."/index.php?option=com_jshopping&controller=product&task=view&category_id=".$row['category_id']."&product_id=".$row['product_id']."</url>\n";
    71.         echo "\t\t<price>".$row['product_price']."</price>\n";
    72.         echo "\t\t<currencyId>RUR</currencyId>\n"; // выборка не реализована, у меня только рубли
    73.         echo "\t\t<categoryId>".$row['category_id']."</categoryId>\n";
    74.         if(!empty($row['image'])) {
    75.         echo "\t\t<picture>http://$cfg_url/components/com_jshopping/files/img_products/".$row['image']."</picture>\n"; }
    76.         echo "\t\t<pickup>true</pickup> \n";
    77.         echo "\t\t<delivery>true</delivery> \n"; //Возможность доставки
    78.         echo "\t\t<name>".strip_tags($row['name'])."</name>\n";
    79.         echo "\t\t<description>".strip_tags($row['description'])."</description>\n";
    80.         echo "\t</offer>\n";
    81.     }
    82.     echo "</offers>\n";
    83.  
    84.     $res->close();
    85.     $mysqli->close();
    86.  
    87. echo "</shop>\n";
    88. echo "</yml_catalog>";
    89. ?>
     
  18. Vise
    Offline

    Vise Недавно здесь

    Регистрация:
    10.10.2017
    Сообщения:
    1
    Симпатии:
    0
    Пол:
    Мужской
    Чтобы ЧПУ не портить, можно поменять на:
    Код (PHP):
    1. if ($res = $mysqli->query("
    2.       SELECT
    3.       $pt.product_id,
    4.       $pt.`alias_ru-RU`,
    5.       $pt.product_ean,
    6.       $pt.`product_quantity` AS quantity,
    7.       $pt.product_price,
    8.       $pt.`name_ru-RU` AS name,
    9.       $pt.image,
    10.       $pt.`short_description_ru-RU` AS description,
    11.       $ct.`alias_ru-RU` AS cat_url,
    12.       $ct.category_id
    13.       FROM $pt
    14.       LEFT JOIN $pc ON $pt.product_id = $pc.product_id
    15.       LEFT JOIN $ct ON $pc.`category_id` = $ct.category_id
    16.       WHERE
    17.       product_publish = 1
    18.       ORDER BY product_id"))

    А сам URL на:
    Код (PHP):
    1. echo "\t\t<url>http://".$cfg_url.'/katalog/'.$row['cat_url'].'/'.$row['alias_ru-RU']."</url>\n";
     

Поделиться этой страницей

Загрузка...