我想重写core / adminthtml / block / widget / tabs.php类,这是core / adminhtml / block / sales / order / view / tabs.php类的超类。
以下是两种情况的配置代码:
<blocks>
<adminhtml>
<rewrite>
<sales_order_view_tabs>Jimmy_SalesAffil_Block_Widget_Tabs</sales_order_view_tabs>
<widget_tabs>Jimmy_SalesAffil_Block_Widget_Tabs</widget_tabs>
.....
</rewrite>
</adminhtml>
</blocks>
虽然我能够重写...view/tabs.php
,但我无法重写超类。为什么?可能吗?怎么样?
答案 0 :(得分:3)
您可以重写父类,但这只适用于该类本身的调用。所以这个调用将检索正确覆盖的类:
Mage::getBlock("adminhtml/widget_tabs");
这是因为真正的类名是由Magento使用XML /覆盖系统加载的。但是,如果您不覆盖子类,则此调用将无法正常工作:
Mage::getBlock("admihtml/sales_order_view_tabs");
那是因为没有使用Magento系统指定父类,而是使用常规PHP:
class Mage_Adminhtml_Block_Sales_Order_View_Tabs extends Mage_Adminhtml_Block_Widget_Tabs
如果要覆盖父类,基于XML的覆盖系统无法帮助您。但是,您可以将Widget_Tabs
类复制到本地空间,Magento会将其加载到那里。制作目录路径app/code/local/Mage/Adminhtml/Block/Widget/
并将Tabs.php
复制到其中,然后您可以根据需要进行修改。
希望有所帮助。
谢谢, 乔
答案 1 :(得分:2)
你是对的,你做不到,而且它与创建覆盖功能的方式有关。 PHP(不像说,ruby)为您提供了覆盖类的本机方式。 Magento通过(对于可覆盖的类)从不使用new
关键字
new ClassName
创建一个类
相反,他们使用静态工厂方法
$object = Mage::getModel('/adminhtml/sales_order_view_tabs');
get model的作用是查看字符串/adminhtml/sales_order_view_tabs
,然后将配置文件引用到查看它应该实例化的类。
由于父类从未实例化,因此永远不能覆盖它们。