0 Пользователей и 1 Гость просматривают эту тему.
  • 285 Ответов
  • 54029 Просмотров
*

Delfi

  • Захожу иногда
  • 53
  • 13 / 0
Покопавшись по форумам понял, что вопрос экспорта в ЯМ хоть и актуален, но предложены только платные скрипты.

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

За основу взял какой-то скрипт для VM, переделал по JoomlaShopping.

Спойлер
[свернуть]

Что сделано -
1. Выбирает все опубликованные товары, все категории.
2. Прописывает extra поля в виде параметров товара
3. Скрипт переписан с устаревших функций mysql_connect на PDO, что должно отразиться на скорости и безопасности

Возможные недоработки -
1. Не все дополнительные поля выводит, но я делал под магазин заказчика, может у других будет иначе.
2. Не совсем правильный запрос на товары. Из-за подзапроса к категориям идет выборка огромного количества полей, т.е. появляется много дублей. Скажем, у меня 300 товаров и 300 соотношений "категория-товар" - в итоге получается 900000 строк. Подавляется с помощью GROUP, да и сам скрипт вывода проверяет - был ли выведен уже товар или нет. Но это небольшой костыль. Буду рад помощи в оптимизации скрипта.
3. Не совсем недоработка, но все же. ЯМ предполагает по 1 категории на товар. Поэтому если в магазине больше 1 категории у товара, то выбирается только одна, тут уж ничего не поделаешь.

На 350 товаров в базе тратится что-то вроде 1 секунды на запрос, что с одной стороны быстро, но с другой - не достаточно оптимизированно.
Есть мысли по поводу более корректной выборки категорий?

И да, не забываем прописать в .htaccess в корне сайта

Код: php-brief
AddType application/x-httpd-php .php .html .phtml .htm .yml

Чтобы файлы с расширением yml обрабатывались как php скрипты. Возможно, на вашем хостинге это не сработает, тогда переименуйте yml в php. Яндексу без разницы.


Возможные ошибки:
Спойлер
[свернуть]


UPD. Проверку в Яндексе прошел, подправил 2 момента - заголовок сделал text/xml (не критично, просто чтобы браузер воспринимал как XML и красивенько рисовал деревья) и проверку на 0 цену. Т.е. если цена 0, то не выводит товар, ибо валидатор яндекса ругался.

UPD2 Проверили на Joomla 3 + JS 4  - возникает ошибка при выборке товаров, насколько я понял. Пока проблема присутствует.

UPD3 Сейчас ковыряю последнюю версию магазина и понимаю, что там значительно отличается структура хранения дополнительных характеристик, как минимум - введен мульти-выбор из списка, т.е. присутствует отдельная таблица Ключ -> Значение характеристики, а в таблице с продуктом хранится только ключ в дополнительном поле. Если указано несколько характеристик, то они хранятся через запятую. Это не учитывалось в данном модуле, поэтому требуются доработки.

[вложение удалено Администратором]
« Последнее редактирование: 19.12.2012, 08:27:28 от Delfi »
*

nevigen

  • Moderator
  • 10431
  • 862 / 25
  • http://n*****n.com
молодца.
Добавил в ФАК
« Последнее редактирование: 09.11.2012, 10:48:45 от nevigen »
Профессиональные / Бесплатные решения для JoomShopping
Не лечи бесплатно, ибо тот, кто лечится бесплатно, рано или поздно перестает ценить свое здоровье,
а тот, кто лечит бесплатно, рано или поздно перестает ценить результаты своего труда/ (с) Гиппократ?
Не ищите ответов, ищите решение !
*

evpadallas

  • Захожу иногда
  • 171
  • 42 / 1
В SQL запросах надо поправить GROUP BY n60v2_jshopping_products.product_id
на GROUP BY {$cfg->dbprefix}jshopping_products.product_id

И спасибо за труд! + в репу
« Последнее редактирование: 09.11.2012, 10:12:58 от evpadallas »
*

Delfi

  • Захожу иногда
  • 53
  • 13 / 0
В SQL запросах надо поправить GROUP BY n60v2_jshopping_products.product_id
на GROUP BY {$cfg->dbprefix}jshopping_products.product_id

И спасибо за труд! + в репу

Спасибо за замечание, поправил, в шапку перезалил.
*

Delfi

  • Захожу иногда
  • 53
  • 13 / 0
хм, насколько помню Яндекс прекрасно брал адрес с .php - зачем изголятся с .yml? 

Не думаю, что это принципиально. Можно и в php сохранить, в чем проблема? Дело вкуса)
*

igalko

  • Осваиваюсь на форуме
  • 47
  • 1 / 1
Яндек при проверке выдал следующее -
Предупреждение: Кодировка XML не определена (строка 0, столбец 0)
Фатальная ошибка: Ошибка парсинга XML: Error parsing XML feed: Invalid document structure (строка 35, столбец 50)

В чем может быть вопрос?
« Последнее редактирование: 04.12.2012, 14:48:25 от igalko »
*

Delfi

  • Захожу иногда
  • 53
  • 13 / 0
Яндек при проверке выдал следующее -
Предупреждение: Кодировка XML не определена (строка 0, столбец 0)
Фатальная ошибка: Ошибка парсинга XML: Error parsing XML feed: An exception occurred! Type:UTFDataFormatException, Message:invalid byte 2 (�) of a 2-byte sequence. (строка 1, столбец 1)

В чем может быть вопрос?

Полагаю, что файл со скриптом сохранен в utf-8 + bom. Через Notepad++ или другие попробуй сохранить в utf-8 без bom

Судя по всему - в самом начале ставится невидимый символ.

Если не так, то ссылку на вывод скрипта в личку или сюда можно скинуть, посмотрю.
*

igalko

  • Осваиваюсь на форуме
  • 47
  • 1 / 1
Полагаю, что файл со скриптом сохранен в utf-8 + bom. Через Notepad++ или другие попробуй сохранить в utf-8 без bom
сохранение делал через акелпад без bom и с bom, после этого поменялось только сообщение по парсингу.
Ссылку кидаю в личку, спасибо)
*

segal

  • Осваиваюсь на форуме
  • 41
  • 0 / 1
Предупреждение: Кодировка XML не определена (строка 0, столбец 0)
Фатальная ошибка: Ошибка парсинга XML: Error parsing XML feed: An exception occurred! Type:UTFDataFormatException, Message:invalid byte 2 (�) of a 2-byte sequence. (строка 1, столбец 1)

подскажите что делать?
*

Delfi

  • Захожу иногда
  • 53
  • 13 / 0
Предупреждение: Кодировка XML не определена (строка 0, столбец 0)
Фатальная ошибка: Ошибка парсинга XML: Error parsing XML feed: An exception occurred! Type:UTFDataFormatException, Message:invalid byte 2 (�) of a 2-byte sequence. (строка 1, столбец 1)

подскажите что делать?

Это проделали?

"И да, не забываем прописать в .htaccess в корне сайта

Код
AddType application/x-httpd-php .php .html .phtml .htm .yml
"

Что показывает по ссылке, которую скармливаете яндексу? Если там виден просто php код, то пункт выше не срабатывает, либо не сделан.
Переименуйте с yml на php, должно сработать
*

segal

  • Осваиваюсь на форуме
  • 41
  • 0 / 1
спасибо за отзывчивость, в .htaccess всё прописано, переименовал в PHP всё равно ничего (

Предупреждение: Кодировка XML не определена (строка 0, столбец 0)
Фатальная ошибка: Ошибка парсинга XML: Error parsing XML feed: An exception occurred! Type:UTFDataFormatException, Message:invalid byte 2 (�) of a 2-byte sequence. (строка 1, столбец 1)  --  что тут надо проделать, сорри я просто ваще нуб в этом(
*

Delfi

  • Захожу иногда
  • 53
  • 13 / 0
спасибо за отзывчивость, в .htaccess всё прописано, переименовал в PHP всё равно ничего (

Предупреждение: Кодировка XML не определена (строка 0, столбец 0)
Фатальная ошибка: Ошибка парсинга XML: Error parsing XML feed: An exception occurred! Type:UTFDataFormatException, Message:invalid byte 2 (�) of a 2-byte sequence. (строка 1, столбец 1)  --  что тут надо проделать, сорри я просто ваще нуб в этом(

Так что сам скрипт выдает на выходе? Так сложно понять.

Какая версия Joomla и магазина?
*

segal

  • Осваиваюсь на форуме
  • 41
  • 0 / 1
скрипт пишет эту ошибку, Предупреждение: Кодировка XML не определена (строка 0, столбец 0)
Фатальная ошибка: Ошибка парсинга XML: Error parsing XML feed: An exception occurred! Type:UTFDataFormatException, Message:invalid byte 2 (�) of a 2-byte sequence. (строка 1, столбец 1)

версия Joomla последняя, версия JoomlaSHOPING  тоже последняя


можете скинуть готовый YML экспорт файл? я походу че та не то там вписываю((
« Последнее редактирование: 04.12.2012, 18:37:42 от segal »
*

igalko

  • Осваиваюсь на форуме
  • 47
  • 1 / 1
скрипт пишет эту ошибку, Предупреждение: Кодировка XML не определена (строка 0, столбец 0)
Фатальная ошибка: Ошибка парсинга XML: Error parsing XML feed: An exception occurred! Type:UTFDataFormatException, Message:invalid byte 2 (�) of a 2-byte sequence. (строка 1, столбец 1)
версия Joomla последняя, версия JoomlaSHOPING  тоже последняя
Похоже ситуация один в один
*

falur

  • Осваиваюсь на форуме
  • 44
  • 4 / 0
Что-то с запросом
Выдает ошибку
Цитировать
Call to a member function fetch() on a non-object
меняю запрос на
Код
SELECT * FROM {$tb_product}
все нормально
« Последнее редактирование: 10.12.2012, 00:38:31 от falur »
*

falur

  • Осваиваюсь на форуме
  • 44
  • 4 / 0
В запросе исправил часть на
SELECT
         {$tb_product}.product_id,
         {$tb_manufacturer}.`name_ru-RU` as mf_name,
         {$tb_manufacturer}.manufacturer_id,
         {$tb_product_category_xref}.category_id,
         {$tb_product}.`name_ru-RU` as product_name,
         {$tb_product}.product_price,
         {$tb_product}.product_id as `product_sku`,
         {$tb_product}.product_quantity,
         {$tb_product}.`product_full_image` as `product_full_image`,
         {$tb_product}.`short_description_ru-RU` as `product_s_desc`

стало работать прайс выводит нормально, НО категории проставляет неправильно и если вставлять {$extra_select} то все равно выдает ошибку
*

Delfi

  • Захожу иногда
  • 53
  • 13 / 0
В запросе исправил часть на
SELECT
         {$tb_product}.product_id,
         {$tb_manufacturer}.`name_ru-RU` as mf_name,
         {$tb_manufacturer}.manufacturer_id,
         {$tb_product_category_xref}.category_id,
         {$tb_product}.`name_ru-RU` as product_name,
         {$tb_product}.product_price,
         {$tb_product}.product_id as `product_sku`,
         {$tb_product}.product_quantity,
         {$tb_product}.`product_full_image` as `product_full_image`,
         {$tb_product}.`short_description_ru-RU` as `product_s_desc`

стало работать прайс выводит нормально, НО категории проставляет неправильно и если вставлять {$extra_select} то все равно выдает ошибку

Слишком мало данных.

Пробуем перед
$query = "
      SELECT
         {$extra_select}

Поставить echo, т.е. вывести запрос в браузер. Скопировать его, вставить в phpMyAdmin и посмотреть - выдаются результаты или ошибка. И ошибку озвучить здесь.

Если сделать SELECT * FROM {$tb_product}, то будет не пойми чего, т.к. выдергиваем данные с разных таблиц + не лучшим образом сказывается на производительности и потреблении памяти. ИМХО.
*

falur

  • Осваиваюсь на форуме
  • 44
  • 4 / 0
спасибо за ответ с экстра селект разобрался, проблема была в том что поля extra_field у меня были не по порядку. а в таком порядке 
Код
extra_field_3 	extra_field_4 	extra_field_6 	extra_field_7 	extra_field_10 	extra_field_12 и т.д.
а скрипт выводит подряд
Код
extra_field_1 	extra_field_2 	extra_field_3 	extra_field_4 	extra_field_5 	extra_field_6 и т.д.
поменял немного код

Код
try {
   
$pdo = new PDO("mysql:host={$hostname};dbname={$dbName}", $username, $password);
    // Исправьте, если у вас другая кодировка в БД
    $pdo->exec('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";
$res = $pdo->query("SELECT * FROM $category");
while ($row_cat= $res->fetch(PDO::FETCH_ASSOC)) {
$cat_parent_id=$row_cat['category_parent_id'];
$parent = ($cat_parent_id != 0)? " parentId=\"{$cat_parent_id}\"" : "";
echo "<category id=\"{$row_cat['category_id']}\"{$parent}>{$row_cat['name_ru-RU']}</category>\n";
}
unset($res);
echo"</categories>\n";
 
// Секция описания товаров
echo"<offers>\n";
 
 
$res = $pdo->query("SELECT id, 'name_ru-RU' as name FROM {$cfg->dbprefix}jshopping_products_extra_fields");
 
$extra_info = $res->fetchAll(PDO::FETCH_ASSOC);
$extra_info = nomalizeArray($extra_info, 'name');
    //print_r ($extra_info);
//if (array_key_exists(3, $extra_info)) echo 'da'; else echo 'net';


$extra_select = '';
$extra_cnt = count($extra_info);
if($extra_cnt != 0) {
for($i = 1; $i <= $extra_cnt; $i++)
if (array_key_exists($i, $extra_info)) $extra_select .= "{$tb_product}.extra_field_{$i},"; else $extra_cnt++;
}
echo $query = "
SELECT
{$extra_select}
{$tb_product}.product_id,
{$tb_manufacturer}.`name_ru-RU` as mf_name,
{$tb_manufacturer}.manufacturer_id,
{$tb_product_category_xref}.category_id,
{$tb_product}.`name_ru-RU` as product_name,
{$tb_product}.product_price,
{$tb_product}.product_id as `product_sku`,
{$tb_product}.product_quantity,
{$tb_product}.`product_full_image` as `product_full_image`,
{$tb_product}.`short_description_ru-RU` as `product_s_desc`
FROM
{$tb_product}
LEFT JOIN {$tb_product_category_xref}
ON {$tb_product}.product_id = (SELECT {$tb_product_category_xref}.product_id
FROM {$tb_product_category_xref}
WHERE  {$tb_product_category_xref}.product_id = {$tb_product}.product_id
GROUP BY {$tb_product_category_xref}.product_id)
LEFT JOIN {$tb_manufacturer}
ON {$tb_product}.product_manufacturer_id = {$tb_manufacturer}.manufacturer_id
 
WHERE {$tb_product}.product_publish='1'
GROUP BY {$tb_product}.product_id
";
 
$product_log = Array();
$res = $pdo->query($query);
 
    while ($row = $res->fetch(PDO::FETCH_ASSOC)) {
if (!in_array($row['product_id'],$product_log) && ($row['product_price']) && $row['product_price'] > 0) {
$product_log[] = $row['product_id'];
$product_price = substr($row['product_price'], 0, -3);
echo "\n<offer id=\"".$row['product_id']."\" available=\"true\" bid=\"$bid\">\n";
echo "<url>http://$cfg_url/component/jshopping/product/view/{$row['category_id']}/{$row['product_id']}</url>\n";
echo "<price>$product_price</price>\n";
// Валюта в которой указаны Ваши цены
echo "<currencyId>".$currency."</currencyId>\n";
echo "<categoryId>".$row['category_id']."</categoryId>\n";
 
if(!empty($row['product_full_image'])) {
echo "<picture>http://$cfg_url/components/com_jshopping/files/img_products/{$row['product_full_image']}</picture>\n";
}
 
// Возможность доставки
echo "<delivery>true</delivery> \n";
echo "<name>".$row['product_name']."</name>\n";
echo "<description>".htmlspecialchars(strip_tags($row['product_s_desc']))."</description>\n";
for($i = 1; $i <= $extra_cnt; $i++) {
if(!empty($row['extra_field_'.$i])) {
 
//var_dump($row['extra_field_'.$i]);
echo "<param name=\"{$extra_info[$i]}\">".htmlspecialchars($row['extra_field_'.$i])."</param>\n";
}
}
echo "</offer>\n";
}
}
 
 
echo"</offers>\n";
echo"</shop>\n";
echo"</yml_catalog>\n";
 
} catch (Exception $e) {
    echo $e->getMessage();
}
 
 
function nomalizeArray($arr, $val, $key = 'id') {
$newArr = Array();
foreach($arr as $k => $v) {
$newArr[$v[$key]] = $v[$val];
}
return $newArr;
}
 

но проблему с категориями так и не решил, всем товарам id категории присваивается 1
*

Delfi

  • Захожу иногда
  • 53
  • 13 / 0
Спасибо за участие. Подправлю код чуть позже. Не забываю о доделках, просто времени сейчас в обрез перед НГ. Много дел.
*

Delfi

  • Захожу иногда
  • 53
  • 13 / 0

но проблему с категориями так и не решил, всем товарам id категории присваивается 1

Тут надо копать в сторону подзапроса

Код: sql
LEFT JOIN {$tb_product_category_xref}
ON {$tb_product}.product_id = (SELECT {$tb_product_category_xref}.product_id
FROM {$tb_product_category_xref}
WHERE  {$tb_product_category_xref}.product_id = {$tb_product}.product_id
GROUP BY {$tb_product_category_xref}.product_id)

Есть возможность посмотреть, что возвращает SQL запрос?

В JoomShopping еще есть мультикатегории, а Яндекс берет только одну. Запрос по идее выбирает первую категорию, находящуюся по порядку в таблице product_category_xref
Что у Вас в ней, если открыть через phpMyAdmin? Может есть, скажем, главная категория, к которой привязаны все товары? А потом уже второй категорией выбрана нужная?
*

cellissimo

  • Осваиваюсь на форуме
  • 23
  • 0 / 0
этот модуль будет работать с Jshop 3.5.1 ?

Пожалуйста, подскажите...
*

kurandin

  • Захожу иногда
  • 159
  • 5 / 0
Классно сделано )

подскажите, куда этот файл ставить и как запускать?
*

Delfi

  • Захожу иногда
  • 53
  • 13 / 0
этот модуль будет работать с Jshop 3.5.1 ?

Пожалуйста, подскажите...

Делал под Version 3.6.1, думаю, должно пойти. Надо пробовать.

Классно сделано )

подскажите, куда этот файл ставить и как запускать?

На самом деле там еще много правок надо делать.

Надо файлик поместить в корень сайта или создать папку в корне и положить в нее. По сути - без разницы, главное правильно указать путь к файлу configuration.php.


Сейчас ковыряю последнюю версию магазина и понимаю, что там значительно отличается структура хранения дополнительных характеристик, как минимум - введен мульти-выбор из списка, т.е. присутствует отдельная таблица Ключ -> Значение характеристики, а в таблице с продуктом хранится только ключ в дополнительном поле. Если указано несколько характеристик, то они хранятся через запятую. Это не учитывалось в данном модуле, поэтому требуются доработки.
*

donvincento

  • Осваиваюсь на форуме
  • 31
  • 0 / 0
"Fatal error: Call to a member function fetch() on a non-object in Z:\home\shop1\www\wer\qwe.php on line 53"

Из-за чего это ?
*

Delfi

  • Захожу иногда
  • 53
  • 13 / 0
"Fatal error: Call to a member function fetch() on a non-object in Z:\home\shop1\www\wer\qwe.php on line 53"

Из-за чего это ?

Что-то не так с запросом. Ошибка MySQL, поэтому не может извлечь данные запроса
*

donvincento

  • Осваиваюсь на форуме
  • 31
  • 0 / 0
 Спасибо. Кажется я сам перемудрил :) Разбираюсь ...
*

kontrast

  • Захожу иногда
  • 122
  • 2 / 0
закинул скрипт на сайт Joomla 2.5.8 с джумшопингом 3.12.1
переименовал в PHP
и запустил что б увидить готовый файл
но увидил лиш
Код
XML Parsing Error: no element found
Location: http://ххххххх.хх/export.php
Line Number 19, Column 1:
^

в чем проблема неподскажите?
*

Delfi

  • Захожу иногда
  • 53
  • 13 / 0
закинул скрипт на сайт Joomla 2.5.8 с джумшопингом 3.12.1
переименовал в PHP
и запустил что б увидить готовый файл
но увидил лиш
Код
XML Parsing Error: no element found
Location: http://ххххххх.хх/export.php
Line Number 19, Column 1:
^

в чем проблема неподскажите?

Читаем лучше тему.

Чтобы понять, надо посмотреть что выводит скрипт. Зачем задавать миллион одинаковых вопросов. Выше написано про новую версию JS
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Импорт/экспорт

Автор apirat

Ответов: 903
Просмотров: 180808
Последний ответ 17.06.2022, 21:10:28
от marksetter
Интеграция с Yandex.Market (заказы)

Автор Mikle_Shaman

Ответов: 10
Просмотров: 1322
Последний ответ 27.04.2022, 10:14:17
от Mikle_Shaman
Импорт товаров в Яндекс.Объявления

Автор demll

Ответов: 1
Просмотров: 1351
Последний ответ 04.02.2021, 09:32:19
от khan-alex
Для настройки Яндекс Маркет

Автор stardel

Ответов: 6
Просмотров: 2566
Последний ответ 03.12.2019, 20:00:35
от zikkuratvk
Перенос товаров из магазнина на Joomla 2.5 на Joomla 3.9

Автор dron

Ответов: 3
Просмотров: 1636
Последний ответ 09.04.2019, 14:27:51
от nevigen