如何扩展Magento核心模块块(修复Magento Bug而不编辑Core)

时间:2012-07-04 13:14:14

标签: magento grid widget block adminhtml

到目前为止我所拥有的:

等/模块/ BugFix_MageAdminhtmlBlockWidgetGrid.xml

<?xml version="1.0"?>
<config>
    <modules>
        <BugFix_MageAdminhtmlBlockWidgetGrid>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <Mage_Adminhtml />
            </depends>
        </BugFix_MageAdminhtmlBlockWidgetGrid>
    </modules>
</config>

应用程序/本地/错误修正/ MageAdminhtmlBlockWidgetGrid的/ etc / config.xml中

<?xml version="1.0"?>
<config>
    <modules>
        <BugFix_MageAdminhtmlBlockWidgetGrid>
            <version>1.0.0</version>
        </BugFix_MageAdminhtmlBlockWidgetGrid>
    </modules>
    <global>
        <blocks>
            <mageadminhtmlblockwidgetgrid>
                <class>BugFix_MageAdminhtmlBlockWidgetGrid_Block</class>
            </mageadminhtmlblockwidgetgrid>
            <adminhtml>
                <rewrite>
                    <widget_grid>BugFix_MageAdminhtmlBlockWidgetGrid_Block_Widget_Grid</widget_grid>
                </rewrite>
            </adminhtml>
        </blocks>
    </global>
</config>

应用程序/本地/错误修正/ MageAdminhtmlBlockWidgetGrid /砌块/空间/ Grid.php

<?php

class BugFix_MageAdminhtmlBlockWidgetGrid_Block_Widget_Grid extends Mage_Adminhtml_Block_Widget_Grid
{
    public function getRowUrl($item)
    {
        $res = parent::getRowUrl($item);
        return ($res ? $res : '#');
    }
}

不知何故上面的代码不起作用。它必须是简单的......

作为模块的错误修复适用于Magento 1.4(由Magento在1.7中修复)。

1 个答案:

答案 0 :(得分:0)

子类化时重写不起作用。在这种情况下,网格类是adminhtml网格小部件的子类(extends),这意味着用于该类的名称是原始名称,而不是配置中重写的名称。

POC:

<?php
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors',1);

include 'app/Mage.php';
Mage::setIsDeveloperMode(true);
Mage::app();

$block = Mage::app()->getLayout()->createBlock('adminhtml/widget_grid');
echo get_class($block);
//or echo Mage::getConfig()->getBlockClassName('adminhtml/widget_grid');

$block = new Mage_Adminhtml_Block_Widget_Grid;
echo get_class($block);

在这种情况下,您需要将路径和文件从核心代码池复制到本地代码池并更改其中的定义。由于包含路径优先级,因此将使用本地代码池中的定义。但是,您必须在升级中考虑到这一点。