覆盖Magento中的摘要

Jor*_*dan 6 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>
Run Code Online (Sandbox Code Playgroud)

我在Abstract.php中扩展

abstract class EGeeked_Coupons_Rule_Model_Abstract extends Mage_Core_Model_Abstract
Run Code Online (Sandbox Code Playgroud)

Ala*_*orm 21

首先,术语课.接下来,解释为什么你不能这样做.第三,替代解决方案并不理想,但可能会让您到达目的地.

术语

从问题的外观来看,你并不是试图"覆盖"一个类,而是试图重写这个类.类重写是向Magento添加配置节点以便告知它的地方

实例化此类而不是该类

"覆盖"是将类从Magento核心复制到本地代码池的位置.换句话说,复制

app/code/core/Mage/Rule/Model/Abstract.php
Run Code Online (Sandbox Code Playgroud)

app/code/local/Mage/Rule/Model/Abstract.php
Run Code Online (Sandbox Code Playgroud)

您可以通过覆盖告诉Magento"使用此类文件而不是其他类文件".类似,但不同于重写.重写被认为是更好的做法,因为它们的破坏性较小,并且不太可能导致升级和扩展兼容性问题.

你不能这样做

您无法重写抽象类.重写系统有效,因为Magento使用工厂模式来实例化模型,块和帮助器

$class = Mage::getModel('catalog/product');
Run Code Online (Sandbox Code Playgroud)

重写的作用是伪代码

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

由于抽象类从未实例化,因此永远不能重写.

解决方案

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

catalogrule/rule
Mage_CatalogRule_Model_Rule

rule/rule
Rule/Model/Rule.php

salesrule/rule
SalesRule/Model/Rule.php
Run Code Online (Sandbox Code Playgroud)

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

另一种方法是使用传统的类覆盖和复制

app/code/core/Mage/Rule/Model/Abstract.php
Run Code Online (Sandbox Code Playgroud)

app/code/local/Mage/Rule/Model/Abstract.php
Run Code Online (Sandbox Code Playgroud)

这将允许您修改单个Abstract类,但是您需要将升级版本中的任何更改合并到此类中 - 并且当您(不是)忘记执行此操作时,可能会导致系统问题.

祝好运!