Domanda

Ho eventi che desidero da eseguire quando un cliente si registra o salva i propri dati. Per questo, io sto usando due eventi: customer_register_success e customer_save_after. Il problema che sto avendo è che io alla fine l'esecuzione dell'attività doppio di customer_save_after viene sempre chiamato nella stessa esecuzione come customer_register_success.

ho cercato di rilevare se il cliente è nuovo controllando i dati originali e chiamato isObjectNew, ma entrambi i dati di ritorno che implica l'oggetto è in realtà non è nuova. Come posso controllare per vedere se il cliente è solo registrando nel breve evento customer_save_after di impostare qualcosa nel Registro di sistema in caso customer_register_success?

È stato utile?

Soluzione

Prima di tutto si può definire il vostro 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 lo stesso oggetto osservatore sarà usato per entrambi gli eventi. Così si può creare bandiera nella vostra osservatore e prima di fare alcune azioni controllano.

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 codice verrà eseguito solo una volta.

Altri suggerimenti

Il modo più semplice per evitare questo è quello di utilizzare un valore di registro. Il tuo metodo osservatore 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 il metodo viene chiamato lo registeres una chiave, il che significa che la seconda volta che si scateni non è svuotare più e il metodo restituirà al via

Un altro approccio è quello di controllare quale controller e l'azione ha attivato l'evento.

l'osservatore è possibile ottenere il nome del modulo, controllo e di azione.

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

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

E più tardi il check-nel metodo di chi invia l'evento.

In un magazzino Magento installare, quando si crea un utente dall'area utente il valore di $ myURI sarebbe customer_account_createpost.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a magento.stackexchange
scroll top