我的观察者陷入无休止的循环中。为什么会发生这种情况?如何解决?
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;
}
}
答案 0 :(得分:4)
您的观察员等待货物被保存,然后保存货物,这导致它接收另一个事件(yadda yadda ad nauseum)。您将需要一种方法来逃避循环或不必保存货物。
您可以将活动移至sales_order_shipment_save_before
,然后让正常的货件保存生效,或者您是否需要保存已经保存的货件以执行您的部分逻辑?
如果是这样,请更改观察者的以下行,以便Magento将其用作单身:
<type>singleton</type> // changed from model
然后,在类中创建一个变量来跟踪您是否已经递归。如果是这样,那就回来吧。
或者,您可以检查货件上是否已有任何跟踪号码,只有在没有的情况下才会保存(并添加一个)。这也会杀死递归。
如果其中一项适合您,请告诉我。
谢谢, 乔
答案 1 :(得分:0)
我用过
sales_order_shipment_save_after
它为我工作
谢谢:)