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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top