Перейти к содержанию
Fakamaz

Яндекс маркет... неправлеьное отображение

Рекомендуемые сообщения

помогите пожалуйста... Как я понял должен отображатся код в формате xml.

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

Вот исходник yml.php

<?php

class ControllerExportYml extends Controller {

public function index() {

if ($this->config->get('yandex_market_status')) {

$output = '<?xml version="1.0" encoding="utf-8" ?>';

$output .= '<!DOCTYPE yml_catalog SYSTEM "shops.dtd">';

$output .= '<yml_catalog date="' . date("Y-m-d H:m") . '">';

$output .= '<shop>' . "\n";

$output .= '<name>' . $this->config->get('config_store') . '</name>';

$output .= '<company>' . $this->config->get('config_meta_description') . '</company>';

$output .= '<url>' . HTTP_SERVER . '</url>'. "\n";

// Перечесляем валюту магазина

// TODO: Добавить возможность настраивать проценты.

$output .= '<currencies>';

$output .= '<currency id="RUR" rate="1"/>';

$output .= '</currencies>';

// Категории товаров

$this->load->model('catalog/category');

$output .= '<categories>';

$output .= $this->getCat();

$output .= '</categories>';

// Товарные позиции

$this->load->model('catalog/product');

$this->load->model('tool/image');

$output .= '<offers>';

$products = $this->model_catalog_product->getProducts();

foreach ($products as $product) {

$output .= '<offer id="'.$product['product_id'].'" available="true" bid="13">';

$output .= '<url>'.(HTTP_SERVER . 'index.php?token=' . $this->session->data['token'] . '&route=product/product&product_id=' . $product['product_id']).'</url>';

$output .= '<price>' . $this->tax->calculate($product['price'], $product['tax_class_id']) . '</price>';

$output .= '<currencyId>RUR</currencyId>';

// Определяем категорию для товара

$categories = $this->model_catalog_product->getCategories($product['product_id']);

$output .= '<categoryId>'.$categories[0]['category_id'].'</categoryId>';

// Определеяме изображение

if ($product['image']) {

$output .= '<picture>' . $this->model_tool_image->resize($product['image'], 500, 500) . '</picture>';

} else {

$output .= '<picture>' . $this->model_tool_image->resize('no_image.jpg', 500, 500) . '</picture>';

}

$output .= '<delivery> true </delivery>';

$output .= '<local_delivery_cost>300</local_delivery_cost>';

// $output .= '<typePrefix> </typePrefix>';

$output .= '<vendor>' . $product['manufacturer'] . '</vendor>';

// $output .= '<vendorCode> </vendorCode>';

$output .= '<model>'.$product['model'].'</model>';

$output .= '<description>'.htmlspecialchars(strip_tags(html_entity_decode($product['description']))) .' </description>';

$output .= '<manufacturer_warranty>true</manufacturer_warranty>';

$output .= '</offer>';

}

$output .= '</offers>';

$output .= '</shop>';

$output .= '</yml_catalog>';

$this->response->addHeader('Content-Type: application/xml');

$this->response->setOutput($output);

}

}

// Возвращает массив категорий

protected function getCat($pi=0) {

$categories = $this->model_catalog_category->getCategories($pi);

$out = '';

foreach ($categories as $category) {

$out .= '<category id="'.$category['category_id'].'"';

if($pi != 0) $out .= ' parentId="'.$pi.'"';

$out .='>'.$category['name'].'</category>';

if($e = $this->getCat($category['category_id'])) $out .= $e;

}

return $out;

}

}

?>

И ещё вопрос как исправить ссылку http://***/index.php?route=export/yml На http://***/ya.yml

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

помогите пожалуйста... Как я понял должен отображатся код в формате xml.

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

Править еще не закончил, но этот вариант гораздо лучше текущего

Архив распаковать в корень, в админке прописать валюту и компанию.

И ещё вопрос как исправить ссылку http://***/index.php?route=export/yml На http://***/ya.yml

В .htaccess после

RewriteBase /

добавить

RewriteRule ^ya.yml$ index.php?route=export/yml [L]

yml.zip

  • +1 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что-то с валютой не то...

Когда ставлю баксы - пишет:

Фатальная ошибка: Валюту USD нельзя использовать в качестве основной (строка 10, столбец 30)
Это, в принципе, понятно, т.к. по правилам ЯМ баксы, евро и т.д. нельзя использовать в качестве основной валюты.

Когда ставлю UAH:

Фатальная ошибка: Wrong rate value - too strong difference with CBRF rate: feed value: 0.09, national bank value: 11.2829 (строка 13, столбец 14)
Фатальная ошибка: Фид отклонен
Я так понимаю, это из-за того, что в сформированном файле валюты отображаютя так:

<currencies>
<currency id="UAH" rate="1"/>
<currency id="EUR" rate="0.09"/>
<currency id="USD" rate="0.1250"/>
</currencies>
А должны отображаться, примерно, так (как это настроено в моём магазине):

<currencies>
<currency id="UAH" rate="1"/>
<currency id="EUR" rate="11.11"/>
<currency id="USD" rate="8"/>
</currencies>
Т.е., переводит валюты "не в ту сторону". Хотя, если посмотреть цену товара, сформированную в файле, выдаваемом yml - то она правильно переводится. Например, если у меня что-то стоит 1 бакс, то при указании в модуле yml основной валюты - "ГРН", модуль выводит цену - 8 грн. (т.е., всё правильно).

Может эти приколы происходят из-за того, что у меня в магазине основаной валютой стоит бакс (цены на товары ввожу в долларах)? Надо бы как-то сие исправить.

ЗЫ. Кстати, так и не понял, при чём там в отлупе "CBRF" и "national bank"? Если "national bank" ещё как-то понять можно (магазин работает в Украине), то российский Центробанк здесь каким боком? Да и вообще, зачем с банками сравнивать валюту? У меня стоит внутренный курс, который я выставляю сам. При чём тут банки? Это мулька ЯМ? Т.е., он, в любом случае, будет сравнивать с банками? Или это косяк модуля yml?

ЗЗЫ. Yesvik, в любом случае, спасибо, что взялся переделывать. Там остальное гораздо лучше выглядит, чем в оригинальном, криво сделанном, модуле. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что-то с валютой не то...

Когда ставлю баксы - пишет:

Фатальная ошибка: Валюту USD нельзя использовать в качестве основной (строка 10, столбец 30)
Это, в принципе, понятно, т.к. по правилам ЯМ баксы, евро и т.д. нельзя использовать в качестве основной валюты.
Я упустил этот момент, исправлю так что-бы нельзя было выбрать USD и EUR.

Когда ставлю UAH:

Фатальная ошибка: Wrong rate value - too strong difference with CBRF rate: feed value: 0.09, national bank value: 11.2829 (строка 13, столбец 14)
Фатальная ошибка: Фид отклонен
Я так понимаю, это из-за того, что в сформированном файле валюты отображаютя так:

<currencies>
<currency id="UAH" rate="1"/>
<currency id="EUR" rate="0.09"/>
<currency id="USD" rate="0.1250"/>
</currencies>
Какая валюта указана в Система->Настройка->Размещение->Валюта?

Какая валюта указана по умолчанию в Система->Локализация->Валюты?

ЗЫ. Кстати, так и не понял, при чём там в отлупе "CBRF" и "national bank"? Если "national bank" ещё как-то понять можно (магазин работает в Украине), то российский Центробанк здесь каким боком? Да и вообще, зачем с банками сравнивать валюту? У меня стоит внутренный курс, который я выставляю сам. При чём тут банки? Это мулька ЯМ? Т.е., он, в любом случае, будет сравнивать с банками? Или это косяк модуля yml?

Это мулька ЯМ. При слишком значительном (больше 30%) отличии значения курса валюты от курса ЦБ РФ или НБУ информационные материалы считаются невалидными.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Какая валюта указана в Система->Настройка->Размещение->Валюта?

USD

Какая валюта указана по умолчанию в Система->Локализация->Валюты?

USD

Цены ввожу в долларах (так мне гораздо удобнее). Продаю, согласно законодательства, в гривнах. :)

UPD

Резюмирую проблему:

В отображении товаров валюту конвертирует правильно. Т.е., там всё нормально.

А в отображении курсов валют, в теге <currencies>, отображает курс неправильно (не в ту сторону переводит). :)

Изменено пользователем monax

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А в отображении курсов валют, в теге <currencies>, отображает курс неправильно (не в ту сторону переводит). :)

Действительно, я с курсами начудил... выводил обратную величину.

В файле catalog/controller/export/yml.php найди строку (у меня это строка № 31)

$output .= '<currency id="' . $currency['code'] . '" rate="' . number_format ($this->currency->convert($currency['value'], $offers_currency, $shop_currency), 4, '.', '') . '"/>' . $eof;
и измени её вот так

$output .= '<currency id="' . $currency['code'] . '" rate="' . number_format (1/$this->currency->convert($currency['value'], $offers_currency, $shop_currency), 4, '.', '') . '"/>' . $eof;
  • +1 2

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

C валютой теперь нормально. Но опять полезла ошибка:

Фатальная ошибка: Ошибка парсинга XML: Error parsing XML feed: Element 'model' is not valid for content model: '(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*)' (строка 71, столбец 9)
Как эту 71 строку найти, а в ней 9 столбец? Если открываю в Опере - там по-своему строки выдаёт, если в IE - там по-другому. А в Хроме ваще всё одной строкой...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

C валютой теперь нормально. Но опять полезла ошибка:

Фатальная ошибка: Ошибка парсинга XML: Error parsing XML feed: Element 'model' is not valid for content model: '(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*)' (строка 71, столбец 9)
Как эту 71 строку найти, а в ней 9 столбец? Если открываю в Опере - там по-своему строки выдаёт, если в IE - там по-другому. А в Хроме ваще всё одной строкой...
В 9 столбце строки 71 заканчивается элемент offer... но дело не в этом.

Дело в том что схема позволяет или vendor,vendorCode?,model или name,vendor?,vendorCode?

Другими словами name и model вместе не живут.

Для твоих товаров, мне кажется, больше подходит name,vendor?,vendorCode

Измени <model></model> на <vendorCode></vendorCode>

И ещё... В name элемента shop должно быть не более 20 символов, а у тебя в name 37 символов. Думаю надо в админке сделать ввод для поля name, как для company.

  • +1 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Yesvik, спасибо большое! Получилось. Даже не верится, что проверка прошла... :) Я уж думал, что ЯМ никогда не захавает мой файл! :)

ЗЫ. Дорисовал в админке ввод поля name, всё работает.

ЗЗЫ. Есть ещё пожелание по доработке. :rolleyes: Модуль выводит все введённые товары. А надо бы выводить только те товары, которые есть в наличии. Можешь прикрутить такое условие?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ЗЗЫ. Есть ещё пожелание по доработке. :rolleyes: Модуль выводит все введённые товары. А надо бы выводить только те товары, которые есть в наличии. Можешь прикрутить такое условие?

Готового метода получения списка товаров имеющихся в наличии в OpenCart я не нашёл.

По хорошему надо написать запрос с проверкой количества, но самый простой метод решения этой задачи - проверять количество при формировании элементов offer

В файле catalog/controller/export/yml.php найди строку

foreach ($products as $product) {
и после этой строки добавь такую строку

if (!$product['quantity'] > 0) continue;

Если есть желание решить эту задачу на уровне SQL запроса - то в файле catalog/controller/export/yml.php вместо

$products = $this->model_catalog_product->getProducts();
надо написать

$query = $this->db->query("SELECT DISTINCT *, pd.name AS name, p.image, m.name AS manufacturer, ss.name AS stock, wcd.unit AS weight_class FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) LEFT JOIN " . DB_PREFIX . "manufacturer m ON (p.manufacturer_id = m.manufacturer_id) LEFT JOIN " . DB_PREFIX . "stock_status ss ON (p.stock_status_id = ss.stock_status_id) LEFT JOIN " . DB_PREFIX . "weight_class_description wcd ON (p.weight_class_id = wcd.weight_class_id) WHERE pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND wcd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND ss.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p.date_available <= NOW() AND p.status = '1' AND p.quantity > 0");
$products = $query->rows;
  • +1 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А какой вариант лучше? Т.е., какие плюсы и минусы у каждого варианта?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А какой вариант лучше? Т.е., какие плюсы и минусы у каждого варианта?

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

Второй вариант извлечёт из базы только те товары которые нужны для построения элементов offer, но если изменится структура данных надо будет вносить изменения в этот запрос.

Как по мне - второй вариант лучше. Я об этом намекал - "По хорошему надо написать запрос с проверкой количества"

И ещё... Времени не было и я к существующему запросу добавил условие на количество. Немного освобожусь и займусь допиливанием выгрузки на ЯМ, тогда и построю запрос полегче.

  • +1 2

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Определена кодировка: utf-8 (строка 0, столбец 0)

Дата из файла: 2011-04-09 02:07 (строка 3, столбец 127)

Предупреждение: Некорректный URL адрес картинки предложения: http://***/image/cache/data/clarion vma773-500x500.jpg (строка 1735, столбец 9)

Надо сделать чтобы яндекс видел эти изображения!

Пробывал так:

$img_v = $this->model_tool_image->resize($product['image'], 500, 500);

$output .= '<picture>' . str_replace(' ', '%20', $img_v . '</picture>' . $eof;

не получилось подскажите как сделать!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пробывал так:

$output .= '<picture>' . str_replace(' ', '%20', $img_v . '</picture>' . $eof;

Если пробывал именно так, то естественно не получится из-за синтаксической ошибки... пропущена закрывающая скобка.

Попробуй так:

$output .= '<picture>' . str_replace(' ', '%20', $img_v) . '</picture>' . $eof;
или так:

$output .= '<picture>' . str_replace(' ', '+', $img_v) . '</picture>' . $eof;

А лучше всего - никогда не использовать пробелы в именах файлов.

Изменено пользователем Yesvik
  • +1 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

не помогает... Я бы правил бы картинки но их слишком много :( может кто нибудь ещё решение знает?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

не помогает... Я бы правил бы картинки но их слишком много :( может кто нибудь ещё решение знает?

"слишком много" - это сколько?

Скопируй в корень сайта прикреплённый файл, и выполни его набрав в адресной строке браузера domain.tld/imgrename.php

после того как увидиш Ok! - удали файл imgrename.php, и желательно удалить или очистить директорию /image/cache/data/

Пробелы будут заменены на подчерк в именах файлов и в БД.

imgrename.php

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Выкладываю архив с исправлениями которые обсуждались в этой теме

yml.zip

  • +1 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо! Давно искал поправленый модуль, думаю вам его стоит внедрить в основной модуль в основную сборку. Кстати есть небольшой глюк если например удалить все валюты кроме рублей то начинает ругатся на разницу валют :) но это мелочи

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо! Давно искал поправленый модуль, думаю вам его стоит внедрить в основной модуль в основную сборку. Кстати есть небольшой глюк если например удалить все валюты кроме рублей то начинает ругатся на разницу валют :) но это мелочи

А можно точный текст ругани почитать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А можно точный текст ругани почитать?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Я выкладывал два варианта экспорта: 3 и 11 апреля, с каким вариантом возникала ошибка?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Последний архив от 11 апреля. Можете сами попробовать у себя например удалить все валюты кроме рубля, думаю эта ошибка и появится

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А у меня выводит ошибку Ошибка HTTP 500 (Internal Server Error): и не знаю что делать, ни в браузере не могу открыть файл ни яндекс.маркет не видет! В чем может быть проблема?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А у меня выводит ошибку Ошибка HTTP 500 (Internal Server Error): и не знаю что делать, ни в браузере не могу открыть файл ни яндекс.маркет не видет! В чем может быть проблема?

Попробуй в логи сервака заглянуть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

"слишком много" - это сколько?

Скопируй в корень сайта прикреплённый файл, и выполни его набрав в адресной строке браузера domain.tld/imgrename.php

после того как увидиш Ok! - удали файл imgrename.php, и желательно удалить или очистить директорию /image/cache/data/

Пробелы будут заменены на подчерк в именах файлов и в БД.

Спс помогло :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.