为什么我的Magento观察者陷入无限循环?

时间:2010-07-02 10:12:09

标签: magento observer-pattern

我的观察者陷入无休止的循环中。为什么会发生这种情况?如何解决?

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;
    }
}

2 个答案:

答案 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

它为我工作

谢谢:)