Posting in the Magento forums has been disabled pending the implementation of a new and improved forum solution which should better serve the community.

For new questions please post at magento.stackexchange.com, the community-run support site for the Magento community. We will be providing updates on the new forum solution soon. For questions or concerns please email community@magento.com.

Magento Forum

Mehrsprachigen Produkt-Import via PHP-Skript realisieren
 
p_squared
Member
 
Avatar
Total Posts:  66
Joined:  2009-06-09
 

Hallo zusammen,

ich habe derzeit ein PHP-Skript per Cronjob einbunden, welches in regelmäßigen Abständen Produkte aus einer XML-Datei importiert. Dies geschieht derzeit allerdings nur einsprachig in Deutsch. Im groben mit diesen Zeilen:

$mage_product Mage::getModel(\'catalog/product\');
$product_id $mage_product->getIdBySku($product[\'sku\']);
if (!empty(
$product_id)){
    $mage_product
->load($product_id);
}
$mage_product
->setAttributeSetId(self::ATTRIBUTE_SET_ID);
$mage_product->setTypeId(\'simple\');
$mage_product->setVisibility(1);    //nowhere
$mage_product->setTaxClassId(1);
$mage_product->setWebsiteIds(array(Mage::app()->getStore(true)->getWebsite()->getId()));
$mage_product->setStatus($product[\'status\']);
$mage_product->setSku($product[\'sku\']);
$mage_product->setName($product[\'name\']);
$mage_product->setShortDescription($product[\'short_description\']);
$mage_product->setDescription($product[\'description\']);
$mage_product->setPrice($product[\'price\']);
$mage_product->setWeight(0);

try{
    $mage_product
->save();
}catch (Exception $e){         
    $this
->log(\'Fehler: \' $e);
}

Wie realisiere ich hier nun einen mehrsprachigen Produkt-Import? Anfangs dachte ich, dass mir hier vielleicht \"setWebsiteIds\" weiterhilft, allerdings weiß ich nicht wie ich den Geltungsbereich auf einen anderen Storeview setze, zudem müssten ja die Methoden setName, setShortDescription und eben alle anderen für eine Übersetzung relevanten Attribute mehrere Sprachen aufnehmen können. Weiß jemand, wie ich das umsetze? Im Netz der Netze habe ich dazu bisher noch keinen Anhaltspunkt gefunden.

Vielen Dank im Voraus für einen helfenden Tipp und viele Grüße aus Berlin

 
Magento Community Magento Community
Magento Community
Magento Community
 
ssimon
Jr. Member
 
Total Posts:  28
Joined:  2010-06-16
 

Ich seh da selbst nur den Umweg über doppelten Import für multistore.

Kleiner Tip noch :
Wenn man im Produktmodel beim import (weiche einbauen) das beforeSave() und afterSave() ausschaltet, erreicht man eine vervielfachung der Importgeschwindigkeit.

protected function _beforeSave()    {
        
if( defined"IMPORTER_IGNORE_MODEL_CALLBACK" ) && IMPORTER_IGNORE_MODEL_CALLBACK ) return;
        ...
    protected function 
_afterSave()    {
        
if( defined"IMPORTER_IGNORE_MODEL_CALLBACK" ) && IMPORTER_IGNORE_MODEL_CALLBACK ) return parent::_afterSave();
        ...
( Man sollte aber im Auge behalten, dass es Fälle gibt, in denen das hier nicht sauber funktioniert )

Insbesondere verhindert dies viele überflüssige Caching Effekte, die den import immer langsamer werden lassen, je mehr Produkte man schon importiert hat.
( Bei mir ist der Import von 1000 Produkten von ca 1h auf 5 Minuten beschleunigt - bei 100 Produkten war es nur Faktor 2 )

Man muss danach aber auf jeden Fall den Index neu bauen.

 
Magento Community Magento Community
Magento Community
Magento Community
 
p_squared
Member
 
Avatar
Total Posts:  66
Joined:  2009-06-09
 

Also die verschiedenen Sprachversionen konnte ich nun realisieren. Dieser Blog-Eintrag hat mir dabei geholfen: http://www.webguys.de/magento/produkte-mehrsprachig-importieren/

Zur Performance: Mein gezeigtes Listing ist stark vereinfacht und enthält nicht meine Performance-Optimierungen. Folgende Methoden bringen noch mal einen ordentlichen Leistungsschub, weil nachgelagerte Index-Aktualisierungen nicht vorgenommen werden, bzw. die URL-Rewrites nicht neu aufgebaut werden.

$product->setIsMassupdate(true);
$product->setExcludeUrlRewrite(true);

Ich mach das dann nur einmalig nach dem letzten Produkt. Damit braucht der Import bei mir auch nur noch 8min bei ca. 1200 Produkten auf einem Dual-Core-Server mit Raid 1.

 
Magento Community Magento Community
Magento Community
Magento Community
 
ezelli69
Jr. Member
 
Total Posts:  3
Joined:  2010-04-25
 

Hallo ssimon,

ich stecke gerade auch im Import Stress von Magento und bin bei der Suche nach einem Performance-Schub auf euere Posts gestossen. Könntenst du deinen Tip (before_save etc.) etwas genauer erläutern. Ich bin kurz vorm Durchdrehen - vielleicht kannst du mir etwas helfen...?

Danke schon jetzt!

 
Magento Community Magento Community
Magento Community
Magento Community
 
mgt_commerce
Member
 
Avatar
Total Posts:  66
Joined:  2009-06-06
 

Hi ezelli69,
du musst für jede Sprache (storeview) ein Model erzeugen:

$product = Mage::getModel(’catalog/product’);
$product ->setId(13434);
$product->setName(’Produktname in Deutsch’);
$product->setPrice(10);

$product->save();

Jetzt das gleiche Produkt für englisch:

$product = Mage::getModel(’catalog/product’);
$product ->setId(13434);
$product->setName(’Produktname in Englisch’);
$product->setStoreId(1); //hier die storeviewId vom englisch shop angeben

$product->save();

So einfach geht das.
Wieviele Produkte willst du denn importieren?

Gruß,
Stefan

 
Magento Community Magento Community
Magento Community
Magento Community
 
ssimon
Jr. Member
 
Total Posts:  28
Joined:  2010-06-16
 

@ stefan.wieczorek:
1. war es nicht Ezelli, der die multilanguage probleme hatte.
2. hatte ich deine Lösung mit \\\"Ich seh da selbst nur den Umweg über doppelten Import für multistore. \\\” schon angedeutet - nur fürs protokoll grin
3. reichen die von dir gesetzten Attribute des Produkts (zumindest be mir) nicht aus zum speichern. Aber der grundgedanke ist richtig.

@ ezelli69 :
Da bei mir die Lösung von Paeddl nicht funktionierte (hatte ich natürlich zuerst getestet ), bin ich halt den Umweg gegangen, den ich oben beschrieben hatte.

Problem ist, dass die zeit, die Magento zum save() eines Produktes linear mit der Anzahl der in diesem Skriptaufruf gespeicherten produkte wächst. (mal abgesehen, dass es schon ohne diese steigerung zu langsam ist )

Die meiste Zeit wird hierbei bei den ( meist überflüssigen ) Aufrufen in product->_beforeSave() und _afterSave() verschwendet.
Hier sorgt Magento bei jedem Produkt aufs Neue für integrität und performance, wo es nicht nötig ist.
Deshalb habe ich in meinem product_model diese beiden Funktionen deaktiviert, indem ich eine Weiche eingepflanzt hab, die die Funktionen überspringen, wenn die Konstante \\\"IMPORTER_IGNORE_MODEL_CALLBACK\\\" gesetzt, und zu TRUE evaluiert wird.
Damit ist sichergestellt, dass nichts passiert, wenn die Konstante nicht da ist.
Aber, wenn ich importiere, setz ich die, und die Funktionen werden übersprungen. ( bei _afterSave() muss halt noch die _afterSave des parents aufgerufen werden, wie gezeigt. )

Einziges Problem ist nur, dass danach der Index nicht stimmt, was ich mit einem
exec( \\\"php -f shell/indexer.php reindexall\\\” );
geregelt hab.

Wie erwähnt, geht es nun VIEL schneller, und ich hab in den letzten Monaten noch kein Problem bemerkt, obwohl der Importer jeden Tag den gesamten Katalog neu schreiben muss.

 
Magento Community Magento Community
Magento Community
Magento Community
 
stefanbrendle
Jr. Member
 
Total Posts:  1
Joined:  2012-09-19
 
mgt_commerce - 21 October 2010 02:50 AM


$product = Mage::getModel(’catalog/product’);
$product ->setId(13434);
$product->setName(’Produktname in Deutsch’);
$product->setPrice(10);

$product->save();

Jetzt das gleiche Produkt für englisch:

$product = Mage::getModel(’catalog/product’);
$product ->setId(13434);
$product->setName(’Produktname in Englisch’);
$product->setStoreId(1); //hier die storeviewId vom englisch shop angeben

$product->save();

Genau so mache ich den Import aktuell, jedoch ist die Performance bei 6x Storeviews natürlich katastrophal. Speichere einmal die Daten auf Webseite-Ebene, dann 6x auf Storeview-Ebene (Bezeichnungstexte, Sichtbarkeit etc.) = 7x laden und speichern. Gibt es keine Möglichkeit, mit einem einzigen “save” auszukommen?

Vielen Dank!
Gruß Stefan smile

 
Magento Community Magento Community
Magento Community
Magento Community
 
p_squared
Member
 
Avatar
Total Posts:  66
Joined:  2009-06-09
 

Wenn du einen wirklichen schnellen Import realisieren willst, schau dir mal Mage_ImportExport an. Das ist ein Modul, welches genau dafür gedacht ist. Es wandelt deine gelieferten Daten direkt in SQL-Kommandos um, was von der Performance natürlich nicht zu schlagen ist.

Der Artikel dazu ist interessant: http://www.avs-webentwicklung.de/nc/blog/artikel/magento-import-mit-der-neuen-schnellen-import-schnittstelle-fuer-produkte-und-kunden.html

 
Magento Community Magento Community
Magento Community
Magento Community
Magento Community
Magento Community
Back to top