0

私の magento インストールには、送料無料のショッピング カート ルールとクーポン ルールがあります。クーポンを入力すると、送料無料はなくなります。これは望ましくありませんが、Magento の既知の状態: Magento 送料無料とクーポン割引 注: オーバーライドせずにその問題を修正する方法を誰かが知っている場合は、それが望ましいでしょう。

私はこれに約3時間取り組んできました。SO、Google などを検索しましたが、解決策が見つかりません。

質問:
この投稿に基づいて動作を修正するモジュールを作成しようとしています:
Magento Issue with Cart Price

私がオーバーライドしようとしているクラスは、 Alan Storm の無料ツールMage_SalesRule_Model_Resource_Rule_Collection
を使用して、URI が であることがわかりました。手動 で調査を行ったところ、クラスはapp/code/core/Mage/SalesRule/Model/Resource/にあります。 Rule/Collection.php 上記のファイルからクラスを拡張するクラスもここにあります: app/code/core/Mage/SalesRule/Model/Mysql4/Rule/Collection.php (これらのうちどれをオーバーライドする必要がありますか?)salesrule/resource_rule_collection




私の人生では、目的のクラスをオーバーライドするための適切な 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. 構成 ファイルがロードされていることはわかっています。 [システム]
-> [構成] -> [詳細設定] でチェックインしました。
OTHER クラスのオーバーライドを試みたところ、正しいクラスが正常に出力される
ことがわかりました。
3.はい、タグが適切に一致する終了タグで閉じられていることを確認することに細心の注意を払いました
4.キャッシュが無効になっているため、ファイルが読み込まれていないことは問題ではありません

助けてください。毛がほとんど残っていない…

4

1 に答える 1

11

Magento 1.6.1 でテストされ、すべてのバージョンに適用されます (ただし、最近のバージョンではリソース モデルの命名規則が変更されているため、それに応じて行動してください)。

まず、構成を理解するのに役立つ 2 つのレッスンです。

レッスン1

Magento にはモデルがあります。モデルにはリソース モデルがあります。リソース モデルは、モデル オブジェクトをロードするデータベース/データストア クエリを実行します。

モデル コレクションは、3 番目のタイプのものです。ただし、モデル コレクションはデータベースに対してクエリを実行するため、モデル コレクションもモデル リソースになることが決定されました。それがあなたが使う理由です

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

コレクションをインスタンス化します。使用するとき

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

Magento が実際に呼び出している

Mage::getResourceModel('catalog/product_collection');

舞台裏。

レッスン 2

モデル、ヘルパー、およびブロックのみを書き換えることができます。リソース モデルを直接書き換えることはできません。幸いなことに、私たちは運が悪いわけではありません。もう 1 つの紛らわしい抽象化では、Magento のリソース モデルは実際にはモデルそのものです。電話すると

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

Magento は最終的に呼び出します

Mage::getModel('salesrule_resource/resource_rule_collection')

リソース モデル クラスをインスタンス化します。表示されていない場合は、リソース モデル グループsalesruleが モデル グループ に変換されsalesrule_resourceます。値は、 models ノードの下のノード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>
于 2012-05-18T03:14:07.487 に答える