特定の数量を超えて注文する場合は、(法的に)税率を変更する必要がある製品のカテゴリがあります。さまざまな税モデルを拡張して、新しい製品をカートに追加するときにこれが機能するようにしましたが、ユーザーがカート内の数量を更新するか、カート内の数量がしきい値を超える追加の製品を追加するときに問題が発生します量。
問題1:
まず第一に、私は100%のイベントを監視するわけではありません。私は次のことを試しました。
checkout_cart_save_after
(これに基づいて-> https://stackoverflow.com/questions/14362702/magento-programatically-update-cart-via-event)
checkout_cart_update_items_after
(これに基づいて-> https://stackoverflow.com/questions/5104482/programmatically-add-product-to-cart-with-price-change)
sales_quote_save_before
(これに基づいて-> https://stackoverflow.com/questions/7638858/magento-recalculate-cart-total-in-observer)
問題2:
私はカートから見積もりアイテムにアクセスできますが、それを行う方法はたくさんあるようです。また、カート内の個々のアイテムを反復処理し、それらのアイテムのプロパティを更新してから、アイテムを(少なくとも一時的に)保存することもできます。ただし、見積を保存してチェックアウトで税金を再計算することはできません。
理由の一部は、カートの見積もりにアクセスできる一方で、どのメソッドを使用して書き込みできるかわからないことです。
私が試したこと:
カートの中身にアクセスするという観点で私が試したことは、私が観察したイベントに依存していましたが、次のすべてを試しました。
1.
$item = $observer->getQuoteItem;
2.
$cart = Mage::getSingleton('checkout/cart');
$cartItems = $cart->getCart()->getItems();
3.
$cart = $observer->getData('cart');
$quote = $cart->getData('quote');
$cartItems = $quote->getAllVisibleItems();
4.
$cartHelper = Mage::helper('checkout/cart');
$cartItems = $cartHelper->getCart()->getItems();
5.
$quote = Mage::getModel('checkout/cart');
$cartItems = $quote->getItems();
少なくとも見積もりにアクセスし、それらを実行してアイテムを更新できるようにしているようです
6.
$quote = Mage::getSingleton('checkout/session')->getQuote();
$cartItems = $quote->getAllVisibleItems();
これにより、繰り返し処理するときに各引用項目を更新できます(対応するメソッドが見つからないため、マジックセッターを使用していると思います)。見積品目の税クラスIDを更新し、税を再計算できるようにしたいと思っていました。次を使用する場合($ taxClassIdは、各見積アイテムで既に使用されているものとは異なります)。
$item->setTaxClassId( $taxClassId );
$item->getProduct()->setIsSuperMode(true);
$item->save;
そして、結果を記録します。
Mage::log($item->debug(), null,'taxobserver.log', true);
実際にこの見積品目を更新し、納税者番号を変更したことがわかります。ただし、その後、フォローアップして、変更された見積もりを保存しようとすると、
$quote->setTotalsCollectedFlag(false)->collectTotals();
$quote->save();
そして、再度デバッグします。
Mage::log($item->debug(), null,'taxobserver.log', true);
私の変更は保存されず、見積品目の変更はリセットされ、カートの合計は再計算されません。飛び降りる高層ビルを見つけることがこのソリューションの可能性があるのではないかと考え始めました。