Magento – customer_save_after всегда дважды запускается

Я использую событие customer_save_after в magento, и все отлично работает, кроме одной раздражающей вещи – она ​​всегда срабатывает дважды.

Никаких других модулей не переписывать, и я не могу найти других причин для этого. Когда я просматриваю все события, уволенные в это время, и это событие окончательно уволили дважды.

Кто-нибудь это объясняет?

Я пишу веб-сервис, который подключается к этому, и он оказывается довольно неэффективным, чтобы дублировать вещи.

    Related of "Magento – customer_save_after всегда дважды запускается"

    Я тоже заметил это поведение с двойным сохранением. Способ предотвращения проблемы с вашим наблюдателем – установить флаг в запросе, который можно проверить, например

      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); 

    Я столкнулся с этим также и сделал трассировку стека в наблюдателе для каждого метода и могу рассказать вам хотя бы ОДНУ причину, по которой он срабатывает дважды (могут быть и другие):

    Когда новый пользователь создает учетную запись, createPostAction () запускается при отправке формы. Это действие выполняет функцию save() для клиента.

    Затем, после создания клиента, setCustomerAsLoggedIn () вызывается createPostAction (). Это, в свою очередь, вызывает setCustomer (), у которого есть этот немного кода:

      if ((!$customer->isConfirmationRequired()) && $customer->getConfirmation()) { $customer->setConfirmation(null)->save(); // here is the second save $customer->setIsJustConfirmed(true); } на  if ((!$customer->isConfirmationRequired()) && $customer->getConfirmation()) { $customer->setConfirmation(null)->save(); // here is the second save $customer->setIsJustConfirmed(true); } на  if ((!$customer->isConfirmationRequired()) && $customer->getConfirmation()) { $customer->setConfirmation(null)->save(); // here is the second save $customer->setIsJustConfirmed(true); } 

    Это два save (), которые отправляют событие сохранения. Я точно знаю это только для создания учетной записи в Magento 1.5. Я сомневаюсь, что он дважды срабатывает при создании пользователей в области администратора или когда пользователь редактирует их информацию … но я не знаю точно.

    Надеюсь, это поможет!

    Будьте осторожны с решением Jonathans, «customer_save_observer_executed» остается в сеансе, поэтому событие не будет запущено в сеансе браузера. Таким образом, это, как правило, плохая идея, потому что она не позволит регистрировать двух или более клиентов подряд (на самом деле, это произойдет, но события не будут запущены)

    Я предлагаю следующее решение:

     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); } на 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); } на 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); } 

    Я использовал статический var:

     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++; } 

    Разница между этими двумя событиями одна из них не может получить информацию о клиенте, а другая может. Таким образом, решение

      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 }