Почему мой наблюдатель Magento застревает в бесконечной петле? - PullRequest
2 голосов
/ 02 июля 2010

Мой наблюдатель застрял в бесконечной петле. Почему это происходит и как я могу это исправить?

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 ]

4 голосов
/ 02 июля 2010

Ваш наблюдатель ожидает отправки груза, а затем сохраняет груз, в результате чего он получает другое событие (yadda yadda ad nauseum). Вам понадобится способ избежать петли или нет необходимости сохранять груз.

Можете ли вы переместить ваше событие на sales_order_shipment_save_before и затем позволить нормальному сохранению отправки вступить в силу, или вам нужно, чтобы доставка уже была сохранена для выполнения вашей части логики?

Если это так, измените следующую строку на вашем наблюдателе, чтобы Magento использовал ее в качестве одиночного:

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

Затем создайте переменную в своем классе, чтобы отслеживать, повторялись ли вы еще. Если так, то просто вернитесь.

В качестве альтернативы, вы можете проверить, есть ли какие-либо номера отслеживания уже в отгрузке, и сохранить только, если их нет (и вы добавляете один). Это также убьет рекурсию.

Дайте мне знать, если один из тех работает для вас.

Спасибо, Джо

0 голосов
/ 16 августа 2010

Я использовал

sales_order_shipment_save_after

и он работает для меня

Спасибо :))

...