覆盖观察者?
Override observer?
我目前有一个带有观察器的 Magento 模块,用于监听以下事件:
- sales_order_invoice_save_after
- sales_order_place_after
- sales_order_shipment_save_after
- order_cancel_after
观察者在模型中调用一个方法,该方法将有关订单的重要细节打包并以客户端选择的输出方式 (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。
我目前有一个带有观察器的 Magento 模块,用于监听以下事件:
- sales_order_invoice_save_after
- sales_order_place_after
- sales_order_shipment_save_after
- order_cancel_after
观察者在模型中调用一个方法,该方法将有关订单的重要细节打包并以客户端选择的输出方式 (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。