覆盖Magento中的摘要

时间:2013-04-11 21:45:54

标签: php magento

我试图覆盖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

2 个答案:

答案 0 :(得分:18)

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

术语

从问题的外观来看,你不是试图“覆盖”一个类,而是试图重写这个类。类重写是将配置节点添加到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类,但是您需要将升级版本中的任何更改合并到此类中 - 并且当您忘记执行此操作时,可能会导致系统问题。

祝你好运!

答案 1 :(得分: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 !!";
    }
}

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