2010-04-08 9 views
2

core/adminhtml/block/sales/order/view/tabs.php 클래스의 수퍼 클래스 인 core/adminthtml/block/widget/tabs.php 클래스를 다시 작성하고 싶습니다. 내가 ...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> 

, 내가 슈퍼 클래스를 다시 작성할 수 없습니다입니다 :

는 다음 두 시나리오에 대한 설정 코드입니다. 왜? 가능한가? 방법?

답변

3

부모 클래스를 다시 작성할 수는 있지만 해당 클래스 자체의 호출에만 적용됩니다. 따라서이 호출은 올바르게 재정의 된 클래스를 검색합니다.

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

실제 클래스 이름은 XML/재정의 시스템을 사용하여 Magento에로드되기 때문입니다. 당신이 하위 클래스를 오버라이드 (override)하지 않는 경우,이 호출은 예상대로 작동하지 않습니다

부모 클래스가 젠토의 시스템을 사용하여 지정하지만, 일반 PHP 사용되지 않기 때문이다
Mage::getBlock("admihtml/sales_order_view_tabs"); 

:

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

+0

위대한 설명. 감사! –

2

당신은, 당신은 할 수 없습니다 맞아, 그리고 그것을 오버라이드 기능이 생성 된 방식과 관련이 있습니다. PHP는 (루비와 달리) 클래스를 오버라이드 (override) 할 원래의 방법을 제공하지 않는다. 마 젠토는

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

모델 모양입니다 무엇을 얻을 결코

가 대신 그들은 정적 factoryish 방법을 사용하는 클래스를 만들 수 new 키워드

new ClassName 

를 사용하지 않는 (재정의 클래스)에 의해이 문제를 작동 문자열이 /adminhtml/sales_order_view_tabs 인 경우 구성 파일을 으로 참조하여을 인스턴스화해야하는 클래스를 확인하십시오.

상위 클래스는 인스턴스화되지 않으므로 절대 재정의 될 수 없습니다.

+0

이제 나는 어떤 일이 벌어지고 있는지 보았습니다 ... 당신에게서 좋은 또 다른 것을 배우십시오. 앨런 고마워! p.s. 귀하의 블로그에서 다음 새 기사를 찾고 있습니다 :) – latvian

관련 문제