覆盖观察者?

Override observer?

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

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

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

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

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

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

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

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