2010-08-16 19 views
9

2 del mio osservatore stanno osservando lo stesso evento sales_order_shipment_save_before. ModuleA era quello ho creato prima e poi ho creato ModuleBMagento - 2 o più osservatori sullo stesso evento

Ora solo ModuleB s' osservatore è chiamato e non ModuleA.

Per favore fatemi sapere come posso risolvere questo ed entrambi gli osservatori sono chiamati.

ModuleA

<?xml version="1.0"?> 
<config> 
    <global> 
     <models> 
      <shipmentsave> 
       <class>My_Shipmentsave_Model</class> 
      </shipmentsave> 
     </models> 
    </global> 
    <adminhtml> 
     <events> 
      <sales_order_shipment_save_before> 
       <observers> 
        <shipmentsave> 
         <type>singleton</type> 
         <class>shipmentsave/observer</class> 
         <method>salesOrderShipmentSaveBefore</method> 
        </shipmentsave> 
       </observers> 
      </sales_order_shipment_save_before> 
     </events> 
    </adminhtml> 
</config> 

Observer.php

<?php 

    class My_Shipmentsave_Model_Observer 
{ 
    public function salesOrderShipmentSaveBefore(Varien_Event_Observer $observer) 
    { 
     $shipment = $observer->getEvent()->getShipment(); 
     return; 
    } 
} 

ModuleB

<?xml version="1.0" encoding="UTF-8"?> 
<config> 
    <modules> 
    <My_Bshipment> 
     <version>0.1.0</version> 
    </My_Bshipment> 
    </modules> 
    <admin> 
    <routers> 
     <bshipment> 
    <use>admin</use> 
    <args> 
     <module>My_Bshipment</module> 
        <frontName>bshipment</frontName> 
    </args> 
     </bshipment> 
    </routers> 
    </admin> 
    <adminhtml> 
    <events> 
     <sales_order_shipment_save_before> 
     <observers> 
      <shipmentsave> 
      <type>singleton</type> 
      <class>bshipment/observer</class> 
      <method>salesOrderShipmentSaveBefore</method> 
      </shipmentsave> 
     </observers> 
     </sales_order_shipment_save_before> 
    </events> 
    </adminhtml> 
    <global> 
    <models> 
     <bshipment> 
    <class>My_Bshipment_Model</class> 
     </bshipment> 
    </models> 
    <resources>  
     <bshipment_setup> 
     <setup> 
      <module>My_Bshipment</module> 
     </setup> 
     <connection> 
      <use>core_setup</use> 
     </connection> 
     </bshipment_setup> 
     <bshipment_write> 
     <connection> 
      <use>core_write</use> 
     </connection> 
     </bshipment_write> 
     <bshipment_read> 
     <connection> 
      <use>core_read</use> 
     </connection> 
     </bshipment_read> 
    </resources> 
    <blocks> 
     <!-- adminhtml> 
     <rewrite> 
    <shipment_view>My_Bshipment_Block_Adminhtml_Shipment_View</shipment_view> 
     </rewrite> 
     </adminhtml--> 
     <adminhtml> 
    <rewrite> 
     <sales_order_shipment_view>My_Bshipment_Block_Adminhtml_Shipment_View</sales_order_shipment_view> 
    </rewrite> 
    <rewrite> 
     <sales_shipment_grid>My_Bshipment_Block_Adminhtml_Shipment_Grid</sales_shipment_grid> 
    </rewrite> 
     </adminhtml>   
     <!-- udropship> 
     <rewrite> 
    <adminhtml_shipment_view>My_Bshipment_Block_Adminhtml_Shipment_View</adminhtml_shipment_view> 
     </rewrite> 
     </udropship--> 
    </blocks> 
    <helpers> 
     <bshipment> 
      <class>My_Bshipment_Helper</class> 
     </bshipment> 
    </helpers> 

    </global> 
</config> 

Observer.php

<?php 
class My_Bshipment_Model_Observer 
{ 
    public function salesOrderShipmentSaveBefore(Varien_Event_Observer $observer) 
    { 
     $shipment = $observer->getEvent()->getShipment(); 
    return; 
    } 
} 

saluti, Saurabh

+1

Pubblica le tue due specifiche dell'osservatore (XML di configurazione), per favore. –

+0

Aggiunto xml e php – Saurabh

risposta

14

Non c'è tempo per testare questo, ma a prima vista mi piacerebbe provare a fare

<shipmentsave> 

distinti per ogni modulo. Qualcosa di simile

<observers> 
     <shipmentsave> 
     <type>singleton</type> 
     <class>bshipment/observer</class> 
     <method>salesOrderShipmentSaveBefore</method> 
     </shipmentsave> 
    </observers> 

e

<observers> 
     <bshipmentsave> 
     <type>singleton</type> 
     <class>bshipment/observer</class> 
     <method>salesOrderShipmentSaveBefore</method> 
     </bshipmentsave> 
    </observers> 
+0

Questo è esattamente il problema. Puoi avere solo un'istanza di un osservatore nominato per evento. Ogni osservatore richiederà il proprio nome. Il mio standard è usare il nome del modulo come nome dell'osservatore. Quindi e in questo caso. –

+0

@Alan Storm, due anni dopo la tua risposta, non è accettato, ma funziona? Sto affrontando lo stesso problema, 2 moduli diversi, ho bisogno di catturare lo stesso evento e il secondo modulo non funziona. Ma se disattivo il primo, il secondo funziona. – Yaroslav

+2

Questa risposta dovrebbe essere accettata. Poiché i nomi degli osservatori devono essere unici, funzionano 'shipmentsave' e' bshipmentsave'. Altrimenti, l'ultimo nodo XML letto semplicemente sovrascriverà gli osservatori precedenti con lo stesso nome. – musicliftsme

5

Ogni osservatore deve avere un nome univoco. Nel codice entrambi gli osservatori hanno lo stesso nome. Quindi dai un nome univoco ad ogni osservatore.

0

Penso che manchi un po 'di pensare, È possibile chiamare molte funzioni usando Observer per un evento. Ma per ogni nome di Event Observer Method dovrebbe essere Different e anche il suo Id.

<events> 
    <sales_order_shipment_save_before> 
     <observers> 
      <shipmentsave> 
       <type>singleton</type> 
       <class>shipmentsave/observer</class> 
       <method>salesOrderShipmentSaveBefore</method> 
      </shipmentsave> 
     </observers> 
    </sales_order_shipment_save_before> 
</events> 

<events> 
    <sales_order_shipment_save_before> 
     <observers> 
      <shipmentsave> 
      <type>singleton</type> 
      <class>bshipment/observer</class> 
      <method>salesOrderShipmentSaveBefore</method> 
      </shipmentsave> 
     </observers> 
    </sales_order_shipment_save_before> 
</events> 

Si può vedere sia nel shipmentsave xml id e il metodo salesOrderShipmentSaveBefore è lo stesso.

Basta cambiare questo e avete finito.

Problemi correlati