2016-03-21 6 views
10

Ich habe ein benutzerdefiniertes Magento-Modul implementiert, das Daten von externen Diensten durchläuft und Preis, Gewicht, Name und einige andere Produktattribute in Magento mehrsprachig aktualisiert , Multi-Store-Website.So verhindern Sie, dass Magento Attributwerte von einer anderen Website/einem anderen Speicher überschreibt, während Sie Produkte programmatisch aktualisieren

Meine Lösung ist recht einfach (in meinem Modell von Cron jeden Tag aufgerufen), wie folgt:

/* THIS IS CODE SNIPPET INSIDE FOREACH LOOP */ 
$storeId = (string)$jobConfig->store; //cron for each store 
Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID); 

$extistingProduct = Mage::getModel('catalog/product')->loadByAttribute('sku', $sku); 
$extistingProduct->setPrice($newPrice); //update price 
//some code here dealing with Associated products of Configurable product probably not relevant 
//... 
$extistingProduct->setCanSaveConfigurableAttributes(true); 
$extistingProduct->setCanSaveCustomOptions(true); 

$extistingProduct->setConfigurableAttributesData($configurableAttributesData); 
// This tells Magento to associate the given simple products to this configurable product.. 
$extistingProduct->setConfigurableProductsData($configurableProductsData); 

$extistingProduct->setStoreId($storeId); 

$extistingProduct->save(); 

ich dies täglich in cron laufen haben, separat für jeden Store. Es funktioniert normalerweise korrekt, nur die Preise für jedes Produkt pro Store ändern, aber manchmal passiert eine seltsame Dinge (wie einmal alle 2 Monate) - alle anderen Attribute neben dem Preis werden von Store X in den aktuellen Shop $storeId überschrieben. Das bedeutet, dass meine gesamte englische Produktbeschreibung für alle betroffenen Produkte Deutsch (z. B.) wird.

Ich habe keine Ahnung, wie konnte das passieren, da jedes Mal, wenn ich es debuggen funktioniert, nur den Preis im aktuellen Umfang, den ich explizit festgelegt, aber alle anderen Produktattribute intakt lassen. Es sieht so aus, als ob es alle Produktdaten aus Store X lädt, den Preis einstellt und dann alle diese Werte speichert, die ich eingestellt habe, bevor ich das Produkt durch den Aufruf $extistingProduct->setStoreId($storeId) aufrufe.

In diesem Fall werden alle Attribute vom selben Store überschrieben (zum Beispiel werden alle englischen Texte deutsch, aber alle anderen werden spanisch - sie stammen alle aus einem zufälligen Store).

Hat jemand eine Ahnung wie könnte das passieren? Was mache ich falsch?

+0

Sie können diese Funktion updateAttributes wie folgt verwenden $ attributesData = array ("price" => $ data ['price'], "special_price" => $ data ['special_price'], "special_from_date" => $ data [ 'special_fromdate'], "special_to_date" => $ data ['special_todate']); store weise Mage :: getSingleton ('catalog/product_action') -> updateAttributes (array ($ productId), $ attributesData, $ storeId); – faizanbeg

+0

Ich denke, das ist nur eine andere Notation für das gleiche, was ich mache? Ich sehe nicht, wie das mein Problem lösen kann. – KoviNET

+0

Ihr Code ist zu situativ, als dass wir ihn jetzt korrigieren könnten. Das Problem könnte von vielen Faktoren herrühren, wie zum Beispiel "$ exististingProduct". Wenn Sie etwas Hilfe benötigen, dann würde zumindest das Einfügen der vollständigen foreach-Schleife helfen. –

Antwort

-1

Ich hatte ein ähnliches Problem und ich konnte keinen Weg finden, um es richtig zu machen, die Magento native Funktionalität verwendend. Ich benutze am Ende Magmi (Magmis API um genauer zu sein) um meine Produkte richtig zu erstellen/zu aktualisieren.

P.S. Ich weiß, dass dies nicht der "Magento's Way" ist, aber dies war der einzige Weg, den ich fand, nachdem ich viel Zeit mit Recherchen verbracht hatte. Also poste ich dies als eine alternative Lösung.

+0

Ich habe auch über Magmi nachgedacht, aber ich habe ein ziemlich komplexes Update-System, das bereits mit vielen Details über konfigurierbare und Bundle-Produkte codiert ist. Aber da meine Lösung auch langsam wird, werde ich Magmi versuchen. – KoviNET

+1

Es mag "schmerzhaft" sein, Ihre Implementierung zu einer neuen zu machen, die für Magmi kompatibel ist, aber die Leistung ist es absolut wert. Magmi ist schneller beim Erstellen/Aktualisieren von Produkten als die native Magento-Methode. –

0

Ich mache das gleiche Verhalten wie Sie täglich, und ich implementierte einen Cron mit Magmi als L. Palaiokostas erwähnt. Es funktioniert perfekt, ich synchronisiere täglich 200k Produkte. Die Sache, die ich gemacht habe, ist eine temporäre Tabelle zu erstellen, wo ich alle externen Daten sammle, und mit Magmi mache ich meine Anfrage, die Magento-Daten mit meiner temporären Tabelle vergleicht. Dies gibt mir ein Delta, das von Magmi automatisch aktualisiert oder erstellt wird.

Ich war am Anfang skeptisch und verbrachte mehrere Wochen damit, aber es funktioniert seit einem Jahr ohne Probleme!

Hoffe, das wird helfen.

+0

Ich habe nur 3k Produkte und mein Update dauert ca. 30 - 40 Minuten pro Geschäft. Durch die Verwendung von Magento REST/SOAP API Update-Prozess in sogar viel langsamer und es ist nicht einmal vollständig für konfigurierbare Produkte unterstützt. Magmi ist also eine gute Alternative, ich werde es versuchen. – KoviNET

+0

FYI Es dauerte 16 Stunden, wenn ich mich gut erinnere, um einen Katalog von 100k neuen Produkten, die in 7 Läden getrennt sind, hochzuladen. nur heute Abend, dauerte mein täglicher Delta-Import 14 Minuten, um alle Preise und Produkte, die von meinem externen Katalog geändert wurden, neu zu synchronisieren, also ist es ziemlich schnell entsprechend der Menge der entfernten Daten. Am Anfang benutzte ich normalen Magento und es stürzte jeden Abend, es war schrecklich! Magmi war so eine Rettung in meinem Projekt in der Tat :) –

Verwandte Themen