我有一类产品,当您订购的数量超过一定数量时,(法律上)需要更改其税率。当您将新产品添加到购物车时,我扩展了各种税收模型以使其工作,但是当用户更新购物车中的数量或添加其他产品以使购物车中的数量超过阈值时,我遇到了问题量。
问题一:
首先,我不是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);
我的更改尚未保存,报价项目更改已重置,购物车总额未重新计算。开始怀疑是否找到跳高的建筑物可能是解决这一问题的方法。