我试图覆盖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类,但是您需要将升级版本中的任何更改合并到此类中 - 并且当您(不是)忘记执行此操作时,可能会导致系统问题.
祝好运!
| 归档时间: |
|
| 查看次数: |
8132 次 |
| 最近记录: |