2010-07-02 31 views
2

我的观察陷在和无限循环。为什么会发生,我该如何解决?为什么我的Magento观察员陷入无尽循环?

config.xml文件:

<?xml version="1.0"?> 
<config> 
    <global> 
     <models> 
      <shipmentsave> 
       <class>Company_Shipmentsave_Model</class> 
      </shipmentsave> 
     </models> 
    </global> 
    <adminhtml> 
     <events> 
      <sales_order_shipment_track_save_after> 
       <observers> 
        <shipmentsave> 
         <type>model</type> 
         <class>shipmentsave/observer</class> 
         <method>salesOrderShipmentTrackSaveAfter</method> 
        </shipmentsave> 
       </observers> 
      </sales_order_shipment_track_save_after> 
      <sales_order_shipment_save_after> 
       <observers> 
        <shipmentsave> 
         <type>model</type> 
         <class>shipmentsave/observer</class> 
         <method>salesOrderShipmentSaveAfter</method> 
        </shipmentsave> 
       </observers> 
      </sales_order_shipment_save_after> 
     </events> 
    </adminhtml> 
    <frontend> 
     <events> 
      <sales_order_shipment_save_after> 
       <observers> 
        <shipmentsave> 
         <type>singleton</type> 
         <class>shipmentsave/observer</class> 
         <method>salesOrderShipmentSaveAfter</method> 
        </shipmentsave> 
       </observers> 
      </sales_order_shipment_save_after> 
     </events> 
    </frontend> 
</config> 

Observer.php:

class Company_Shipmentsave_Model_Observer 
{ 
    public function salesOrderShipmentSaveAfter(Varien_Event_Observer $observer) 
    { 
     error_log("My observer called ....",0); 
     $shipment = $observer->getEvent()->getShipment(); 
     $order = $shipment->getOrder(); 
     $track = Mage::getModel('sales/order_shipment_track') 
      ->setNumber('1231354564') 
      ->setCarrierCode('localdelivery') 
      ->setTitle('Aramex'); 
     $shipment->addTrack($track); 
     $shipment->save(); 
     return; 
    } 
} 

回答

4

你的观察等待,以得到保存出货,然后保存出货,从而导致它接收另一个事件(yadda yadda ad nauseum)。您需要一种逃避循环或不必保存货件的方法。

您是否可以将您的活动移动到sales_order_shipment_save_before上,然后允许正常发货保存生效,或者您是否需要发货已保存以完成您的逻辑部分?

如果是的话,更改你的观察以下行,使Magento的使用它作为一个单身:

<type>singleton</type> // changed from model 

然后,创建你的类变量来跟踪您是否已经又递归。如果是这样,那就回去。

或者,你可以检查,看看是否已经有上装运任何跟踪号码,只有在有没有(和你加一个)保存。这也会杀死递归。

让我知道,如果这些对你的作品之一。

谢谢, 乔

+0

喜乔, 感谢回答。 我想你的意思sales_order_shipment_before而不是sales_order_shipment_after因为我使用sales_order_shipment_after 是改变事件sales_order_shipment_before工作对我来说已经面临的问题。 但还是好奇,想知道如何使用sales_order_shipment_save_after如果有的话我需要。 问候, SAURABH – Saurabh 2010-07-03 04:05:22

+0

它已经因为你回答了这个很长一段时间,但可以提供一些见解如何设置,你在你的答案谈单变量? – spdaly 2012-12-05 17:02:07

0

我用

sales_order_shipment_save_after 

其工作对我来说

谢谢:)