Jump to content

Экспорт продуктов в XML


Recommended Posts

PS v1.5.4.1 Нужно реализовать экспорт продуктов в XML для сайтa сравнения. XML должен иметь такой формат:

 

<? Xml version = "1.0" encoding = "utf-8"?>
<root>
<item>
			 <name> Shure SE210 </ name>
			 <link> http://www.myshop.com/ru/accessories-ipod/se210-blanc.html</link>
			 <price> 150.55 </ price>
			 <image> http://www.myshop.com/14-large_default/shure-se210.jpg </image>
			 <category_full> Accessories </category_full>
			 <category_link> http://www.myshop.com/ru/4-accessories-ipod</category_link>
			 <manufacturer> Shure Incorporated</manufacturer>
			 <model> SE210</model>
			 <in_stock> 7 </in_stock>
</ Item>
<item>
			 ...
</ Item>
</ Root>

 

Есть следующий скрипт, корректно генерирующий часть тэгов, но не все:

<?php
include(dirname(__FILE__).'/config/config.inc.php');
require_once(dirname(__FILE__).'/init.php');
// Get data
$number = (intval(Tools::getValue('n')) ? intval(Tools::getValue('n')) : 10000);
$orderByValues = array(0 => 'name', 1 => 'price', 2 => 'date_add', 3 => 'date_upd', 4 => 'position');
$orderWayValues = array(0 => 'ASC', 1 => 'DESC');
$orderBy = Tools::strtolower(Tools::getValue('orderby', $orderByValues[intval(Configuration::get('PS_PRODUCTS_ORDER_BY'))]));
$orderWay = Tools::strtoupper(Tools::getValue('orderway', $orderWayValues[intval(Configuration::get('PS_PRODUCTS_ORDER_WAY'))]));
if (!in_array($orderBy, $orderByValues))
$orderBy = $orderByValues[0];
if (!in_array($orderWay, $orderWayValues))
$orderWay = $orderWayValues[0];
//$id_category = (intval(Tools::getValue('id_category')) ? intval(Tools::getValue('id_category')) : 1);
$currency = new Currency(intval($cookie->id_currency));
$affiliate = (Tools::getValue('ac') ? '?ac='.Tools::getValue('ac') : '');

$categTree = Category::getRootCategory()->recurseLiteCategTree(0);

function constructTreeNode($node){
			$ret = ';';
			$ret .= $node['id'].'|'.$node['name'].';';
			if(!empty($node['children']))
			{
							$ret .= ';';
							foreach ($node['children'] AS $child)
											$ret .= constructTreeNode($child);
							$ret .= ';';
			}
			return $ret;
}
foreach ($categTree['children'] AS $child)
			$ulTree .= constructTreeNode($child);

$tab_cat=explode(';',$ulTree);
foreach ($tab_cat as $id2cat){
$tab_id2cat=explode('|',$id2cat);
if (!empty($tab_id2cat)) $tab_cat_final[$tab_id2cat[0]]=$tab_id2cat[1];
}

header("Content-Type:text/xml; charset=utf-8");
echo '<?xml version="1.0" encoding="UTF-8"?>'."\n";
?>
<root>
<?php
foreach ($tab_cat_final as $id_category=>$name_category){
$products = Product::getProducts(intval($cookie->id_lang), 0, ($number > 10000 ? 10000 : $number), $orderBy, $orderWay, $id_category, true);
foreach ($products AS $product)
{
 $image = Image::getImages(intval($cookie->id_lang), $product['id_product']);
 $prix=Product::getPriceStatic($product['id_product']);
 if ($product['reduction_percent']>0) $prix_promo=$prix*(1-$product['reduction_percent']/100);else $prix_promo=($prix-$product['reduction_price']);


 echo "<item>\n";
 echo "<name><![CDATA[".$product['name']."]]></name>\n";
															echo "<link><![CDATA[".htmlspecialchars($link->getproductLink($product['id_product'], $product['link_rewrite'], Tools::getValue('id_category'))).$affiliate."]]></link>\n";
 echo "<price>".$prix."</price>\n";
 echo "<image>"._PS_BASE_URL_.__PS_BASE_URI__."img/p/".$image[0]['id_product']."-".$image[0]['id_image']."-large.jpg</image>\n";
 echo "<category_full><![CDATA[".$name_category."]]></category_full>\n";
															echo "<category_link><![CDATA[".htmlspecialchars($link->getcategoryLink($category['id_category'], $category['link_rewrite'], Tools::getValue('id_category'))).$affiliate."]]></category_link>\n";
 echo "<manufacturer><![CDATA[".$product['manufacturer_name']."]]></manufacturer>\n";
 echo "<reference><![CDATA[".$product['id_product']."]]></reference>\n";
 echo "</item>\n";
}
}
?>
</root>

 

есть следующие проблемы:

 

1. неправильный формат цены: показывает 191.26073 вместо 191.26, или 65 вместо 65.00.

2. неправильный путь к картинке: http://mysite.com/img/p/8-27-large.jpg, должен быть: http://mysite.com/14...ult/picture.jpg

3. неправильный category_link: 'http://mysite.com/ru/-', вместо http://www.mysite.com/7-cellphones/

4. как получить модель <model> SE210 </model> и

5. количество в магазине <in_stock> 5 </in_stock> ?

Edited by galactic (see edit history)
Link to comment
Share on other sites

1. см. функцию number_format

2. Картинку можно получить так:

Context::getContext()->link->getImageLink($product['link_rewrite'], Image::getCover($product['id_product']), 'large_default');

3. Ссылка категории:

$cat = new Category($product['id_category_default']);

$link = $cat->getLink();

4. Модель - это скорее всего артикул ($product['reference'])

5. StockAvailable::getQuantityAvailableByProduct($product['id_product'], $product['id_product_attribute'])

Link to comment
Share on other sites

Еще очень рекомендую использовать SimpleXML, а не echo :)

A можешь показать, как должен выглядеть полный код с учётом указанных изменений?

Link to comment
Share on other sites

A можешь показать, как должен выглядеть полный код с учётом указанных изменений?

 

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

Link to comment
Share on other sites

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

 

ты не понял: я не прошу твою реализацию данного (несложного) скрипта на Simple XML, а прошу показать конкретно твои изменения в существующем коде. Хотя бы для того, чтобы увидеть, работают твои предложения или нет. A oбщие замечания смысла не имеют вообще.

Link to comment
Share on other sites

ты не понял: я не прошу твою реализацию данного (несложного) скрипта на Simple XML, а прошу показать конкретно твои изменения в существующем коде. Хотя бы для того, чтобы увидеть, работают твои предложения или нет. A oбщие замечания смысла не имеют вообще.

После такого поста тебе сразу же отправят 100500 готовых конкретных решений

Link to comment
Share on other sites

Еще очень рекомендую использовать SimpleXML, а не echo :)

 

SimpleXML при большом количестве товаров всю память сожрет.

Лучше echo и flush

Link to comment
Share on other sites

1. см. функцию number_format

2. Картинку можно получить так:

Context::getContext()->link->getImageLink($product['link_rewrite'], Image::getCover($product['id_product']), 'large_default');

3. Ссылка категории:

$cat = new Category($product['id_category_default']);

$link = $cat->getLink();

4. Модель - это скорее всего артикул ($product['reference'])

5. StockAvailable::getQuantityAvailableByProduct($product['id_product'], $product['id_product_attribute'])

 

пробовал твои предложения (кроме цены):

 

<root>
<?php
$default_currency = new Currency(Configuration::get('PS_CURRENCY_DEFAULT'));
foreach ($tab_cat_final as $id_category=>$name_category)
{
$products = Product::getProducts(intval($cookie->id_lang), 0, ($number > 10000 ? 10000 : $number), $orderBy, $orderWay, $id_category, true);
foreach ($products AS $product)
{
$price = Product::getPriceStatic($product['id_product']);
if ($product['reduction_percent'] > 0)
$prix_promo = $price * (1 - $product['reduction_percent'] / 100);
else
$prix_promo = ($price-$product['reduction_price']);

Context::getContext()->link->getImageLink($product['link_rewrite'], Image::getCover($product['id_product']), 'large_default');
StockAvailable::getQuantityAvailableByProduct($product['id_product'], $product['id_product_attribute'])

$cat = new Category($product['id_category_default']);
$link = $cat->getLink();

echo "<item>\n";
echo "<name><![CDATA[".$product['name']."]]></name>\n";
echo "<link><![CDATA[".htmlspecialchars($link->getproductLink($product['id_product'], $product['link_rewrite'], Tools::getValue('id_category'))).$affiliate."]]></link>\n";
echo "<price>".Tools::displayPrice($price, $default_currency)."</price>\n";
echo "<image>".$image_link."</image>\n";
echo "<category_full><![CDATA[".$name_category."]]></category_full>\n";
echo "<category_link><![CDATA[".$link."]]></category_link>\n";
echo "<manufacturer><![CDATA[".$product['manufacturer_name']."]]></manufacturer>\n";
echo "<reference><![CDATA[".$product['reference']."]]></reference>\n";
echo "<in_stock><![CDATA[".$product['id_product_attribute']."]]></in_stock>\n";
echo "</item>\n";
}
}
?>
</root>

 

скрипт выдаёт ошибку:

 

Parse error: syntax error, unexpected T_VARIABLE in /home/dsabcs/public_html/test.php on line 61

Edited by galactic (see edit history)
Link to comment
Share on other sites

Интерес одержал верх))

ты не понял: я не прошу твою реализацию данного (несложного) скрипта на Simple XML, а прошу показать конкретно твои изменения в существующем коде. Хотя бы для того, чтобы увидеть, работают твои предложения или нет. A oбщие замечания смысла не имеют вообще.

ну вот и готово.

Стоило 10 минут посидеть)

http://dev-prestashop.ru/1541/demo.php

Ни о каких часах нет речи!

стоит только вопрос модель это свойство или артикул.

и почему в <reference>$product['id_product']</reference>?

Edited by psjob (see edit history)
Link to comment
Share on other sites

Интерес одержал верх))

 

ну вот и готово.

Стоило 10 минут посидеть)

http://dev-prestashop.ru/1541/demo.php

Ни о каких часах нет речи!

стоит только вопрос модель это свойство или артикул.

и почему в <reference>$product['id_product']</reference>?

 

Mодель - это артикул товара (Reference), так точнее.

<model>6120</model>

 

В первом варианте <reference>$product['id_product']</reference> наверно напутано.

 

Но твой линк недоступен: Not Found (

The requested URL /1541/demo.php was not found on this server.

Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.

Edited by galactic (see edit history)
Link to comment
Share on other sites

смотри

Cамый первый и последний продукты дублируются? А также, откуда берётся количество, например iPod touch <in_stock>5</in_stock>? (на странице не выведено).Tы немного изменил скрипт под свой шаблон?

Edited by galactic (see edit history)
Link to comment
Share on other sites

на файл.там всё видно))

 

Cпасибо!)) Работает нормально. Одно маленькое замечание: у меня перед каждым продуктом он дублирует картинку, как заголовок:

</item>
http://site.com/15-large_default/ipod-nano.jpg
<item>
... ...

Edited by galactic (see edit history)
Link to comment
Share on other sites

Еще очень рекомендую использовать SimpleXML, а не echo :)

А вот кстати когда мы писали выгрузку на яндыкс-маркет, чото не срослось с SimpleXML и в результате получился file_put_contents.
Link to comment
Share on other sites

  • 4 weeks later...

у меня выдает ошибку :

 

Ошибка разбора XML

 

Ошибка разбора XML: синтаксическая ошибка (Строка: 3, Символ: 0)

 

Обработать документ как HTML

Ошибка:

unexpected end-of-file

Описание:

http://www.w3.org/TR/REC-xml/

1: <?xml version="1.0" encoding="UTF-8"?>

2: <root>

Link to comment
Share on other sites

что за ошибка там?

этот файл для 1.4.5.1

 

<?php
include(dirname(__FILE__).'/config/config.inc.php');
require_once(dirname(__FILE__).'/init.php');
// Get data
$number = (intval(Tools::getValue('n')) ? intval(Tools::getValue('n')) : 10000);
$orderByValues = array(0 => 'name', 1 => 'price', 2 => 'date_add', 3 => 'date_upd', 4 => 'position');
$orderWayValues = array(0 => 'ASC', 1 => 'DESC');
$orderBy = Tools::strtolower(Tools::getValue('orderby', $orderByValues[intval(Configuration::get('PS_PRODUCTS_ORDER_BY'))]));
$orderWay = Tools::strtoupper(Tools::getValue('orderway', $orderWayValues[intval(Configuration::get('PS_PRODUCTS_ORDER_WAY'))]));
if (!in_array($orderBy, $orderByValues))
$orderBy = $orderByValues[0];
if (!in_array($orderWay, $orderWayValues))
$orderWay = $orderWayValues[0];
$id_category = (intval(Tools::getValue('id_category')) ? intval(Tools::getValue('id_category')) : 1);
$currency = new Currency(intval($cookie->id_currency));
$affiliate = (Tools::getValue('ac') ? '?ac='.Tools::getValue('ac') : '');
$categTree = Category::getRootCategory()->recurseLiteCategTree(0);
function constructTreeNode($node){
							$ret = ';';
							$ret .= $node['id'].'|'.$node['name'].';';
							if(!empty($node['children']))
							{
															$ret .= ';';
															foreach ($node['children'] AS $child)
																							$ret .= constructTreeNode($child);
															$ret .= ';';
							}
							return $ret;
}
foreach ($categTree['children'] AS $child)
							$ulTree .= constructTreeNode($child);
$tab_cat=explode(';',$ulTree);
foreach ($tab_cat as $id2cat){
$tab_id2cat=explode('|',$id2cat);
if (!empty($tab_id2cat)) $tab_cat_final[$tab_id2cat[0]]=$tab_id2cat[1];
}
header("Content-Type:text/xml; charset=utf-8");
echo '<?xml version="1.0" encoding="UTF-8"?>'."\n";
?>
<root>
<?php
foreach ($tab_cat_final as $id_category=>$name_category){
$products = Product::getProducts(intval($cookie->id_lang), 0, ($number > 10000 ? 10000 : $number), $orderBy, $orderWay, $id_category, true);
foreach ($products AS $product)
{
 $image = Image::getImages(intval($cookie->id_lang), $product['id_product']);
$lg = Context::getContext()->language->id;
$idcarr = Image::getCover($product['id_product']);
$idcover = $idcarr['id_image'];
$img = Context::getContext()->link->getImageLink($product['link_rewrite'], $idcover, 'large_default');
$prix=Product::getPriceStatic($product['id_product']);
$prs = number_format($prix, 2, '.', '');
$t = Category::getLinkRewrite((int)$product['id_category_default'], $lg);
$qtty = StockAvailable::getQuantityAvailableByProduct($product['id_product'], $product['id_product_attribute']);
if ($product['reduction_percent']>0) $prix_promo=$prix*(1-$product['reduction_percent']/100);else $prix_promo=($prix-$product['reduction_price']);

 echo "<item>\n";
 echo "<name><![CDATA[".$product['name']."]]></name>\n";
 echo "<link><![CDATA[".htmlspecialchars($link->getproductLink($product['id_product'], $product['link_rewrite'], Tools::getValue('id_category'))).$affiliate."]]></link>\n";
 echo "<price>".$prs."</price>\n";
 echo "<image>".$img."</image>\n";
 echo "<category_full><![CDATA[".$name_category."]]></category_full>\n";
 echo "<category_link><![CDATA["._PS_BASE_URL_.__PS_BASE_URI__.$product['id_category_default']."-".$t."]]></category_link>\n";
 echo "<manufacturer><![CDATA[".$product['manufacturer_name']."]]></manufacturer>\n";
 echo "<reference><![CDATA[".$product['id_product']."]]></reference>\n";
 echo "<in_stock>".$qtty."</in_stock>\n";
 echo "<model><![CDATA[".$product['reference']."]]></model>\n";
 echo "</item>\n";
}
}
?>
</root>

http://www.order24.lv/xml.php

 

Я понимаю чтото кроется вот здесь :

}
header("Content-Type:text/xml; charset=utf-8");
echo '<?xml version="1.0" encoding="UTF-8"?>'."\n";
?>
<root>
<?php

 

Может в настройках где то проблемы? :( так замучался :D

 

Магазин на версии 1.5.4

 

В IE показывает ошибку :

 

 

Эта ошибка (HTTP 500 — внутренняя ошибка сервера) означает, что на веб-сайте произошел сбой сервера, который не позволяет отобразить веб-страницу.

Дополнительные сведения об ошибках HTTP см. в справке.

Edited by awfuljka (see edit history)
Link to comment
Share on other sites

  • 2 months later...
  • 8 months later...

Спасибо за скрипт! Очень полезный. Настроила немного под себя. У меня 1.5.6, скрипт ошибку не выдает, но есть один косяк. Если товару присвоена категория и подкатегория, скрипт не заполняет category_full. Если товару присвоена просто категория (без подкатегории), то все нормально.

Попробовала заставить скрипт выводить id категорий, а не название - выводит у всех товаров без ошибок.

 

Как можно сделать так, чтобы у всех товаров отображались названия категорий?

Edited by Christin_a (see edit history)
Link to comment
Share on other sites

×
×
  • Create New...