6

我正在尝试覆盖 Magento 中的摘要,但它不喜欢下面我的 config.xml 中的信息,您将看到我试图覆盖的摘要的文件夹结构以及特定于该文件的 config.xml 部分。

原目录:

app/code/core/Mage/Rule/Model/Abstract.php

我的目录:

app/code/local/EGeeked/Coupons/Rule/Model/Abstract.php

我的 config.xml:

<models>
    <EGeeked_Coupons>
        <class>EGeeked_Coupons_Rule_Model_Abstract</class>
    </EGeeked_Coupons>
    <rule>
        <rewrite>
            <model_abstract>EGeeked_Coupons_Rule_Model_Abstract</model_abstract>
        </rewrite>
     </rule>
</models>

我在 Abstract.php 中的扩展

abstract class EGeeked_Coupons_Rule_Model_Abstract extends Mage_Core_Model_Abstract
4

2 回答 2

22

首先是术语课。接下来,解释为什么你不能这样做。第三,一种替代解决方案虽然并不理想,但可能会让您到达您需要去的地方。

术语

从您的问题的外观来看,您不是在尝试“覆盖”一个类,而是在尝试重写该类。类重写是您将配置节点添加到 Magento 以便告诉它的地方

实例化这个类而不是那个类

“覆盖”是将一个类从 Magento 核心复制到本地代码池中。换句话说,复制

app/code/core/Mage/Rule/Model/Abstract.php

app/code/local/Mage/Rule/Model/Abstract.php

覆盖是你告诉 Magento“使用这个类文件而不是其他类文件”的地方。类似,但不同于重写。重写被认为是更好的做法,因为它们破坏性较小,并且不太可能导致升级和扩展兼容性问题。

你不能那样做

你不能重写抽象类。重写系统之所以有效,是因为 Magento 使用工厂模式来实例化模型、块和助手

$class = Mage::getModel('catalog/product');

重写所做的是,在伪代码中

function getModel($model)
{
    if("can I find a rewrite configuration for $model")
    {
        //instantiate the model with the rewrite
    }
    else
    {
        //instantiate the normal model
    }
}

由于抽象类永远不会被实例化,它永远不能被重写。

解决方案

据我所知,在标准 Magento 安装中,只有三个类继承自这个抽象类。

catalogrule/rule
Mage_CatalogRule_Model_Rule

rule/rule
Rule/Model/Rule.php

salesrule/rule
SalesRule/Model/Rule.php

您可以单独为这些类中的每一个添加重写,理想情况下将您的新逻辑放在共享帮助器类中。您需要以类似的方式处理扩展或自定义代码,但这是一种可能的前进道路。

另一种选择是使用传统的类覆盖和复制

app/code/core/Mage/Rule/Model/Abstract.php

app/code/local/Mage/Rule/Model/Abstract.php

这将允许您修改单个Abstract类,但您需要将升级版本中的任何更改合并到该类中 - 当您忘记这样做时(不是如果),您可能会导致系统问题。

祝你好运!

于 2013-04-11T23:07:06.410 回答
1

确实,不能覆盖 Mage 的抽象类,但可以使用本地均值的自定义扩展来覆盖其特定方法,而不是将整体Abstract.php放在本地的同一位置。可以使用自己的模块从本地覆盖它。

例如,如果我需要修改 Mage 中的重新排序操作,其内容如下:

app\code\core\Mage\Sales\Controller\Abstract.php

然后我可以从我的模块中覆盖它的控制器,如下所示在我的config.xml

<config>
  <modules>
    <Custom_Sales>
      <version>1.0.0</version>
    </Custom_Sales>
  </modules>
  <frontend>
    <routers>
      <sales>
        <args>
          <modules>
            <custom_sales before="Mage_Sales">Custom_Sales</custom_sales>
          </modules>
        </args>
      </sales>
    </routers>
  </frontend>
</config>

之后将控制器添加到模块:

app\code\local\Custom\Sales\controllers\OrderController.php

通过以下方式:

require_once(Mage::getModuleDir('controllers','Mage_Sales').DS.'OrderController.php');

class Custom_Sales_OrderController extends Mage_Sales_OrderController
{
    public function reorderAction()
    {
        "Add required changes !!";
    }
}

全部设置为从本地模块运行抽象方法。以类似的方式,也可以覆盖抽象模型方法。

于 2014-09-27T06:19:12.167 回答