如何重写已经重写的类?


15

更新:我发现我实际上需要重写的类SMDesign_SMDZoom_Block_Product_View_Media不是SMDesign_ColorswatchProductView_Block_Product_View_Media我最初想的那样。但是,完全相同的问题仍然适用。

SMDesign SMDZoom扩展重写了块类'catalog / product_view_media'。的xml看起来像这样:

       <global>
    ...         
       <blocks>
        <smdzoom>
            <class>SMDesign_SMDZoom_Block</class>
        </smdzoom>
    </blocks>
    <blocks>
        <catalog>
            <rewrite>
                <product_view_media>SMDesign_SMDZoom_Block_Product_View_Media</product_view_media>
            </rewrite>
        </catalog>
    </blocks>
           ....
       </global>

我想再次重写该类。我想重写此smdzoom模块正在重写的catalog / product_view_media类。能做到吗?配置xml在我的模块中看起来是什么样的?

当前,这是我的模块初始化xml文件:

<config>
    <modules>
        <Goorin_SMDZoom>
            <active>true</active>
            <codePool>local</codePool>
        </Goorin_SMDZoom>
        <depends>
            <Mage_Catalog />
            <SMDesign_SMDZoom />
        </depends>
    </modules>
</config>

和模块config.xml文件:

<global>
        <blocks>
            <gbismdzoom>
                <class>Goorin_SMDZoom_Block</class>
            </gbismdzoom>
            <catalog>
                <rewrite>
                    <product_view_media>Goorin_SMDZoom_Block_Product_View_Media</product_view_media>
                </rewrite>
            </catalog>
        </blocks>
    </global>

我的新课程看起来像这样进行测试:

class Goorin_SMDZoom_Block_Product_View_Media extends SMDesign_SMDZoom_Block_Product_View_Media
{
    public function _construct() {
        parent::_construct();
    }
}

我正在通过显示模板路径提示进行测试,并且看到SMDesign块仍在产品视图页面上使用。我究竟做错了什么?

Answers:


13

我将<depends>节点放在模块的init xml文件中的错误位置。它必须嵌套在模块名称的节点内,如下所示:

<config>
    <modules>
        <Goorin_SMDZoom>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <Mage_Catalog />
                <SMDesign_SMDZoom />
            </depends>
        </Goorin_SMDZoom>
    </modules>
</config>

10

这部分在这里:

        <colorswatchproductview>
            <rewrite>
                <product_view_media>Goorin_ColorswatchProductView_Block_Product_View_Media</product_view_media>
            </rewrite>
        </colorswatchproductview>

仅在createBlock('colorswatchproductview/product_view_media)
不太可能通过原始实例化完成原始实例化的情况下才会为您提供帮助,因为第一个扩展正在使用重写,即它们希望显示在
createBlock('catalog/product_view_media')使用过的任何位置

一种选择是对同一块使用重写

  <catalog>
    <rewrite>
      <product_view_media>Goorin_ColorswatchProductView_Block_Product_View_Media</product_view_media>
    </rewrite>
  </catalog>

然后在您的块类中扩展另一个扩展块

class Goorin_ColorswatchProductView_Block_Product_View_Media extends SMDesign_ColorswatchProductView_Block_Product_View_Media

为此,您的扩展程序需要在第一个扩展程序之后加载。在这里的测试中,http://magebase.com/magento-tutorials/magento-extension-clashes-winners-and-loosers/我得出结论,加载顺序基于您的app / etc / modules / xml文件的字母顺序。或者,可以使用Depends节点(SMDesign_ColorswatchProductView)来影响此顺序。

您正在看到错误消息,因为您试图隔离渲染该块,但它需要一个产品,该产品将从其父块中加载:

abstract class Mage_Catalog_Block_Product_View_Abstract extends Mage_Catalog_Block_Product_Abstract
{
    /**
     * Retrive product
     *
     * @return Mage_Catalog_Model_Product
     */
    public function getProduct()
    {
        $product = parent::getProduct();
        if (is_null($product->getTypeInstance(true)->getStoreFilter($product))) {
            $product->getTypeInstance(true)->setStoreFilter(Mage::app()->getStore(), $product);
        }

        return $product;
    }

我放弃了您的指示,即使使用了depends节点,也无法重写该类。
Nick Rolando 2013年

尝试将模块初始化xml文件重命名为z.xml,然后刷新缓存。
Fristo的Kristof,2013年

抱歉,我有一段时间没有回过头了。我将初始化xml文件重命名为zzz.xml,并且重写成功了!所以我想我需要弄清楚为什么<depends>节点不工作..
尼克·罗兰

我+1感谢您的帮助,并引导我找到答案:)
Nick Rolando 2013年

3

这就是为什么重写核心类很烂的原因。

从这里射击,但是我认为您最好的选择是扩展swatch的颜色样本实现,Mage_Catalog_Blog_Product_View_Media然后使您的模块依赖于swatch模块。

艾伦·斯托姆(Alan Storm)在这里回答了类似的问题。

更好的办法是尝试通过观察者做任何您想做的事情。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.