Magento - 2 или более наблюдателя на одном и том же событии - PullRequest
9 голосов
/ 16 августа 2010

2 моего наблюдателя наблюдают за тем же sales_order_shipment_save_before событием.ModuleA был тем, кого я создал первым, а затем создал ModuleB

Теперь вызывается только наблюдатель ModuleB, а не ModuleA.

Пожалуйста, дайте мне знать, как можноя разрешаю это, и оба наблюдателя вызваны.

Модуль A

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

С уважением, Saurabh

Ответы [ 3 ]

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

Нет времени проверять это, но на первый взгляд я бы попробовал сделать

<shipmentsave>

отличается для каждого модуля. Что-то вроде

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

и

    <observers>
      <bshipmentsave>
        <type>singleton</type>
        <class>bshipment/observer</class>
        <method>salesOrderShipmentSaveBefore</method>
      </bshipmentsave>
    </observers>
5 голосов
/ 27 ноября 2012

Каждый наблюдатель должен иметь уникальное имя. В коде оба наблюдателя имеют одинаковые имена. Поэтому дайте уникальное имя каждому наблюдателю.

0 голосов
/ 28 октября 2014

Я думаю, что вы что-то упустили. Вы можете вызывать как можно больше функций, используя наблюдателей для события. Но для каждого события имя метода наблюдателя должно отличаться, а также его идентификатор.

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

Вы можете видеть в XML, что id shipmentsave и метод salesOrderShipmentSaveBefore одинаковы.

Просто измените это, и все готово.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...