当前位置: 首页>>WEB开发>>正文


如何重写已被重写的类?

webfans WEB开发 , , , 去评论

问题描述

更新:我发现我实际上需要重写的类是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模块正在重写的目录/product_view_media类。这可以做到吗?配置xml在我的模块中看起来像做什么?

目前这是我的模块init 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块仍然在产品视图页面上使用。我究竟做错了什么?

最佳解决思路

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

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

次佳解决思路

这部分内容:

        <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/期间,我发现加载顺序是基于您的应用/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;
    }

第三种解决思路

这就是为什么re-writing核心类很糟糕。

在这里拍摄髋关节,但我认为你最好的选择是扩展Mage_Catalog_Blog_Product_View_Media的颜色样本实现,然后让你的模块取决于颜色样本模块。

Alan Storm回答了类似的问题here

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

参考资料

本文由朵颐IT整理自网络, 文章地址: https://duoyit.com/article/1546.html,转载请务必附带本地址声明。