【问题标题】:Magento Shopping Cart Rule Class Override ModuleMagento 购物车规则类覆盖模块
【发布时间】:2012-04-19 17:17:59
【问题描述】:

我的 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
并进行一些手动调查,该类位于此处:
app/code/core/Mage/SalesRule/Model/Resource/Rule/Collection.php
这里还有一个类扩展了上述文件中的类:
app/code/core/Mage/SalesRule/Model/Mysql4/Rule/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. 我知道配置文件正在加载,我已经检查了系统->配置->高级
2. 我进一步知道正在加载配置文件,因为我已经将加载的类输出到浏览器,并且我尝试覆盖其他类并看到它成功输出了正确的类
3. 我知道我所做的每个更改都是通过我添加(并每次修改)的另一个重写加载的,只是为了验证更改是否正确上传。
3. 是的,我非常小心地确保使用正确匹配的结束标签关闭标签
4.缓存被禁用,所以文件没有被加载不是问题

请帮忙。我的头发不多了……

【问题讨论】:

    标签: xml magento overriding magento-1.6


    【解决方案1】:

    使用 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_resourcesalesrule_resource 的值是通过在 &lt;salesrule&gt; 模型节点下查找 &lt;resourceModel&gt; 节点得出的。

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

    所以,这意味着你需要重写 modelsalesrule_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>
    

    【讨论】:

      猜你喜欢
      • 2014-10-18
      • 1970-01-01
      • 2013-02-18
      • 2015-01-08
      • 1970-01-01
      • 1970-01-01
      • 2013-12-02
      • 1970-01-01
      相关资源
      最近更新 更多