Magento 1.8:如何扩展已被其他模块重写的发票Grid类?
解决Magento 1.8多模块重写发票Grid类的冲突问题
我之前也碰到过一模一样的问题,Magento的类重写机制就是这样:当多个模块都瞄准同一个核心类进行扩展时,直接继承原Mage类就会报错——因为原类已经被第一个重写它的模块给替换掉了。咱们不用禁用那个模块,只要调整自己模块的继承关系和加载顺序就行,下面是亲测有效的解决步骤:
步骤1:找到当前实际生效的发票Grid类
你得先搞清楚系统里现在真正在用的发票Grid类到底是哪个,而不是原Mage的类。有两种简单的排查方法:
- 临时代码排查:找个能运行的地方(比如某个后台控制器或者测试模板)加一行代码:
刷新页面后就能看到实际类名,比如可能是echo get_class(Mage::getBlockSingleton('adminhtml/sales_invoice_grid'));Another_Module_Block_Adminhtml_Sales_Invoice_Grid。 - 查配置文件:去其他模块的
config.xml里找类似这样的配置段:
这里的<global> <blocks> <adminhtml> <rewrite> <sales_invoice_grid>Another_Module_Block_Adminhtml_Sales_Invoice_Grid</sales_invoice_grid> </rewrite> </adminhtml> </blocks> </global>Another_Module_Block_Adminhtml_Sales_Invoice_Grid就是当前重写后的目标类。
步骤2:修改自己模块的Grid类继承关系
打开你模块里的Grid.php文件,把原来的继承语句:
class Your_Module_Block_Adminhtml_Sales_Invoice_Grid extends Mage_Adminhtml_Block_Sales_Invoice_Grid
改成继承刚才找到的那个实际生效的类:
class Your_Module_Block_Adminhtml_Sales_Invoice_Grid extends Another_Module_Block_Adminhtml_Sales_Invoice_Grid
步骤3:确保自己的模块在另一个模块之后加载
为了让Magento先加载那个已经重写了Grid的模块,再加载你的模块,需要在自己模块的etc/modules/Your_Module.xml文件里添加依赖配置:
<?xml version="1.0"?> <config> <modules> <Your_Module> <active>true</active> <codePool>local</codePool> <!-- 添加这行,依赖那个先重写Grid的模块 --> <depends> <Another_Module /> </depends> </Your_Module> </modules> </config>
这样Magento就会严格按照依赖顺序加载模块,确保你的类继承的是已经存在的重写类。
步骤4:保持自己模块的重写配置不变
最后在自己模块的config.xml里,继续保留原来的重写配置,把adminhtml/sales_invoice_grid替换为你的类:
<global> <blocks> <adminhtml> <rewrite> <sales_invoice_grid>Your_Module_Block_Adminhtml_Sales_Invoice_Grid</sales_invoice_grid> </rewrite> </adminhtml> </blocks> </global>
这样整个重写链就变成了:你的类 → 另一个模块的类 → 原Mage类,两个模块的功能都能正常生效,不会再出现类找不到的报错。
内容的提问来源于stack exchange,提问作者lucasvm1980
相关产品推荐
相关产品推荐

