Magento - customer_save_after всегда срабатывает дважды - PullRequest
15 голосов
/ 30 апреля 2011

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

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

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

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

Ответы [ 5 ]

23 голосов
/ 20 мая 2011

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

    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); 
11 голосов
/ 20 мая 2011

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

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

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

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

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

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

1 голос
/ 06 ноября 2013

Будьте осторожны с решением 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); 
}  
0 голосов
/ 19 декабря 2014

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

    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
    }
0 голосов
/ 29 декабря 2013

Я использовал статическую переменную:

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