覆盖观察者?

时间:2015-01-14 18:55:21

标签: php magento observer-pattern magento-1.9.1

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

  • sales_order_invoice_save_after
  • sales_order_place_after
  • sales_order_shipment_save_after
  • order_cancel_after

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

我有一个客户端在导出之前需要对数据进行一些变异。

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

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

这对我的问题是否正确?例如,是否更适合使用某种调度模型来查找配置设置以确定哪个类将处理该过程?

1 个答案:

答案 0 :(得分:0)

如果你想要覆盖观察者模型本身,或者你想要覆盖观察者调用的模型,那么目前还不完全清楚。

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