我已经创建了为每个购物车添加自定义项目所需的代码,而且似乎所有 ALMOST 都按预期工作。代码获取购物车中的项目,并制定在请求中发送给第三方的XML,并将响应解析回我的代码到一个数组中。然后,响应数组将作为具有特定预定SKU的唯一项目添加到购物车中。
我面临的唯一问题是,当我这样做时,它似乎没有更新购物车中的小计。例如:
我在购物车中订购了一件价值421美元的商品。这一项被放入一个XML语句中,该语句被发送给第三方以获得基于购物车中所有商品的成本的“债券”的特定价格。响应将债券的成本发回12.63美元,购物车中两个项目的小计按预期计算为433.63美元。然后,在玩了$ 421项目的数量后,我开始看到一些奇怪的事情......
我将项目编号更改为5,然后单击“更新购物车”。我在债券上获得了63.15美元的回报值,但小计显示我加上2,105美元(5个项目的价格)和12.63美元(原始债券的价格)共计2,117.63美元。我再次单击“更新购物车”,然后显示总计2,168.15美元。
每次更改数量时都会发生这种情况。我将之前的“债券”价格添加到当前小计中,只需点击两次“更新购物车”即可获得价格。
所以,我在想是否有办法添加我创建的代码之前它运行其他任何东西,我就能缩小这个差距。我这样做了吗?在XML中放入的任何其他代码之前添加我的代码的最佳方法是什么?
修改
进一步解释,这是我正在使用的代码块:
$cartHelper = Mage::helper('checkout/cart');
if ($buySAFEcost > 0) {
$product = Mage::getModel('catalog/product');
$bs_cart = Mage::getModel('checkout/cart');
$items = $cartHelper->getCart()->getItems();
$bs_my_product_id = $product->getIdBySku($bs_sku);
$bs_my_product = $product->load($bs_my_product_id);
$params = array( 'qty' => 1, 'price' => $buySAFEcost );
$bs_cart->addProduct($bs_my_product,$params);
$bs_cart->save();
Mage::app()->setCurrentStore(0); // ADMIN_STORE_ID
$bs_my_product->setPrice($buySAFEcost);
$bs_my_product->save();
// Redo the totals?
$cartModel->getQuote()->getBillingAddress();
$cartModel->getQuote()->getShippingAddress()->setCollectShippingRates(true);
$cartModel->getQuote()->collectTotals();
$cartModel->getQuote()->save();
// $cartModel->getQuote()->setTotalsCollectedFlag(false)->collectTotals()->save();
Mage::app()->setCurrentStore(1); // DISTRO_STORE_ID
Mage::getSingleton('checkout/session')->setCartWasUpdated(true);
}
我觉得我在这里用大锤杀死了一只蚂蚁,但小计仍然不断落后于我的行动一步。 我可能会把它放在错误的代码部分吗?
答案 0 :(得分:0)
听起来需要在引号对象上收集总数。您可以在Mage_Checkout_Model_Cart::save()
方法中看到Magento如何做到这一点:
$this->getQuote()->getBillingAddress();
$this->getQuote()->getShippingAddress()->setCollectShippingRates(true);
$this->getQuote()->collectTotals();
$this->getQuote()->save();
结算和送货地址会影响总税金。