čtvrtek 6. října 2011

Magento XML feed pro agregátory

Přišel jsem na nejrychlejší způsob generování feedu. Mám v magentu 29000 aktivních produktů z toho cca 10000 viditelných na frontendu = exportovaných do feedu.
Použití v Nostress modulu je nepoužitelné - na samostatném serveru, kde běží jen shop (úplně nový server) to trvá cca 6h
Vytvoření skriptu, který používá objekty modelu Catalog/Product ve spojení s direct načítáním atributů z eav tabulek bylo jen o malinko rychlejší
Našel jsem způsob jak to lítá jako vítr
1) je třeba nastavit u atributů jako EAN, orig. kód výrobce - pokud se liší od SKU, a dalších které chceme do feedu poslat hodnotu zobrazit v seznamu na Ano
2) poté se musí přegenerovat Flat catalog produtků v Index managementu
3) ceny jsou třeba před zápisem porovnat a zapsat tu správnou -> nicméně jsou v nich aplikovány Catalog price rules
4) pak jen přidám skript do cronu
Úryvky skriptu přikládám, je třeba si je upravit dle konkrétních požadavků. Za chyby neručím, ještě to mám ve fázi ověřování - možná z toho udělám časem modul.

$r = Mage::getSingleton('core/resource')->getConnection('core_read');
$res = $r->fetchAll("SELECT p . * , r.price AS reg_price, r.final_price, r.min_price
FROM catalog_product_flat_2 p
LEFT OUTER JOIN catalog_product_index_price r ON ( p.entity_id = r.entity_id
AND customer_group_id =0 )
WHERE p.visibility
IN ( 2, 4 )");

foreach ($res as $row) {
.....
.....
//načtu si popis (attribute_id dle konkrétní instalace)
"SELECT value FROM catalog_product_entity_text where attribute_id = 57 AND entity_id = ".$row["entity_id"]
//tady si načítám kategorie - beru pouze jednu - z jednoho stromu
$cat = $r->fetchAll("SELECT cf.*
FROM catalog_category_product_index cp
LEFT OUTER JOIN catalog_category_entity cf ON ( cf.entity_id = cp.category_id )
WHERE cp.is_parent =1
and cf.entity_id is not null
and cf.path LIKE CONCAT( '1/3/3877/%/', cp.category_id)
AND cp.product_id = ".$row["entity_id"]." LIMIT 1");
$category = array();
if (sizeOf($cat)>0) {
    $categories = array_slice(explode('/',$cat[0]["path"]),3);
    $categories = $r->fetchAll("SELECT * FROM catalog_category_entity_varchar WHERE store_id = 0 and attribute_id=31 and entity_id in (".implode(',',$categories).")");
    foreach ($categories as $c) $category[]=$c['value']; 
}
.....
// takhle to vyplivnu do XML
$xml .= "  <CATEGORYTEXT>".implode(' | ',$category)."</CATEGORYTEXT>\n";

Žádné komentáře: