【问题标题】:How to extend a Magento Core Module Block (to fix a Magento Bug without editing the Core)如何扩展 Magento 核心模块块(在不编辑核心的情况下修复 Magento 错误)
【发布时间】:2012-07-04 13:14:13
【问题描述】:

到目前为止我所拥有的:

etc/modules/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>

app/local/BugFix/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>

app/local/BugFix/MageAdminhtmlBlockWidgetGrid/Block/Widget/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 中修复)。

【问题讨论】:

    标签: magento grid widget block adminhtml


    【解决方案1】:

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

    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);
    

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

    【讨论】:

    • 谢谢。希望 Magento 2.0 实现 PHP 5.3+ 命名空间(和 Zend 2.0)。在此之前,复制到本地,更改即可。
    • 不幸的是,集成命名空间将是一个巨大的架构转变。这是当前状态:github.com/magento/magento2/tree/master/app
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-08
    • 1970-01-01
    • 2014-11-24
    • 1970-01-01
    相关资源
    最近更新 更多