Magento:カスタム合計は2回カウントされますか?

さて、私は特別割引を追加するためのカスタム合計クラスを作成し、すべてが正常に動作するように見えますが、私は見つけることができない何らかの理由で、私の合計が2回計算されます!その結果、2倍の割引額と不正確な総額が生じます。これはカートページとチェックアウトページで行われますが、注文を完了すると合計は問題なく、1回だけ計算され、総計は正常です。

それは奇妙です、それはcollectメソッドがカートページのために2回呼び出されるのと同じですが、注文を終えるときには1回だけですが、これがどこで起こるのか、そしてその理由を追うことができます。

ジャンクコードをスキップするには、重要なものだけを貼り付けます

     
        
            
                
                    ucon_mydiscount/total_mydiscount
                    subtotal
                
            
        
    

コレクタのメソッド

    public function collect(Mage_Sales_Model_Quote_Address $address)
{
    parent::collect($address);

    $quote = $address->getQuote();
    $quoteId = $quote->getEntityId();

    $items = $quote->getAllItems();
    if (!count($items)) {
        return $this;
    }       


    $discount = 0;
    $productId = 2556;  

    foreach($items as $item)
    {       
        if($item->getProduct()->getId() == $productId)
        {
            $qty = $item->getQty();
            $totalPrice = round(($item->getRowTotal()+$item->getTaxAmount()),2);

            //discount 10%              
            $discount = round($totalPrice * 0.1,2);     

            $discount = 0 - $discount;
        }
    }

    if($discount == 0)
        return $this;

    $this->_setAmount($discount);
    $this->_setBaseAmount($discount);


    return $this;
}

フェッチャー

    public function fetch(Mage_Sales_Model_Quote_Address $address)
{
    $amount = $address->getMydiscountAmount();
    if ($amount != 0) {
        $title = Mage::helper('ucon_mydiscount')->__('My discount');
        $address->addTotal(array(
            'code' => $this->getCode(),
            'title' => $title,
            'value' => $amount
        ));
    }
    return $this;
}

編集:私は非常に奇妙なことをもう一つ見つけました - 私はaddValueではなく、私のcollectメソッドでsetValをしていますので、メソッドが2回呼び出されても、2倍の値ではありません。正しい値。

5
私はこれを一度経験しましたが、私はそれを修正するために何をしたのか分かりません。私は、Mageクラスの1つをコピーして、合計が既に何らかの形で使用されていたかどうかを明示的にチェックしたと思います。最後に、どのように2回呼び出されているのかを確認するために、各収集関数とフェッチ関数にブレークポイントまたは Mage :: log(__ METHOD __)を追加してみてください。
追加された 著者 clockworkgeek,
追加された 著者 Relja,

3 答え

問題は、合計オブジェクトが住所オブジェクトに属し、Magentoの注文に通常2つの住所(出荷用と請求用)があることですか?

したがって、請求先住所を指定して1回、配送先住所を1回指定して住所ごとの合計金額を 2回実行するように合計が呼び出されます。あなたは手渡されたアドレスをチェックし、このような値のうちの1つに値を適用することができます。

public function collect(Mage_Sales_Model_Quote_Address $address) {

  $this->_setAddress($address);
  $this->_setAmount(0);
  $this->_setBaseAmount(0);

  if ($address->getAddressType() == 'shipping') { 
    //only apply an actual value to the shipping address

    //... Do your calculation here as above ...

  } 

  return $this;
}

fetchメソッドでも同様のことをする必要があります...

public function fetch(Mage_Sales_Model_Quote_Address $address) {

  $amount = $address->getMydiscountAmount();

  if ($amount != 0 && $address->getAddressType() == 'shipping') {

    $title = Mage::helper('ucon_mydiscount')->__('My discount');

    $address->addTotal(array(
        'code' => $this->getCode(),
        'title' => $title,
        'value' => $amount
    ));

  }

  return $this;
}

私は、 collect 関数がきれいになるかもしれないと認めますが、とにかくあなたはそのアイデアを得ることができます。

それを試して、合計がフロントエンドと管理領域に正しく追加されているかどうかを確認してください。

15
追加された
@ワカニナ私は、このようなフロントエンドの合計を自分自身のバックエンドにしたことはありません。私はバックエンドの追加製品に変換する必要がありました。これは、合計を収集した checkout_type_onepage_save_order イベントのオブザーバーで行いました。 。このブログは正しい軌跡のようです: classyllama.com/ブログ/…
追加された 著者 Russ Wilde,
****感謝、何百万年後にそれを見つけることは信じられない:)
追加された 著者 Relja,
こんにちは、 if($ address-> getAddressType()== 'shipping'){}を追加しました。しかし、注文を完了した後間違って、それは私のカスタム合計がカウントされないようです。誰が何が間違っているのか分かりますか?
追加された 著者 Wakanina,
ええ、私はそのチュートリアルにも従っていました。私は自分の答えを追加...ありがとう:)
追加された 著者 Wakanina,

検索した後、ここに別の解決策があります

public function collect(Mage_Sales_Model_Quote_Address $address) {
    parent::collect($address);

    //Pay attention to this code
    $items = $this->_getAddressItems($address);
    if (!count($items)) {
        return $this; //this makes only address type shipping to come through
    }

    //Do whatever you want here to add discount or fee...

    return $this;
}

By doing this, the discount or fee will only added to the shipping address, and it will count once. So we even don't need to add the if ($address->getAddressType() == 'shipping') { in the fetch function.

2
追加された

Is it possible that you are adding in your own layout xml code for a shopping cart block? If you are, there is a solid chance that block is being called twice (one from the base code, and again for your code -- even if you are just extending it), thus duplicating the price total. If that is the case, you will need to remove (destructively with the tag) the base layout xml for that block, and things should then fall into place and work.

0
追加された
残念ながら、それはそうではありません。私は2つのカートブロックを自分のレイアウトで呼び出します.1つは通常のカートページ用、もう1つはカート/サイドバー用です。しかし、私は自分のレイアウトをすべて無効にして、基本レイアウトだけを使ってみましたが、問題はまだあります。おそらく、どのようなメソッド/ブロックから収集メソッドが呼び出されているかを確認する方法はありますか?答えをありがとう。
追加された 著者 Relja,