Determine si el cliente es nuevo en customer_save_after

9

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 intentado detectar si el cliente es nuevo comprobando los datos originales y llamado isObjectNew, pero ambos devuelven datos que implican que el objeto no es nuevo. ¿Cómo puedo verificar si el cliente se está registrando en el evento customer_save_after antes de configurar algo en el registro en el customer_register_successevento?

Matthew Haworth
fuente

Respuestas:

5

En primer lugar, puede definir su 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. Para que pueda crear un indicador en su observador y antes de realizar algunas acciones, márquelo.

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.

oleksii.svarychevskyi
fuente
0

La forma más fácil de evitar esto es usar un valor de registro. Su método de observación sería similar al 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 se llama al método, registra una clave, lo que significa que la segunda vez que se activa ya no está vacío y el método volverá al inicio

Sander Mangel
fuente
Sí, había pensado en esto, pero se siente bastante sucio :(. Me sorprende que no pueda descubrir si se acaba de crear un objeto en un evento model_save_after
Matthew Haworth
solo un beforeevento tiene los isObjectNewdatos hasta donde yo sé, ya que los datos aún no se guardan. En cuanto a lo sucio, supongo que habría formas más elegantes, pero ciertamente no es un truco
Sander Mangel
$customer->save(); $this->_dispatchRegisterSuccess($customer);desafortunadamente aquí, el cliente se guarda antes de que se active el evento de registro, por lo que el método de observación no funcionaría de todos modos :(
Matthew Haworth
0

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 verifique en su método quién está enviando el evento.

En una instalación de stock de magento, al crear un usuario desde el área de usuario, el valor de $ myURI sería customer_account_createpost.

Isaias
fuente