1

資格のある顧客にカートの小計の3%の割引を与えるために、カスタムの合計コレクターを作成しました。私のコレクターのコードは次のようになります。

class My_Module_Model_DiscountCollector
    extends Mage_Sales_Model_Quote_Address_Total_Abstract
{
    // ...
    public function collect(Mage_Sales_Model_Quote_Address $address)
    {
        if($this->userIsQualified())
        {
            parent::collect($address);

            // $this->_inclTax tells the collector to either calculate the actual discount amount 
            // based on the subtotal including or excluding tax
            $baseCalcValue = ($this->_inclTax) ? $address->getBaseSubtotalTotalInclTax() : $address->getBaseSubtotal();
            $calcValue = ($this->_inclTax) ? $address->getSubtotalInclTax() : $address->getSubtotal();

            $baseDiscountAmount = $baseCalcValue * 0.03;
            $discountAmount = $calcValue * 0.03;

            $this->_setBaseAmount(-$baseDiscountAmount);
            $this->_setAmount(-$discountAmount);
        }
        return $this;
    }
    public function fetch(Mage_Sales_Model_Quote_Address $address)
    {
        if($this->userIsQualified())
        {
            $discountAmount = (($this->_inclTax) ? $address->getSubtotalInclTax() : $address->getSubtotal()) * 0.03;
            $address->addTotal(
                array(
                    "code"  => $this->getCode(),
                    "title" => "My Discount (3%)",
                    "value" => -$discountAmount
                )
            );
        }
        return $this;
    }
    // ...
}

私の問題は、合計リストの合計の順序を変更することです(たとえば、カートを表示する場合)。現在の注文は「小計、送料、送料、...、総計」ですが、「小計、送料、送料、...」の方がいいと思います。現在、私のconfig.xmlは次のようになっています。

<config>
    <!-- ... --->
    <global>
        <!-- ... -->
        <sales>
            <quote>
                <totals>
                    <my_discount>
                        <class>My_Module_Model_DiscountCollector</class
                        <after>shipping</after>
                        <!--<before>grand_total</before>-->
                        <!--<after>shipping</after>-->
                        <!--<before>shipping</before>-->
                    </my_discount>
                </totals>
            </quote>
        </sales>
        <!-- ... -->
    </global>
</config>

「before」要素と「after」要素に異なる設定を試しましたが、合計がリストされる順序には影響せず、grand_totalの計算にのみ影響しました。奇妙ですが、私の合計は、上記の設定でのgrand_totalの計算にのみ含まれています。たとえば、「after」を「subtotal」に設定した場合、または「before」を「grand_total」に設定した場合、合計はgrand_totalの計算にまったく影響しません。多分誰かが私にそれを説明することができます。

では、合計の順序を変更するにはどうすればよいですか?「after」を「shipping」以外に設定すると、なぜ結果がそれほど奇妙になるのですか?これらの2つの構成要素の機能を誤解しましたか?

4

1 に答える 1

3

上記のXMLスニペットは、合計コレクターがバックエンドで起動する順序用です。フロントエンドの順序は別の場所で制御されます。Mage / Core / Sales / etcのconfig.xmlから:

...
<default>
...
    <sales>
        <totals_sort>
            <discount>20</discount>
            <grand_total>100</grand_total>
            <shipping>30</shipping>
            <subtotal>10</subtotal>
            <tax>40</tax>
        </totals_sort>
...
</default>

<my_discount>モジュールconfig.xmlファイルの下にノードとして追加する場合は<totals_sort>、好きな場所に挿入できます。

于 2012-10-24T16:32:10.727 に答える