Determine si el cliente es nuevo en customer_save_after
-
22-10-2019 - |
Pregunta
Tengo eventos que deseo ejecutar cuando un cliente se registra o guarda sus detalles. Para esto, estoy usando dos eventos: customer_register_success y customer_save_after. El problema que tengo es que termino ejecutando la tarea dos veces ya que customer_save_after siempre se llama en la misma ejecución que customer_register_success
.
He tratado de detectar si el cliente es nuevo revisando los datos originales y llamé isObjectNew
, pero ambos devuelven datos que implican que el objeto de hecho no es nuevo. ¿Cómo puedo verificar si el cliente solo se está registrando en el evento Customer_save_after, menos que establezca algo en el registro en el customer_register_success
¿evento?
Solución
En primer lugar, puedes definir tu observador como singleton para ambos eventos
<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>
En este caso, se utilizará el mismo objeto Observador para ambos eventos. Por lo tanto, puede crear bandera en su observador y antes de hacer algunas acciones, verifíquelo.
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;
}
}
}
Ahora su código se ejecutará solo una vez.
Otros consejos
La forma más fácil de evitar que esto es usar un valor de registro. Tu método de observador se parecería a lo siguiente
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 primera vez que el método se llama registra una clave, lo que significa que la segunda vez que se activa ya no está vacía y el método volverá al inicio
Otro enfoque es verificar qué controlador y acción activaron el evento.
En el observador puede obtener el módulo, el controlador y el nombre de la acción.
$frontName = Mage::app()->getRequest()->getRouteName();
$controllerName = Mage::app()->getRequest()->getControllerName();
$actionName = Mage::app()->getRequest()->getActionName();
$myURI = $frontName . '_'. $controllerName . '_' . $actionName;
Y luego consulte su método que está enviando el evento.
En una instalación de Magento de stock, al crear un usuario del área de usuario, el valor de $ Myuri sería customer_account_createpost
.