Weiß jemand, ob es möglich ist, die Registrierung eines Ereignisbeobachters programmgesteuert aufzuheben? Ich habe einen Beobachter newsletter_subscribe_save_after
, der ein benutzerdefiniertes Attribut im Kundenmodell aktualisiert, aber wenn der Kundendatensatz gespeichert wird, wird das customer_save_after
definierte Ereignis Mage_All.xml
ausgelöst, bei dem der Newsletter-Abonnementstatus erneut gespeichert wird, was zu einer Endlosschleife führt, die dann den fälligen PHP-Rekursionsfehler auslöst 100 mal verschachteln.
Idealerweise möchte ich die Registrierung des customer_save_after
Ereignisses nur dann aufheben, wenn mein Beobachter feuert.
event-observer
ee-1.10
Richard Cleverley
quelle
quelle
Antworten:
Sie können versuchen, Ihr Ereignis als zu markieren,
dispatched
und beim zweiten Versuch, es auszuführen, nichts tun, wenn es bereits ausgelöst wurde. Angenommen, Ihre Methode wird aufgerufenupdateCustomer()
.Der Name des Registrierungsschlüssels ist nicht wichtig. Stellen Sie nur sicher, dass Sie in beiden Fällen denselben verwenden.
quelle
Sie können ein Ereignis deregistrieren Beobachter on the fly programmatisch wie folgt:
Sie können die Registrierung eines Ereignisses selbst nicht aufheben. Um ein Ereignis vollständig zu deaktivieren, müssten Sie alle
$branch . '/events/customer_save_after/observers'
untergeordneten Elemente eines Ereignisses durchlaufen und jedes deaktivieren.Wenn es sich nur um eine einzelne bestimmte Beobachtermethode handelt, die Sie nicht erneut ausführen möchten, können Sie den Typ festlegen
singleton
und dann einfach eine boolesche Eigenschaft als Flag verwenden, um zu überprüfen, ob sie bereits einmal wie folgt aufgerufen wurde:quelle
Hier ist eine Proof-of-Concept-Hilfsmethode, mit der ein vorhandener Beobachter umgeschaltet werden kann. Wenn Sie das Ereignis standardmäßig deaktivieren möchten, fügen
<type>disabled</type>
Sie es der config.xml-Definition Ihres Beobachters hinzu.Die Funktion nutzt die Reflexion, um auf das ansonsten geschützte
$_events
Eigentum von zuzugreifenMage_Mage_Core_Model_App
. Der gleiche Trick könnte verwendet werden, um zuvor undefinierte Beobachter zu injizieren.quelle