奇怪行为Magento订单收集活动

时间:2017-08-02 18:04:32

标签: php magento magento-1.9

我试图整合与我合作的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))

我对发生的事情有很多疑问:

  1. 为什么事件会发生3次?我原以为我为Mage::register添加的代码会阻止它在第一次执行后执行。
  2. 为什么我会收到有关重复数据的错误,理论上我并没有在集合中添加任何内容我只是循环遍历该集合中已有的内容。
  3. 这是处理从第三方产品检索订单信息的最佳方式吗?
  4. 当我删除对getOrderCollection()的调用时,我不再收到错误消息,并且页面加载正常。如果检索它会如何操作集合会导致重复错误?

    另外需要注意的是,如果我切换到 sales_order_collection_load_after 事件,一切正常,没有错误。现在的问题是,如果我更新并保存集合中的订单,则更改不会显示在页面上,直到刷新页面为止(默认主题,在视图订单页面内)。

    我已编辑此帖子以努力提高其可读性

0 个答案:

没有答案