2012-04-05 8 views
2

Ich verwende Magento 1.5.1.0 und die "mPAY24 Payment Gateway" Erweiterung. Ich habe eine Observer-Klasse für das Ereignis "sales_order_payment_pay" gesendet Benachrichtigung E-Mails an den Hersteller der Artikel.Prevent Observer Methode zweimal aufgerufen

Diese Lösung hat einige seltsame behavour:

  • Wenn Sie als registrierter Benutzer angemeldet - der Beobachter Methode wie erwartet
  • aufgerufen wird, wenn als Gastbenutzer Check-out, die „sales_order_payment_pay“ Ereignis fired ist wenn die „Zahlungsvorgang“ (Mastercard, VISA) war erfolgreich“und ein zweites Mal nach dem Klick auf‚Return-Taste‘, um die Magento-Shop zu kommen. weil dieses Verhalten die E-Mail zweimal gesendet wird.

Gibt es eine Möglichkeit zu verhindern, dass die Beobachtermethode zweimal ausgeführt wird?

Mit freundlichen Grüßen, Bertie

+0

Meine Frage ist nicht "mPAY24 Payment Gateway" spezifisch. Bitte geben Sie Ihre Ideen/Hinweise ein, um zu verhindern, dass eine Beobachtermethode zweimal ausgeführt wird. THX – Bertie

+0

werfen Sie einen Blick hier: http://Stackoverflow.com/questions/5838346/magento-customer-save-after-always-fired-twice –

Antwort

1

Nr Als Client (VS System) Entwickler, bekommt man nicht, wenn ein Ereignis ausgelöst wird, zu entscheiden.

Hier einige allgemeine Springen Punkte für die Lösung dieses Problems:

Stattdessen müssen Sie das Verhalten Ihres Beobachter Methode ändern. Anstatt blind eine E-Mail in der Beobachtermethode abzufeuern, müssen Sie den Status des Systems und/oder der Objekte im Array untersuchen und ermitteln, ob das Ereignis nach einer Zahlungstransaktion ausgelöst wurde oder ob es ausgelöst wurde nach dem Klicken auf den "Zurück-Button" klicken.

Wenn es ersteres ist, senden Sie Ihre E-Mail wie erwartet. Wenn es das später ist, einfach return von der Beobachtermethode und/oder überspringe die E-Mail mit einer bedingten.

Wenn dies nicht Ihre eigene Beobachtermethode ist, die das Problem darstellt (es ist ein zentraler Beobachter oder ein Beobachter, der Teil des Moduls ist), verwenden Sie eine Klassenumschreibung, um die Beobachtermethode durch Ihre eigene zu ersetzen. Wenn Sie den richtigen Status feststellen, rufen Sie die return parent::observerMethodName, wenn es der Zustand "Klicken Sie auf die Schaltfläche zurück" ist, geben Sie einfach null zurück und überspringen Sie den Aufruf der Eltern.

Wenn der Beobachter mit einem hartcodierten Klassennamen (kein Klassenalias) eingerichtet wurde, müssen Sie eine Code-Pool-Überschreibung verwenden, um das Verhalten Ihrer Methode zu ändern.

+0

Vielen Dank für Ihren Kommentar, diese Informationen hilft mir sehr. Der Observer ist Teil einer benutzerdefinierten Erweiterung, die von einem anderen Entwickler erstellt wurde und momentan nicht verfügbar ist. Die Observer-Methode verfügt nicht über ein Varien_Event_Observer-Objekt $ observer, das als Argument übergeben wurde. Klasse FOO_Bar_Observer { public function sendemail ($ Parameter) {// das Senden von E-Mails } } – Bertie