我的观察者陷入了无限循环。为什么会发生这种情况以及如何解决它?
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;
}
}
最佳答案
您的观察者等待保存货件,然后保存货件,这会导致它接收另一个事件 (yadda yadda ad nauseum)。您需要一种方法来摆脱循环或不必保存货件。
您能否将事件移至 sales_order_shipment_save_before
,然后允许正常的发货保存生效,或者您是否需要已经保存发货才能完成您的部分逻辑?
如果是这样,请更改观察者上的以下行,以便 Magento 将其用作单例:
<type>singleton</type> // changed from model
然后,在您的类中创建一个变量来跟踪您是否已经递归。如果是这样,那么就返回。
或者,您可以检查货件上是否已有任何跟踪号码,只有在没有的情况下才保存(并且您添加了一个)。这也会终止递归。
请告诉我其中一个是否适合您。
谢谢, 乔
关于magento - 为什么我的 Magento 观察者陷入无限循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3164800/