无法覆盖magento核心配置模型

问题描述 投票:0回答:2

无法覆盖magento核心配置模型Mage_Core_Model_Config。我有magento 1.9.2.1。 这是config.xml

<global>
    <helpers>
        <peexl_customflatrate>
            <class>Peexl_CustomFlatrate_Helper</class>
        </peexl_customflatrate>
            </helpers>
    <models>
        <peexl_customflatrate>
            <class>Peexl_CustomFlatrate_Model</class>
        </peexl_customflatrate> 
                    <core>
                        <rewrite>
                             <config>Peexl_CustomFlatrate_Core_Config</config>
                        </rewrite> 
                    </core>    

还有类 Peexl/CustomFlatrate/Model/Core/Config.php

class Peexl_CustomFlatrate_Model_Core_Config extends Mage_Core_Model_Config
{

}

什么也没发生:(

php magento url-rewriting overriding
2个回答
11
投票

没错,你不能。

Magento 的类重写系统之所以有效,是因为几乎所有 Magento 对象都是通过

Mage::getModel
静态类实例化的。但是,如果直接通过
new
方法创建对象

$foo = new Some_Class_File_Here;

Magento 的类重写将无法替换实例化的类。 Magento 需要在没有重写系统的情况下实例化一些对象。 Magento 需要在没有重写系统的情况下实例化这些类,因为它们是实现重写系统的实际类。

这些课程包括

self::$_objects = new Varien_Object_Cache;        
self::$_app     = new Mage_Core_Model_App();    
self::$_events  = new Varien_Event_Collection();    
self::$_config  = new Mage_Core_Model_Config($options);

其中包括

Mage_Core_Model_Config
类。如果您想修改此类的行为,您有两种选择。

首先,您可以创建本地代码池覆盖

app/code/local/Mage/Core/Model/Config.php

包含来自

app/code/copy/Mage/Core/Model/Config.php
的课程的精确副本,以及您的更改。这样做的缺点是,每当升级 Magento 时,您都需要手动更新此类,如果不小心,可能会破坏核心代码所依赖的功能。

其次,Magento 1 的现代版本包含替代配置类的选项。看看Magento在哪里实例化配置选项

#File: app/Mage.php
protected static function _setConfigModel($options = array())
{
    if (isset($options['config_model']) && class_exists($options['config_model'])) {
        $alternativeConfigModelName = $options['config_model'];
        unset($options['config_model']);
        $alternativeConfigModel = new $alternativeConfigModelName($options);
    } else {
        $alternativeConfigModel = null;
    }

    if (!is_null($alternativeConfigModel) && ($alternativeConfigModel instanceof Mage_Core_Model_Config)) {
        self::$_config = $alternativeConfigModel;
    } else {
        self::$_config = new Mage_Core_Model_Config($options);
    }
}    

您可以看到 Magento 在

$options
数组的
config_model
键中查找类名。您可以通过
index.php
引导文件

进行设置
#File: index.php
Mage::run($mageRunCode, $mageRunType, array('config_model'=>'Package_Module_Model_Config'));

这比本地代码池覆盖稍好一些,因为

Package_Module_Model_Config
可以扩展基本配置类,并且您可以只更改您需要的内容。但是,它确实依赖于您维护自己的
index.php
引导文件,这使得它不适合重新分发。

希望有帮助!


0
投票

首先,您的重写将不起作用,因为它的设置方式错误。 config.xml 中的重写类名与文件中的类名不匹配,缺少“Model”一词。 应该是:

                <rewrite>
                     <config>Peexl_CustomFlatrate_Model_Core_Config</config>
                </rewrite> 
© www.soinside.com 2019 - 2024. All rights reserved.