2010-07-02 4 views
2

Mon observateur est coincé dans une boucle sans fin. Pourquoi cela arrive-t-il et comment puis-je le réparer?Pourquoi mon observateur Magento est-il coincé dans une boucle sans fin?

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

Répondre

4

Votre observateur attend une expédition pour être sauvé, puis enregistre une expédition qui l'amène à recevoir un autre événement (yadda yadda ad nauseum). Vous aurez besoin d'un moyen d'échapper à la boucle ou ne pas avoir à enregistrer une expédition. Pouvez-vous déplacer votre événement sur sales_order_shipment_save_before, puis autoriser la sauvegarde normale des envois, ou avez-vous besoin que l'envoi ait déjà été enregistré pour faire votre part de logique?

Si, modifiez la ligne suivante sur votre observateur afin que Magento utilise comme un singleton:

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

Ensuite, créez une variable dans votre classe pour suivre si vous avez encore récursifs. Si oui, alors revenez. Vous pouvez également vérifier s'il existe déjà des numéros de suivi sur l'envoi et enregistrer uniquement s'il n'y en a pas (et vous en ajoutez un). Cela va tuer la récursivité aussi. Faites-moi savoir si l'un d'entre eux fonctionne pour vous.

Merci, Joe

+0

Salut Joe, merci pour la réponse. Je pense que vous voulez dire sales_order_shipment_before et non sales_order_shipment_after parce que je suis confronté déjà problème à l'aide sales_order_shipment_after oui Modifier l'événement à sales_order_shipment_before travaillé pour moi. mais toujours curieux de savoir comment utiliser sales_order_shipment_save_after si jamais j'ai besoin. salut, saurabh – Saurabh

+0

Cela fait longtemps que vous n'avez pas répondu à cette question, mais pouvez-vous nous donner un aperçu de la configuration de la variable singleton dont vous parlez dans votre réponse ??? – spdaly

0

j'ai utilisé

sales_order_shipment_save_after 

et son fonctionnement pour moi

Merci :)

Questions connexes