2016-04-18 14 views
1

Ich versuche zu haken catalog_product_save_after Ereignis. Hier ist config.xmlMagento EDA-System, wie Ereignisschleife zu vermeiden?

<events> 
    <catalog_product_save_after> 
    <observers> 
     <observer_name_here> 
     <class>My_Class_Model_Observer</class> 
     <method>methodToCall</method> 
     <type>singleton</type> 
     </observer_name_here> 
    </observers> 
    </catalog_product_save_after> 
</events> 

Und unten ist der Code, der in methodToCall läuft():

$product = Mage::getModel('catalog/product')->load(1); 
$product->setName('TESTING 123'); 
$product->save(); 


Ausgabe Ist:
Wenn das Ereignis catalog_product_save_after ist gefeuert. Der Code geschrieben in methodToCall() feuern die catalog_product_save_after wieder. Und entsprechend Magento EDA-System methodToCall() erneut aufgerufen, die die catalog_product_save_after noch einmal auslöst. So blieb das System in einer Reihe von Feuern und hörte das gleiche Ereignis ab.

Meine Fragen:

  1. Wie diese Situation zu vermeiden?
  2. Gibt es eine Möglichkeit zu Magento Event Dispatch Funktionalität für temporäre Zwecke (ohne Umschreiben dispatch Methode von Mage_Core_Model_Appwenn möglich) zu deaktivieren.
  3. So verhindern Sie Endlosschleife, wenn der Beobachter das gleiche Ereignis auslöst, das den Beobachter instanziiert. Wie im Fall oben.
+0

Warum verwenden Sie das Ereignis catalog_product_save_before nicht? Können Sie mehr erklären, was Sie in Ihrer Methode erreichen wollen? Vielleicht können wir eine alternative Lösung anbieten, anstatt zu versuchen, Event-Versendungen zu deaktivieren. – muhammedv

+0

@muhammedv Wenn ich 'catalog_product_save_before' benutze, passiert das gleiche. Das Problem ist das EDA-System. Was passiert, wenn der Beobachter das gleiche Ereignis auslöst? Wie verhindert man, dass das System in die Schleife gerät? – ROBIN

+0

Wenn Sie catalog_product_save_before verwenden, rufen Sie nicht $ product-> save() auf; Es wird danach gespeichert. Holen Sie sich einfach das Produkt mit $ product = $ observer-> getEvent() -> getProduct(); in der Observer-Methode und Aufruf setName() und nicht save() aufrufen. Es wird gespeichert. Probier es aus. – muhammedv

Antwort

0

Wenn Sie haben die neuen Werte verwenden und diese Werte verwenden Sie ein anderes Produkt aktualisieren Sie catalog_product_save_before Ereignis zu beobachten. Ihre Konfiguration sieht nicht gut aus, hier Sie sind ein Beispiel methodToCall Funktion:

public function methodToCall(Varien_Event_Observer $observer) 
{ 
    $event = $observer->getEvent(); 
    $product = $event->getProduct(); 

    if($product->hasDataChanges()) { //somethings changed 

     $newName = $product->getName(); 
     $oldName = $product->getOrigData('name'); 

     //do stuff here 
     //don't call $product->save() It WILL be saved. If you call save() you will create a loop 
    } 
} 
0

ich grundsätzlich glaube, dies ist wahrscheinlich der falsche Ansatz für Ihren Anwendungsfall, ich glaube, Sie wahrscheinlich save_before suchen sollte. Allerdings habe ich in der Vergangenheit gesehen, dass Leute dafür die Mage :: -Registrierung benutzen.

if(!Mage::Registry("somekey")) { 
    Mage::Register("somekey", true); 
    //LOGIC 
} 

nun in diesem Fall „somekey“ sollte auch etwas Bestimmtes, und wahrscheinlich spezifisch für dieses Produkt sein, so dass, wenn Sie mehrere Produkte sind zu speichern, es ihnen nicht beeinflusst.