我试图覆盖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
答案 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设置为从本地模块运行抽象方法。以类似的方式,也可以覆盖抽象模型方法。