【问题标题】:Override observer?覆盖观察者?
【发布时间】:2015-03-13 01:51:08
【问题描述】:

我目前有一个带有观察者的 Magento 模块,它监听以下事件:

  • sales_order_invoice_save_after
  • sales_order_place_after
  • sales_order_shipment_save_after
  • order_cancel_after

观察者调用模型中的一个方法,该方法将有关订单的重要细节打包,并以客户端选择的输出(JSON、CSV、XML)的形式将它们导出到远程系统。

不过,我有一个客户端需要在导出数据之前对其进行一些修改。

我想做的是用自定义本地模块扩展这个模块,而不是制作一个“特殊”版本来永久维护。我可以轻松地扩展模型以覆盖将处理此问题的方法,但我不确定如何确保它被调用。

如何覆盖观察者调用的类?

这甚至是解决我的问题的正确方法吗?例如,使用某种调度模型来查找配置设置来决定哪个类将处理该进程是否更合适?

【问题讨论】:

    标签: php magento observer-pattern magento-1.9.1


    【解决方案1】:

    尚不清楚您是要覆盖观察者模型本身,还是要覆盖观察者调用的模型。

    Mage_Core_Model_App::dispatchEvent() 中,Magento 使用Mage::getModel($obs['model']) 来抓取观察者模型。因此,只要您的配置通过组名引用观察者(即modulename/modelname 而不是Foo_Modulename_Model_Modelname),那么您就可以使用标准的 Magento 重写在单独的模块中更改观察者模型:

    <config>
      <global>
        <models>
          <!-- this is the group name of the module's models -->
          <modulename>
            <rewrite>
              <!-- rewrite the modulename/modelname model to use a different class -->
              <modelname>Bar_Modulename_Model_Modelname</modelname>
            </rewrite>
          </modulename>
        </models>
      </global>
    </config>
    

    如果您也想覆盖另一个模型,这也是同样的方法。例如,如果你的观察者调用Mage::getModel('mymodule/order_export'),那么你应该以同样的方式重写mymodule/order_export类。

    【讨论】:

      猜你喜欢
      • 2018-07-17
      • 1970-01-01
      • 2016-04-21
      • 2013-07-01
      • 1970-01-01
      • 2016-02-11
      • 1970-01-01
      • 2016-02-20
      • 2023-04-10
      相关资源
      最近更新 更多