Stellen Sie fest, ob der Kunde in customer_save_after neu ist

9

Ich habe Ereignisse, die ich ausführen möchte, wenn ein Kunde seine Daten registriert oder speichert. Dafür verwende ich zwei Ereignisse: customer_register_success und customer_save_after. Das Problem, das ich habe, ist, dass ich die Aufgabe am Ende zweimal ausführe, da customer_save_after immer in derselben Ausführung wie aufgerufen wird customer_register_success.

Ich habe versucht festzustellen, ob der Kunde neu ist, indem ich die Originaldaten überprüft und angerufen habe isObjectNew, aber beide Rückgabedaten, die das Objekt implizieren, sind tatsächlich nicht neu. Wie kann ich überprüfen, ob sich der Kunde gerade im Ereignis customer_save_after registriert, ohne etwas in der Registrierung des customer_register_successEreignisses festzulegen?

Matthew Haworth
quelle

Antworten:

5

Zunächst können Sie Ihren Beobachter für beide Ereignisse als Singleton 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 für beide Ereignisse dasselbe Beobachterobjekt verwendet. So können Sie in Ihrem Beobachter ein Flag erstellen und es vor einigen 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 noch einmal ausgeführt.

oleksii.svarychevskyi
quelle
0

Der einfachste Weg, dies zu verhindern, ist die Verwendung eines Registrierungswerts. Ihre Beobachtermethode würde ungefähr so ​​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);
   }
}

Wenn die Methode zum ersten Mal aufgerufen wird, registriert sie einen Schlüssel. Wenn sie zum zweiten Mal ausgelöst wird, ist sie nicht mehr leer und die Methode kehrt beim Start zurück

Sander Mangel
quelle
Ja, ich hatte darüber nachgedacht, aber es fühlt sich ziemlich schmutzig an :(. Ich bin überrascht, dass ich nicht herausfinden kann, ob ein Objekt gerade in einem model_save_after-Ereignis erstellt wurde
Matthew Haworth
Nur ein beforeEreignis hat die isObjectNewDaten, soweit ich weiß, da die Daten noch nicht gespeichert sind. Was schmutzig angeht, würde es wohl elegantere Wege geben, aber es ist sicherlich kein Hack
Sander Mangel
$customer->save(); $this->_dispatchRegisterSuccess($customer);Leider wird hier der Kunde gespeichert, bevor das Registerereignis ausgelöst wird, sodass die Beobachtermethode sowieso nicht funktionieren würde :(
Matthew Haworth
0

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

Im Observer erhalten Sie den Modul-, Controller- und Aktionsnamen.

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

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

Überprüfen Sie später Ihre Methode, wer das Ereignis auslöst.

Bei einer Standard-Magento-Installation wäre beim Erstellen eines Benutzers aus dem Benutzerbereich der Wert von $ myURI customer_account_createpost.

Jesaja
quelle