Eroare data feed generator

Discuţii despre Magento. Instalare, configurare, MODificări

Moderator: Moderatori

sadicool
PHPRomania Supporter
Mesaje: 5
Membru din: Dum Noi 07, 2010 12:34 am

Eroare data feed generator

Mesajde sadicool » Sâm Mai 10, 2014 11:18 am

Buna ziua ,
Primul post , prima intrebare :)
Cum putem sa avem multiple categorii si subcategorii pentru un data feed generator php script?

Am incercat sa construiesc un feed generator bazat pe http://stackoverflow...r-product-feed.
Problema mea este cu categoriile si subcategoriile produselor si codul dezvoltat de mine este urmatorul:

Cod: Selectaţi tot

<?php
error_reporting(E_ALL | E_STRICT);
ini_set("display_errors", 1);

define('SAVE_FEED_LOCATION','feed/compari.csv');

//$objDateTime = new DateTime('NOW');

require 'app/Mage.php';
Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);

$products = Mage::getModel('catalog/product')->getCollection();
$products->addAttributeToFilter('status', 1); //1 is set to select product in stock
$products->addAttributeToFilter('visibility', 4); //4 is set to select active products
$products->addAttributeToSelect('*');
$prodIds=$products->getAllIds();

$product = Mage::getModel('catalog/product');
$counter = 0;
$feedaray=[];

foreach($prodIds as $productId) {
if (++$counter < 500000){

    $product->load($productId);

    $title_temp = $product->getName();
    if (strlen($title_temp) > 255){
        $title_temp = str_replace("Supply", "", $title_temp);
        $title_temp = str_replace("  ", " ", $title_temp);
    } //$title_temp will hold the product name

    $maincat = $subcats = '';
    $categoryCollection = $product->getCategoryCollection();

Daca fac var_dump($title_temp.' categorie: '.$categorie_id);

Cod: Selectaţi tot

foreach($categoryCollection as $cat){
                $categorie_id=$cat->getData()['entity_id'];
                $_cat_ac = Mage::getModel('catalog/category')->load($categorie_id);
                if($subcats_ac == ''){
                        $maincat_ac = $subcats_ac = $_cat_ac->getName();
                }else {
                        $subcats_ac .= ">".$_cat_ac->getName();
                }
                echo '<pre>';
                var_dump($title_temp.' categorie: '.$categorie_id);
                echo '</pre>';
        }


Obtin resultatele :

Cod: Selectaţi tot

string(59) "product 1 categorie: 3" - prime     category
string(60) "product 1 categorie: 37" - sub category
string(45) "product 2 categorie: 4" - prime category
string(46) "product 2 categorie: 21" - sub category

Mai departe am nevoie sa pregatesc feed-ul pentru un export in csv, si as vrea sa ajunga in forma acceasta :

Cod: Selectaţi tot

$stock = Mage::getModel('cataloginventory/stock_item')->loadByProduct($productId);
        $product_data = array();
        $product_data['ProductID'] = $productId;
        $product_data['ProductName'] = substr(iconv("UTF-8","UTF-8//IGNORE",$title_temp), 0, 255);
        $product_data['SKUnumber'] = $product->getSku();
        $product_data['PrimaryCategory'] = $maincat_ac; //this is spitting same data for all products
        $product_data['SecondaryCategory'] = $subcats_ac;  //this is spitting same data for all products
        $product_data['ProductURL'] = $StoreURL.$product->getUrlPath(); //$StroeURL is set as a string
        $product_data['ProductImageURL'] = Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_MEDIA).'catalog/product'.$product->getImage();
        $product_data['ShortProductDescription'] = substr(iconv("UTF-8","UTF-8//IGNORE",$product->getDescription()), 0, 80)."...";
        $product_data['LongProductDescription'] = substr(iconv("UTF-8","UTF-8//IGNORE",$product->getDescription()), 0, 2000);
        $product_data['SalePrice'] = round($product->getFinalPrice(),2);
        $product_data['RetailPrice'] = round($product->getPrice(),2);
        $product_data['ManufacturerName'] =$product->getAttributeText('manufacturer');
        $product_data['Quantity'] = round($stock->getQty(),2);
        $product_data['Currency'] = Mage::app()->getStore()->getCurrentCurrencyCode();
        foreach($product_data as $k=>$val){
                $bad=array('"',"\r\n","\n","\r","\t");
                $good=array(""," "," "," ","");
                $product_data[$k] = str_replace($bad,$good,$val);
        }
        $feedaray[]=$product_data;
        echo $counter  . " ";
}
}
$handle=fopen(SAVE_FEED_LOCATION, 'w');
foreach ($feedaray as $fields) {
   fputcsv($handle, $fields);
}
fclose($handle);
?>


Problema este ca maincat_ac si subcat_ac nu imi arata corect datele.
Imi importa doar prima categorie gasita si o subscrie tuturor categoriilor.


Va multumesc anticipat



l33t
Senior Member
Mesaje: 216
Membru din: Sâm Mai 10, 2008 7:31 pm

Re: Eroare data feed generator

Mesajde l33t » Dum Mai 11, 2014 5:09 pm

sadicool scrie:Primul post , prima intrebare :)


Pare si primul script pe Magento, la cum arata codul...

Cod: Selectaţi tot

require 'app/Mage.php';
Ti-ai trantit fisierele in root-ul Magento???
Cum te-ai gandit tu sa ruleze acest script?

Cod: Selectaţi tot

$products = Mage::getModel('catalog/product')->getCollection();
...
$prodIds=$products->getAllIds();
$product = Mage::getModel('catalog/product');
...
$product->load($productId);

$products ca majoritatea colectiilor din Magento implementeaza un array iterator, aici nu mai ai nevoie sa faci load pe produs, poti sa-ti construiesti query-ul de colectie mai bine, daca nu ai anumite atribute ale produselor.
Ca sa intelegi mai bine, la colectie ai:

Cod: Selectaţi tot

SELECT `e`.*, `at_status`.`value` AS `status`, `at_visibility`.`value` AS `visibility` FROM `catalog_product_entity` AS `e` INNER JOIN `catalog_product_entity_int` AS `at_status` ON (`at_status`.`entity_id` = `e`.`entity_id`) AND (`at_status`.`attribute_id` = '87') AND (`at_status`.`store_id` = 0) INNER JOIN `catalog_product_entity_int` AS `at_visibility` ON (`at_visibility`.`entity_id` = `e`.`entity_id`) AND (`at_visibility`.`attribute_id` = '93') AND (`at_visibility`.`store_id` = 0) WHERE (at_status.value = '1') AND (at_visibility.value = '4')

Din care tu iei doar id-urile acum...
Iar la $product->load($id); ai o serie de query-uri pe catalog_product tables la care pui where entity_id = $id;
Deci aproape ce obtii de la query-ul de colectie, doar ca asta de produs este rulat pentru fiecare produs din colectie...

Cod: Selectaţi tot

foreach($categoryCollection as $cat){
                $categorie_id=$cat->getData()['entity_id'];
                $_cat_ac = Mage::getModel('catalog/category')->load($categorie_id);
                if($subcats_ac == ''){

In foreach-ul asta setezi $subcats_ac, dar nu vad sa-l reinitializezi, cel putin in ce ai postat. Asa ca e normal sa-ti ramana ceea ce ai gasit prima data.
Magento suporta versiuni mai noi de PHP 5.3 (eventual dupa unele patch-uri) dar

Cod: Selectaţi tot

$cat->getData()['entity_id']
este din PHP 5.4. in functie de hosting s-ar putea sa ai eroare.

Cod: Selectaţi tot

$product_data['PrimaryCategory'] = $maincat_ac; //this is spitting same data for all products
$product_data['SecondaryCategory'] = $subcats_ac;  //this is spitting same data for all products


Aici nu stiu ce feed ai, dar magento are un tree de categorii ce permite ca si subcategoriile sa fie categorii pentru altele, nu stiu cum o sa le poti reduce la category si subcategory.

Nu m-am uitat ce transformari de stringuri faci pe acolo... dar

Cod: Selectaţi tot

$product_data['ProductURL'] = $StoreURL.$product->getUrlPath(); //$StroeURL is set as a string
este o prostie. Trebuia sa-ti iei colectia de store-uri, sa treci prin fiecare si sa faci feed-ul per store, iar product url-ul este

Cod: Selectaţi tot

$product->getProductUrl()

sadicool
PHPRomania Supporter
Mesaje: 5
Membru din: Dum Noi 07, 2010 12:34 am

Re: Eroare data feed generator

Mesajde sadicool » Dum Mai 11, 2014 11:42 pm

Multam fine pentru input.
Dar dupa cum ti-ai dat seama nu sunt cel mai stralucit programator php, si daca este cu putinta sa-mi spui "mura`n gura" cam cum ar trebui sa fac lucrul acesta, ti-as fii profund recunoscator si cred ca nu doar eu .

l33t
Senior Member
Mesaje: 216
Membru din: Sâm Mai 10, 2008 7:31 pm

Re: Eroare data feed generator

Mesajde l33t » Lun Mai 12, 2014 5:38 pm

sadicool scrie:Multam fine pentru input.
Dar dupa cum ti-ai dat seama nu sunt cel mai stralucit programator php, si daca este cu putinta sa-mi spui "mura`n gura" cam cum ar trebui sa fac lucrul acesta, ti-as fii profund recunoscator si cred ca nu doar eu .


Serios? Nu e nimeni platit sa te ajute, ti-am dat cateva sfaturi, hai sa nu ne intindem. Sau poate nu inteleg eu bine, vrei sa-mi dai 250 euro pe un modul de feed?

HabarNam
New Member
Mesaje: 3
Membru din: Lun Mai 12, 2014 7:46 pm
Contact:

Re: Eroare data feed generator

Mesajde HabarNam » Lun Mai 12, 2014 7:49 pm

nu zice nimeni sa faci un feed cap coada dar nu ai facut decat sa critici sa spui ca nu e bine. de aceea scriem pe forumuri sa aflam raspunsuri. mie personal nu mi se pare constructiv abordarea ta .... ai spus doar ca nu e bine dar nu ai spus si cum ar trebuie facut .... . ma bag in seama ca si eu sunt interesat de acest proiectel al lui sadicool.
toate cele bune

phphp
Average Member
Mesaje: 69
Membru din: Mie Oct 23, 2013 7:28 pm

Re: Eroare data feed generator

Mesajde phphp » Lun Mai 12, 2014 9:12 pm

Am vazut in ultima perioada multe topicuri ale unor useri la primul post care cer sa le faca altii treaba.

sadicool
PHPRomania Supporter
Mesaje: 5
Membru din: Dum Noi 07, 2010 12:34 am

Re: Eroare data feed generator

Mesajde sadicool » Lun Mai 12, 2014 10:33 pm

phphp scrie:Am vazut in ultima perioada multe topicuri ale unor useri la primul post care cer sa le faca altii treaba.

De ce exista un forum, doar sa discutam ce cafea am baut dimineata?
Sunt la primul post, da nu la prima vizita pe acest forum. Sunt convins ca multe lumea are nevoie de asa ceva, si poate aici gaseam raspunsul.
Nu vreau sa dezbat acest subiect, ci doar vreau sa adaug ca cei care sunt ingaduitori sa ajute, nu ma ajuta doar pe mine, ci probabil multi alti utilizatori care cauta asa ceva.

Avatar utilizator
Birkoff
Senior Member
Mesaje: 6380
Membru din: Joi Mar 18, 2004 2:34 pm
Localitate: Bucuresti
Contact:

Re: Eroare data feed generator

Mesajde Birkoff » Lun Mai 12, 2014 10:58 pm

@sadicool userul @ phphp are dreptate, sa dat aici in topic descrierea problemelor si se astepta sa se vina cu o varianta corectata si eventual alte probleme, dar sa cerut sa se dea mura-n gura ceea ce nu este conform regulamentului (aici nu se da mura-n gura, aici vii sa inveti, ti se spun greselile, le corectezi si inveti din ele apoi revii eventual cu alte intrebari)

inchid topicul daca mai apare 1 offtopic care nu are legatura cu codul initial

userul @l33t ti-a raspuns ce probleme a vazut el in cod, corecteaza-le apoi revino cu intrebari
1) CMS, ERP, CRM, etc... (doar pentru clienti))
2) Portofoliu, servicii, contact, blog
3) Folositi aceasta clasa sql in proiectele voastre (open source)
4) Vrei un magazin virtual la cheie, usor de folosit, cu api-uri incluse pentru maximizarea vanzarilor si multe alte facilitati? Da un semn si discutam.

HabarNam
New Member
Mesaje: 3
Membru din: Lun Mai 12, 2014 7:46 pm
Contact:

Re: Eroare data feed generator

Mesajde HabarNam » Mar Mai 13, 2014 3:30 am

Birkoff scrie: userul @l33t ti-a raspuns ce probleme a vazut el in cod, corecteaza-le apoi revino cu intrebari


si daca nu stii cum sa le corectezi ? din nou spun nu a facut nimic constructiv.
solutia gasita de mine pt problema este :

Cod: Selectaţi tot

$cats=[];
        foreach($categoryCollection as $cat){
            $cats[]=$cat->getData()['entity_id'];
        }

        foreach ($cats as $category_id) {
            $_cat = Mage::getModel('catalog/category')->load($category_id) ;
            if($subcats == ''){
                $maincat = $subcats = $_cat->getName();
            }else {
                $subcats .= ">".$_cat->getName();
            }
        }




poate ca nu este ce mai eleganta solutie dar este o solutie la problema omului.
acum este un feed generator gratis care functioneaza. daca se poate imbunatatii va provoc la un sah constructiv.

sadicool
PHPRomania Supporter
Mesaje: 5
Membru din: Dum Noi 07, 2010 12:34 am

Re: Eroare data feed generator

Mesajde sadicool » Mar Mai 13, 2014 3:49 am

Acum ma bag la testat si revin cu un raspuns, fie ca este unul pozitiv fie ca este unul negativ:)
Eu sper sa functioneaze si sa-mi pot rezolva problema

l33t
Senior Member
Mesaje: 216
Membru din: Sâm Mai 10, 2008 7:31 pm

Re: Eroare data feed generator

Mesajde l33t » Mar Mai 13, 2014 11:35 am

HabarNam scrie:
Birkoff scrie: userul @l33t ti-a raspuns ce probleme a vazut el in cod, corecteaza-le apoi revino cu intrebari


si daca nu stii cum sa le corectezi ? din nou spun nu a facut nimic constructiv.
solutia gasita de mine pt problema este :

Cod: Selectaţi tot

$cats=[];
        foreach($categoryCollection as $cat){
            $cats[]=$cat->getData()['entity_id'];
        }

        foreach ($cats as $category_id) {
            $_cat = Mage::getModel('catalog/category')->load($category_id) ;
            if($subcats == ''){
                $maincat = $subcats = $_cat->getName();
            }else {
                $subcats .= ">".$_cat->getName();
            }
        }




poate ca nu este ce mai eleganta solutie dar este o solutie la problema omului.
acum este un feed generator gratis care functioneaza. daca se poate imbunatatii va provoc la un sah constructiv.


Datorita userilor ca voi incepe sa ma scarbeasca acest forum si mentalitatea asta de romanasi. Vreti totul mura-n gura, fara sa munciti, sau daca reusiti sa faceti o bucata de cod sa mearga deja visati la sume fabuloase.
HabarNam ai rezolvat, ai redenumit $maincat_ac in $maincat, super. Problema lui este ca e intr-un foreach (cel de produse) si mai este intr-un foreach (cel de categorii pt fiecare produs), el nu reinitializeaza $maincat_ac (sau $maincat sau cum vrei sa-i spui) in foreach-ul de produse. Si ignori cu succes faptul ca eu am spus ca Magento merge pe 5.3 si voi folositi sintagme din 5.4
Pana la foreach are probleme mari de arhitectura. Dupa cum am spus si iar ma repet, poate citi si voi "nu trantesti codul in root-ul Magento". Iti faci un modul frumos in app/code/local.
Pentru feed faci un fisier .csv in var/feed/ (magento are drepturi de scriere in var) pe care il regenerezi doar cand au loc anumite evenimente (ca sa aflii asta faci un model observer si pui events in config.xml). Events ar trebui sa fie legate de modificarile pe produse - adaugare produs nou, editare produs, modificare categorii, modificari de stoc (comenzi), modificari de pret (campanii prin Cataog Rules), stergeri de produse, categorii etc.
Varianta cu events ar fi mai migaloasa, dar ar fi cea mai corecta (vezi si cum sunt facuti indexerii din magento). Si folosesti si un cache, fie in db fie in altceva (ultima versiune de Magento are suport pt Redis), ca atunci cand se modifica doar un produs sa nu iei informatiile pentru toate celelalte cand regenerezi fisierul de feed.
O alta varianta ar fi sa adaugi in locul observer-ului un model cron. Si atunci regenerezi fisierul o data pe zi cand nu ai trafic mare pe site (sau mai des, in functie de schimbari).
Dar e ok, HabarNam ti-a dat un feed generator gratis care functioneaza.
Feed generator care face query pe fiecare produs, de fiecare data cand este accesat link-ul de feed. Sunt curios, ai vazut vre-o data un mysql general_log in timp ce incarca o pagina de magento sa vezi cate zeci de query-uri face, daca mai ingenuchezi si tu serverul cu feed-ul asta, cat crezi ca o sa mearga site-ul ala si cat o sa fie la pamant?

Si dupa sa veniti pe forum sa spuneti cum ati lasat voi un backdoor in cod ca nu va plateste clientul aberatiile.

HabarNam
New Member
Mesaje: 3
Membru din: Lun Mai 12, 2014 7:46 pm
Contact:

Re: Eroare data feed generator

Mesajde HabarNam » Mar Mai 13, 2014 6:21 pm

l33t scrie:Datorita userilor ca voi incepe sa ma scarbeasca acest forum si mentalitatea asta de romanasi. Vreti totul mura-n gura, fara sa munciti, sau daca reusiti sa faceti o bucata de cod sa mearga deja visati la sume fabuloase.

cine viseaza la sume fabuloase? eu am oferit o solutie, gratis, tu ai cerut 250 de euro ca sa rezolvi problema omului, deci cine viseaza.?

l33t scrie:Pana la foreach are probleme mari de arhitectura. Dupa cum am spus si iar ma repet, poate citi si voi "nu trantesti codul in root-ul Magento". Iti faci un modul frumos in app/code/local.

poate omul testeaza pe un server si nu e in live ?

l33t scrie:Pentru feed faci un fisier .csv in var/feed/ (magento are drepturi de scriere in var) pe care il regenerezi doar cand au loc anumite evenimente (ca sa aflii asta faci un model observer si pui events in config.xml). Events ar trebui sa fie legate de modificarile pe produse - adaugare produs nou, editare produs, modificare categorii, modificari de stoc (comenzi), modificari de pret (campanii prin Cataog Rules), stergeri de produse, categorii etc.
Varianta cu events ar fi mai migaloasa, dar ar fi cea mai corecta (vezi si cum sunt facuti indexerii din magento). Si folosesti si un cache, fie in db fie in altceva (ultima versiune de Magento are suport pt Redis), ca atunci cand se modifica doar un produs sa nu iei informatiile pentru toate celelalte cand regenerezi fisierul de feed.
O alta varianta ar fi sa adaugi in locul observer-ului un model cron. Si atunci regenerezi fisierul o data pe zi cand nu ai trafic mare pe site (sau mai des, in functie de schimbari).

o sa tin seama pe viitor de aceste recomandari.

sadicool
PHPRomania Supporter
Mesaje: 5
Membru din: Dum Noi 07, 2010 12:34 am

Re: Eroare data feed generator

Mesajde sadicool » Mie Mai 14, 2014 10:57 am

Yey it`s working:D
Multam fine Habar..
La ce mi-a trebuit mie functioneaza perfect.


Înapoi la “Magento”

Cine este conectat

Utilizatori ce ce navighează pe acest forum: Niciun utilizator înregistrat și 4 vizitatori