我试图整合与我合作的ERP和Magento。我大部分已经完成了这项工作但是我在尝试获取订单状态(货件,发票等等)以便从ERP更新到Magento时遇到了一些问题。现在,我试图挂钩Magento中的 sales_order_collection_load_before 事件,然后进行API调用,查找ERP中当前状态,以查找未完成/关闭的任何订单。
如果有更好的方法来解决这个问题,我不必使用 sales_order_collection_load_before 事件,但我很好奇为什么这个事件的运作方式如此。
让我们潜入,这是我的观察员代码:
public function getOrderCollectionStatus ( $observer ) {
Mage::log(" _____ STARTING EVENT (v3.0) _____", null, 'customEvent.log');
// Added the registry/register code to deal with the event firing twice
if ( Mage::registry('do_not_fire_event_multiple_times') ) {
Mage::log(' _____ EVENT COMPLETE (already fired) _____ ', null, 'customEvent.log');
return $this;
}
Mage::register('do_not_fire_event_multiple_times', true);
Mage::log(" Before Retrieving Event ", null, 'customEvent.log');
$event = $observer->getEvent();
$collection = $event->getOrderCollection();
Mage::log(" Before Foreach ", null, 'customEvent.log');
foreach ( $collection as $order ) {
Mage::log(" Order ID: " . $order->getId(), null, 'customEvent.log');
}
Mage::log(' _____ EVENT COMPLETE (everything finished) _____ ', null, 'customEvent.log');
return $this;
}
这里执行代码的时候是日志文件输出。
_____ STARTING EVENT (v3.0) _____
Before Retrieving Event
Before Foreach
_____ STARTING EVENT (v3.0) _____
_____ EVENT COMPLETE (already fired) _____
Order ID: 13
_____ EVENT COMPLETE (everything finished) _____
_____ STARTING EVENT (v3.0) _____
Before Retrieving Event
Before Foreach
_____ STARTING EVENT (v3.0) _____
_____ EVENT COMPLETE (already fired) _____
Order ID: 13
_____ EVENT COMPLETE (everything finished) _____
_____ STARTING EVENT (v3.0) _____
Before Retrieving Event
Before Foreach
_____ STARTING EVENT (v3.0) _____
_____ EVENT COMPLETE (already fired) _____
Order ID: 13
_____ EVENT COMPLETE (everything finished) _____
正如您所看到的,当我运行getOrderCollection()
方法时,它似乎再次触发事件。我试图通过添加Mage::register
来防止这种情况进入无限循环。
我仍然在 / var / reports / 中获得以下输出,并且页面无法加载。
a:5:{i:0;s:65:"Item (Mage_Sales_Model_Order) with the same id "13" already exist";i:1;s:4714:"#0 C:\Development\webservers\magento-1.9.2.4-0\apps\magento\htdocs\lib\Varien\Data\Collection\Db.php(582): Varien_Data_Collection->addItem(Object(Mage_Sales_Model_Order))
我对发生的事情有很多疑问:
Mage::register
添加的代码会阻止它在第一次执行后执行。当我删除对getOrderCollection()
的调用时,我不再收到错误消息,并且页面加载正常。如果检索它会如何操作集合会导致重复错误?
另外需要注意的是,如果我切换到 sales_order_collection_load_after 事件,一切正常,没有错误。现在的问题是,如果我更新并保存集合中的订单,则更改不会显示在页面上,直到刷新页面为止(默认主题,在视图订单页面内)。
我已编辑此帖子以努力提高其可读性