Sprawdź, czy klient jest nowy w customer_save_after

9

Mam zdarzenia, które chcę wykonać, gdy klient zarejestruje się lub zapisze swoje dane. W tym celu używam dwóch zdarzeń: customer_register_success i customer_save_after. Problem, który mam, polega na tym, że kończę zadanie dwa razy, ponieważ klient_save_after jest zawsze wywoływany w tym samym wykonaniu co customer_register_success.

Próbowałem wykryć, czy klient jest nowy, sprawdzając oryginalne dane i wywołując isObjectNew, ale oba zwracają dane sugerujące, że obiekt w rzeczywistości nie jest nowy. Jak mogę sprawdzić, czy klient rejestruje się w zdarzeniu customer_save_after, po czym nie ustawia czegoś w rejestrze customer_register_successzdarzenia?

Matthew Haworth
źródło

Odpowiedzi:

5

Przede wszystkim możesz zdefiniować swojego obserwatora jako singleton dla obu wydarzeń

<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>

W takim przypadku dla obu zdarzeń zostanie użyty ten sam obiekt obserwatora. Możesz więc utworzyć flagę w swoim obserwatorze i przed wykonaniem niektórych czynności sprawdź ją.

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;
        }
    }
}

Teraz twój kod zostanie wykonany tylko raz.

oleksii.svarychevskyi
źródło
0

Najłatwiejszym sposobem uniknięcia tego jest użycie wartości rejestru. Twoja metoda obserwatora wyglądałaby mniej więcej tak:

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);
   }
}

Przy pierwszym wywołaniu metody rejestruje klucz, co oznacza, że ​​przy drugim uruchomieniu nie jest już pusta, a metoda powróci na początku

Sander Mangel
źródło
Tak, myślałem o tym, ale wydaje mi się dość brudny :(. Dziwię się, że nie mogę dowiedzieć się, czy obiekt został właśnie utworzony w zdarzeniu model_save_after
Matthew Haworth
o ile wiem, tylko beforezdarzenie ma isObjectNewdane, ponieważ dane nie zostały jeszcze zapisane. Jeśli chodzi o brud, wydaje się, że byłyby bardziej eleganckie sposoby, ale z pewnością nie jest to hack
Sander Mangel
$customer->save(); $this->_dispatchRegisterSuccess($customer);niestety tutaj klient jest zapisywany przed wywołaniem zdarzenia rejestracyjnego, więc metoda obserwatora i tak by nie działała :(
Matthew Haworth
0

Innym podejściem jest sprawdzenie, który kontroler i akcja wywołały zdarzenie.

W obserwatorze możesz uzyskać nazwę modułu, kontrolera i akcji.

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

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

A później sprawdź swoją metodę, która wysyła zdarzenie.

W standardowej instalacji Magento, podczas tworzenia użytkownika z obszaru użytkownika wartość $ myURI byłaby customer_account_createpost.

Isaias
źródło