2011-04-29 99 views
15

我在使用magento中的customer_save_after事件,並且除了一件煩人的事情之外,它們都工作正常 - 它總是被激發兩次。Magento - customer_save_after始終發射兩次

有沒有其他模塊重寫這個,我可以找到沒有其他原因發生這種情況。當我查看所有被解僱的事件時,這個事件肯定會被解僱兩次。

有人解釋過這個嗎?

我正在編寫一個Web服務,鉤住這個,它的效率很低,複製的東西。

回答

11

我遇到了這個問題,以及和做觀察者每個方法的堆棧跟蹤,並能告訴你,至少有一個原因,它觸發兩次(有可能是其他人):

當新用戶創建一個帳戶createPostAction()在提交表單時運行。此操作對客戶執行save()

然後,在創建客戶後,通過createPostAction()調用setCustomerAsLoggedIn()。這反過來又調用setCustomer(),它的代碼這一點:

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

就是這兩種保存()S的調度保存事件。我只知道這在Magento 1.5中的帳戶創建。我懷疑在管理員區域創建用戶時是否觸發了兩次,或者用戶編輯了他們的信息......但我無法確定。

我希望這有助於!

+0

好偵探工作,謝謝! – 2011-05-20 06:10:09

+0

感謝您的偵探工作,這應該被標記爲答案。 – Phil 2012-05-09 01:56:11

23

我注意到這種雙重保存行爲了。防止觀察者出現問題的方法是在請求中設置一個可以被檢查的標記,例如,

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

awesom它的作品! – huzefam 2014-09-17 10:19:51

0

小心。用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); 
} 
+1

實際上,customer_register_success事件對於觀察客戶註冊來說更好。 – 2013-11-07 13:24:20

+0

是的,但是,當用戶保存在帳戶儀表板上時,customer_register_success不會觸發。 – DWils 2014-03-05 20:33:10

+0

@VladislavMosalsky註冊表項只對該請求存在,他們不*留在會話中(參考http://alanstorm.com/magento_registry_singleton_tutorial) – 2014-09-17 14:20:14

0

我用靜止無功:

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

這兩個事件之間的區別是他們中的一個無法得到客戶的信息,而其他的都可以。所以解決辦法是

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 
    }