Magento - customer_save_after всегда дважды запускается
Я использую событие customer_save_after
в magento, и все отлично работает, кроме одной раздражающей вещи - он всегда срабатывает дважды.
Нет никаких других модулей, переписывающих это, и я не могу найти никакой другой причины для этого. Когда я просматриваю все события, уволенные в это время, и это событие окончательно уволили дважды.
Кто-нибудь объясняет это?
Я пишу веб-сервис, который подключается к этому, и он оказывается довольно неэффективным для дублирования вещей.
Ответы
Ответ 1
Я тоже заметил это поведение с двойным сохранением. Способ предотвращения проблемы с вашим наблюдателем - установить флаг в запросе, который можно проверить, например.
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);
Ответ 2
Я тоже столкнулся с этим и сделал трассировку стека в наблюдателе для каждого метода и могу сказать вам хотя бы ОДНУ причину, по которой он срабатывает дважды (могут быть и другие):
Когда новый пользователь создает учетную запись, createPostAction() запускается при отправке формы. Это действие делает save()
для клиента.
Затем, после создания клиента, setCustomerAsLoggedIn() вызывается createPostAction(). Это, в свою очередь, вызывает setCustomer(), у которого есть этот немного кода:
if ((!$customer->isConfirmationRequired()) && $customer->getConfirmation()) {
$customer->setConfirmation(null)->save(); // here is the second save
$customer->setIsJustConfirmed(true);
}
Это два save(), которые отправляют событие сохранения. Я точно знаю это только для создания учетной записи в Magento 1.5. Я сомневаюсь, что он запускается дважды при создании пользователей в области администратора или когда пользователь редактирует их информацию... но я не знаю точно.
Надеюсь, это поможет!
Ответ 3
Будьте осторожны с решением 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);
}
Ответ 4
Я использовал статический 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++;
}
Ответ 5
Разница между этими двумя событиями одна из них не может получить информацию о клиенте, а другая может. Таким образом, решение
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
}