Determina se il cliente è nuovo in customer_save_after


9

Ho eventi che desidero eseguire quando un cliente si registra o salva i propri dettagli. Per questo, sto usando due eventi: customer_register_success e customer_save_after. Il problema che sto riscontrando è che finisco per eseguire l'attività due volte poiché customer_save_after viene sempre chiamato nella stessa esecuzione di customer_register_success.

Ho provato a rilevare se il cliente è nuovo controllando i dati originali e chiamato isObjectNew, ma entrambi i dati di ritorno che implicano che l'oggetto non è in realtà nuovo. Come posso verificare se il cliente si sta semplicemente registrando nell'evento customer_save_after dopo aver impostato qualcosa nel registro customer_register_successdell'evento?

Risposte:


5

Prima di tutto puoi definire il tuo osservatore come singleton per entrambi gli eventi

<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 questo caso verrà utilizzato lo stesso oggetto osservatore per entrambi gli eventi. Quindi puoi creare un flag nel tuo osservatore e prima di fare alcune azioni controllalo.

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

Ora il tuo codice verrà eseguito una sola volta.


0

Il modo più semplice per impedire ciò è utilizzare un valore di registro. Il tuo metodo di osservazione sarebbe simile al seguente

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

La prima volta che viene chiamato il metodo registra una chiave, il che significa che la seconda volta che viene attivato non è più vuoto e il metodo tornerà all'inizio


Sì, ci avevo pensato, ma mi sembra abbastanza sporco :(. Sono sorpreso di non poter scoprire se un oggetto è stato appena creato in un evento model_save_after
Matthew Haworth

solo un beforeevento ha i isObjectNewdati per quanto ne so poiché i dati non sono ancora stati salvati. Per quanto riguarda lo sporco, immagino che ci sarebbero modi più eleganti ma non è certo un trucco
Sander Mangel

$customer->save(); $this->_dispatchRegisterSuccess($customer);sfortunatamente qui, il cliente viene salvato prima che venga attivato l'evento register, quindi il metodo dell'osservatore non funzionerebbe comunque :(
Matthew Haworth

0

Un altro approccio consiste nel verificare quale controller e azione hanno attivato l'evento.

Nell'osservatore è possibile ottenere il modulo, il controller e il nome dell'azione.

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

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

E successivamente controlla il tuo metodo che sta inviando l'evento.

In un'installazione magento di scorta, quando si crea un utente dall'area utente, il valore di $ myURI sarebbe customer_account_createpost.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.