php - example - magento 2 create events
Magento-customer_save_after siempre dispara dos veces (5)
Me di cuenta de este comportamiento de doble guardado también. La forma de evitar problemas con su observador es establecer un indicador en la solicitud que se puede verificar, por ejemplo:
if(Mage::registry(''customer_save_observer_executed'')){
return $this; //this method has already been executed once in this request (see comment below)
}
...execute arbitrary code here....
/* Customer Addresses seem to call the before_save event twice,
* so we need to set a variable so we only process it once, otherwise we get duplicates
*/
Mage::register(''customer_save_observer_executed'',true);
Estoy usando el evento customer_save_after
en magento, y todo funciona bien, aparte de 1 cosa molesta: siempre se dispara dos veces.
No hay otros módulos que reescriban esto y no puedo encontrar ninguna otra razón para que esto suceda. Cuando veo todos los eventos que son despedidos en este momento, este evento definitivamente es despedido dos veces.
Alguien explica esto?
Estoy escribiendo un servicio web que se engancha en esto y resulta ser bastante ineficiente para duplicar cosas.
Tenga cuidado con la solución Jonathans, ''customer_save_observer_executed'' permanece en la sesión, por lo que el evento no se volverá a activar en la sesión del navegador. Por lo general, es una mala idea, porque no permitirá registrar dos o más clientes seguidos (en realidad, lo hará, pero los eventos no se activarán)
Sugiero la siguiente solución:
public function customerRegister(Varien_Event_Observer $observer)
{
$customer = $observer->getEvent()->getCustomer();
if (!$customer->getId())
return $this;
if(Mage::registry(''customer_save_observer_executed_''.$customer->getId()))
return $this;
//your code goes here
Mage::register(''customer_save_observer_executed_''.$customer->getId(),true);
}
Usé una var estática:
private static $_handleCustomerFirstSearchCounter = 1;
public function Savest($observer) {
if (self::$_handleCustomerFirstSearchCounter > 1) {
return $this;
}
$customerData = Mage::getSingleton(''customer/session'')->getCustomer();
$model = Mage::getModel(''customerst/customerst'')
->setQueryText(Mage::app()->getRequest()->getParam(''q''))
->setCustomerId($customerData->getId())
->setCustomerName($customerData->getName())
->save();
self::$_handleCustomerFirstSearchCounter++;
}
La diferencia entre estos 2 eventos es que uno de ellos no puede obtener información del cliente, mientras que el otro puede. Entonces la solución es
public function email_CustomerRegister(Varien_Event_Observer $observer){
$customer = Mage::getSingleton(''customer/session'')->getCustomer();
$customer_email = $customer->getEmail();
if(empty($customer_email)){
return;
}
// do something
}
Me encontré con esto también e hice un seguimiento de la pila en el observador para cada método, y puedo decirle al menos UNA razón por la cual se dispara dos veces (puede haber otras):
Cuando un nuevo usuario crea una cuenta, createPostAction () se ejecuta cuando se envía el formulario. Esta acción hace un save()
en el cliente.
ENTONCES, después de que el cliente ha sido creado, setCustomerAsLoggedIn () es llamado por createPostAction (). Esto a su vez llama a setCustomer (), que tiene este pequeño código:
if ((!$customer->isConfirmationRequired()) && $customer->getConfirmation()) {
$customer->setConfirmation(null)->save(); // here is the second save
$customer->setIsJustConfirmed(true);
}
Esos son los dos save () s que envían el evento save. Solo sé esto con seguridad para la creación de cuentas en Magento 1.5. Dudo si se dispara dos veces al crear usuarios en el área de administración, o cuando un usuario edita su información ... pero no estoy seguro.
¡Espero que esto ayude!