sales_order_save_commit_after событие запускается дважды?
-
16-10-2019 - |
Вопрос
Я зарегистрировал наблюдателя за sales_order_save_commit_after
Событие, которое должно быть уведомлено, когда появляется новый заказ. Это работает нормально, но событие запускается два раза подряд с одним и тем же заказом.
Мой config.xml
<sales_order_save_commit_after>
<observers>
<unique_sales_order_save_commit_after>
<type>singleton</type>
<class>mymodule/observer</class>
<method>export</method>
</unique_sales_order_save_commit_after>
</observers>
</sales_order_save_commit_after>
Как я могу проверить, будет ли это в первый раз или какое другое событие будет лучше?
Обновлять
Я также попробовал sales_order_invoice_pay
событие (найдено на ТАК) но это не запускается для меня.
Решение
Попробуйте использовать sales_order_save_after
Вместо этого он запускается сразу после сохранения заказа в базе данных и возвращает объект полного порядка
Почему это событие запускается дважды, я не уверен. Это событие, вызванное из Core/Model/Abstract.php
метод afterCommitCallback
, Кажется, что Magento сохраняет / совершает 2 различных набора данных на модели порядка. Возможно, однажды сам порядок и однажды история статуса.
Есть ли какая -то разница между данными, проанализированными на двух событиях, которые могут дать ключом к тому, откуда они называются?
Другие советы
Если у кого -то все еще есть проблемы с этим, я узнал, как Magento имеет дело с этим.
В вызываемом методе вы можете взять заказ и установить на него флаг.
Бывший:
public function export(Varien_Event_Observer $observer) {
$order = $observer->getEvent()->getOrder();
if($order->getExportProcessed()){ //check if flag is already set.
return;
}
// your part of code
//"setExportProcessed" can be called anything you want as it's getting set magically by magento on our $order object.
$order->setExportProcessed(true);
}
В приложении/code/core/mage/cataloginentory/model/xemver.php
Функция suptractquoteinentory (varien_event_observer $ stemver)
является примером того, как Magento имеет дело с этим.
Я изменил событие на sales_order_place_after
. Анкет Это работает нормально.
public function sendEmail(Varien_Event_Observer $observer) {
if(!Mage::registry('varien_event')){
//your code here...
Mage::register('varien_event',true);
}
}
Код BOVE работает для меня.