2010-04-08 69 views
2

我想重寫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,我不能夠重寫超類。爲什麼?可能嗎?怎麼樣?

回答

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,並根據需要進行修改。

希望有所幫助。

謝謝, 喬

+0

謝謝喬。這是有道理的。您提出的解決方案也可以運行良好 – latvian 2010-04-10 01:44:30

+0

很好的解釋。謝謝! – 2015-12-23 19:19:37

2

你說的沒錯,你不能和它與覆蓋功能創建的方式做。 PHP(不像說,紅寶石)提供你沒有原生的方式來覆蓋類。 Magento的工作原理是(用於重寫類)從未使用new關鍵字

new ClassName 

創建一個類

相反,他們使用一個靜態factoryish方法解決此

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

什麼讓模型確實是看在字符串/adminhtml/sales_order_view_tabs處,然後引用配置文件到查看它應該實例化哪個類

因爲父類永遠不會被實例化,所以它們永遠不會被覆蓋。

+0

現在我明白髮生了什麼......另一個好的學習來自你。謝謝艾倫! p.s.我正在尋找您的博客中的下一篇新文章:) – latvian 2010-04-10 01:54:07

相關問題