Determinare se il cliente è nuovo in customer_save_after
-
22-10-2019 - |
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
?
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
.