【问题标题】:Why can i not rewrite parent class?为什么我不能重写父类?
【发布时间】:2010-04-08 04:46:26
【问题描述】:

我想重写 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,但我无法重写超类。为什么?是否可以?怎么样?

【问题讨论】:

    标签: php oop magento


    【解决方案1】:

    您可以重写父类,但这仅适用于对该类本身的调用。所以这个调用将检索正确覆盖的类:

    Mage::getBlock("adminhtml/widget_tabs");
    

    这是因为真正的类名是由 Magento 使用 XML / overrides 系统加载的。但是,如果您不覆盖子类,则此调用将无法按预期工作:

    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复制进去,可以根据需要进行修改。

    希望对您有所帮助。

    谢谢, 乔

    【讨论】:

    • 谢谢乔。这是有道理的。您提出的解决方案也很有效。
    • 很好的解释。谢谢!
    【解决方案2】:

    你是对的,你不能,这与创建覆盖功能的方式有关。 PHP(不像说,ruby)没有为您提供覆盖类的本地方法。 Magento 通过(对于可覆盖的类)从不使用 new 关键字来解决这个问题

    new ClassName
    

    创建一个类

    他们使用静态工厂化方法

    $object = Mage::getModel('/adminhtml/sales_order_view_tabs');
    

    get model 所做的是查看字符串/adminhtml/sales_order_view_tabs,然后引用配置文件以查看它应该实例化哪个类

    因为父类永远不会被实例化,所以它们永远不会被覆盖。

    【讨论】:

    • 现在我知道发生了什么...向您学习的另一个好方法。谢谢艾伦! p.s.我正在寻找你博客中的下一篇新文章:)
    猜你喜欢
    • 2012-03-15
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    • 2013-08-06
    • 1970-01-01
    • 2015-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多