我在使用magento中的customer_save_after
事件,並且除了一件煩人的事情之外,它們都工作正常 - 它總是被激發兩次。Magento - customer_save_after始終發射兩次
有沒有其他模塊重寫這個,我可以找到沒有其他原因發生這種情況。當我查看所有被解僱的事件時,這個事件肯定會被解僱兩次。
有人解釋過這個嗎?
我正在編寫一個Web服務,鉤住這個,它的效率很低,複製的東西。
我在使用magento中的customer_save_after
事件,並且除了一件煩人的事情之外,它們都工作正常 - 它總是被激發兩次。Magento - customer_save_after始終發射兩次
有沒有其他模塊重寫這個,我可以找到沒有其他原因發生這種情況。當我查看所有被解僱的事件時,這個事件肯定會被解僱兩次。
有人解釋過這個嗎?
我正在編寫一個Web服務,鉤住這個,它的效率很低,複製的東西。
我遇到了這個問題,以及和做觀察者每個方法的堆棧跟蹤,並能告訴你,至少有一個原因,它觸發兩次(有可能是其他人):
當新用戶創建一個帳戶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中的帳戶創建。我懷疑在管理員區域創建用戶時是否觸發了兩次,或者用戶編輯了他們的信息......但我無法確定。
我希望這有助於!
我注意到這種雙重保存行爲了。防止觀察者出現問題的方法是在請求中設置一個可以被檢查的標記,例如,
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);
awesom它的作品! – huzefam 2014-09-17 10:19:51
小心。用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);
}
實際上,customer_register_success事件對於觀察客戶註冊來說更好。 – 2013-11-07 13:24:20
是的,但是,當用戶保存在帳戶儀表板上時,customer_register_success不會觸發。 – DWils 2014-03-05 20:33:10
@VladislavMosalsky註冊表項只對該請求存在,他們不*留在會話中(參考http://alanstorm.com/magento_registry_singleton_tutorial) – 2014-09-17 14:20:14
我用靜止無功:
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
}
好偵探工作,謝謝! – 2011-05-20 06:10:09
感謝您的偵探工作,這應該被標記爲答案。 – Phil 2012-05-09 01:56:11