Magento购物车规则类覆盖模块

时间:2012-04-19 17:17:59

标签: xml magento override magento-1.6

我的magento安装有免费送货购物车规则,以及优惠券规则。输入优惠券后,免运费便会消失。这是不可取的,但使用Magento的已知条件:Magento Free shipping and Coupon discount 注意:如果有人知道如何在不覆盖的情况下纠正该问题,那将是更可取的。

我已经为此工作了大约3个小时。我搜索了SO,Google和其他人,但找不到解决方案。

问题:
我正在尝试编写一个模块,根据这篇文章纠正行为:
Magento Issue with Cart Price

我试图覆盖的课程是Mage_SalesRule_Model_Resource_Rule_Collection
使用Alan Storm's free tool,我发现uri是salesrule/resource_rule_collection
做一些人工调查,班级就在这里:
应用程序/代码/核心/法师/ SalesRule /型号/资源/规则/ Collection.php
这里还有一个类,它从上面的文件中扩展了类:
应用程序/代码/核心/法师/ SalesRule /型号/ Mysql4 /规则/ Collection.php
(我应该重写哪一个?)

对于我的生活,我找不到合适的config.xml语法来覆盖所需的类。

我的配置目前如此:

<config>
    <modules>
        <My_Couponrule>
            <version>1.0.0</version>
        </My_Couponrule>
    </modules>
    <global>
        <models>
            <salesrule>
                <rewrite>
                    <resource_rule_collection>My_Couponrule_Model_Resource_Rule_Collection</resource_rule_collection>
                </rewrite>
            </salesrule>
        </models>
    </global>

但是,我仔细尝试了我能推断出的每一种组合都可能是合适的,而且没有一种方法有效:

<salesrule_resource_rule><rewrite><collection>
<salesrule_resource><rewrite><rule_collection>
<salesrule_resource><rewrite><collection>  
<salesrule><rewrite><resource_collection>
<salesrule><rewrite><resource_rule_collection>
<salesrule><rewrite><rule_collection>
<salesrule_mysql4><rewrite><rule_collection>
<salesrule_mysql4_rule><rewrite><collection>

注意:
1.我知道正在加载配置文件,我已经检查了System-&gt; Configuration-&gt; Advanced
2.我进一步知道正在加载配置文件,因为我已经将已加载的类输出到浏览器,并且我已经尝试覆盖OTHER类并看到它成功输出正确的类了 3.我知道我所做的每一项更改都是通过我添加(并且每次修改)的另一次重写来加载,以验证更改是否已正确上传。
是的,我非常小心确保用正确匹配的关闭标签关闭标签 4.禁用缓存,因此未加载文件不是问题

请帮忙。我没有多少头发......

1 个答案:

答案 0 :(得分:11)

使用Magento 1.6.1进行测试,应该适用于所有版本(尽管资源模型的命名约定在最近的版本中已经更改,因此请采取相应措施)。

首先,有两节课可以帮助您理解配置。

第1课

Magento有模特。模型有资源模型。资源模型执行加载模型对象的数据库/数据存储区查询。

模型集合是第三种类型的东西。但是,因为模型集合查询数据库,所以决定模型集合也是模型资源。这就是你使用

的原因
Mage::getResourceModel('salesrule/resource_rule_collection');

实例化一个集合。当你使用

Mage::getModel('catalog/product')->getCollection();

Magento实际上是在打电话

Mage::getResourceModel('catalog/product_collection');
在幕后。

第2课

您只能重写模型,帮助程序和块。您无法直接重写资源模型。幸运的是,我们并非运气不好。在另一个令人困惑的抽象中,Magento的资源模型本身就是实际模型。当你打电话

Mage::getResourceModel('salesrule/resource_rule_collection');

Magento最终致电

Mage::getModel('salesrule_resource/resource_rule_collection')

实例化资源模型类。如果您没有看到它,资源模型组salesrule将转换为模型组salesrule_resource。通过在salesrule_resource模型节点下查找<resourceModel>节点,可以得出值<salesrule>

<salesrule>
    <class>Mage_SalesRule_Model</class>
    <resourceModel>salesrule_resource</resourceModel>
</salesrule>

那么,这意味着您需要重写模型salesrule_resource/resource_rule_collection。以下XML应该可以使用您的类名替换Packagename_Modulename_Model_Your_Class_Here

<config>
    <global>
        <models>
            <salesrule_resource>
                <rewrite>     
                    <rule_collection>Packagename_Modulename_Model_Your_Class_Here</rule_collection>
                </rewrite>
            </salesrule_resource>
        </models> 
    </global>
</config>