Frage

Ich habe Veranstaltungen, die ich durchführen möchte, wenn ein Kunde seine Details registriert oder spart. Dafür verwende ich zwei Ereignisse: customer_register_success und customer_save_after. Das Problem, das ich habe, ist, dass ich die Aufgabe doppelt so ausführe, wie Customer_Save_after immer in derselben Ausführung aufgerufen wird wie customer_register_success.

Ich habe versucht festzustellen, ob der Kunde neu ist, indem ich die Originaldaten überprüfen und angerufen haben isObjectNew, aber beide Rückgabedaten, die impliziert, dass das Objekt tatsächlich nicht neu ist. Wie kann ich prüfen, ob sich der Kunde gerade im Customer_Save_after -Ereignis registriert customer_register_success Veranstaltung?

War es hilfreich?

Lösung

Zunächst können Sie Ihren Beobachter als Singleton für beide Ereignisse definieren

<global>
    <events>
        <customer_save_after>
            <observers>
                <namespace_module>
                    <type>singleton</type>
                    <class>namespace_module/observer</class>
                    <method>doSomething</method>
                </namespace_module>
            </observers>
        </customer_save_after>
        <customer_register_success>
            <observers>
                <namespace_module>
                    <type>singleton</type>
                    <class>namespace_module/observer</class>
                    <method>doSomething</method>
                </namespace_module>
            </observers>
        </customer_register_success>
    </events>
</global>

In diesem Fall wird das gleiche Observer -Objekt für beide Ereignisse verwendet. So können Sie Flaggen in Ihrem Beobachter erstellen und überprüfen, bevor Sie einige Aktionen überprüfen.

class [Namespace]_[Module]_Model_Observer
{
    protected $canDoSomething = false;

    public function doSomething($observer)
    {
        if (!$this->canDoSomething) {

            //here your code

            //now set flag to true to prevent executing your code twice 
            $this->canDoSomething = true;
        }
    }
}

Jetzt wird Ihr Code nur einmal ausgeführt.

Andere Tipps

Der einfachste Weg, dies zu verhindern, besteht darin, einen Registrierungswert zu verwenden. Ihre Beobachtermethode würde ungefähr wie folgt aussehen

class [Namespace]_[Module]_Model_Observer
{
   public function triggeredObserver($observer)
   {
      if (!empty(Mage::registry('[module]_istriggered')) return $this;

      // here you can perform whatever you want to do with your code

      Mage::register('[module]_istriggered', 1);
   }
}

Das erste Mal, dass die Methode genannt wird, registriert einen Schlüssel, was bedeutet, dass das zweite Mal, dass sie ausgelöst wird

Ein anderer Ansatz besteht darin, zu überprüfen, welche Controller und Aktion das Ereignis ausgelöst haben.

Im Beobachter können Sie den Namen Modul, Controller und Aktion erhalten.

$frontName = Mage::app()->getRequest()->getRouteName();
$controllerName = Mage::app()->getRequest()->getControllerName();
$actionName = Mage::app()->getRequest()->getActionName();

$myURI = $frontName . '_'. $controllerName . '_' . $actionName;

Und später in Ihre Methode einchecken, wer das Ereignis entsendet.

In einer Aktienmagento -Installation wäre der Wert von $ myuri bei der Erstellung eines Benutzers aus dem Benutzerbereich customer_account_createpost.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit magento.stackexchange
scroll top