我们使用Magento Enterprise 1.10,并一直在实施一种自定义方式,为特定产品提供免费送货和免税服务。我已经成功地在购物车和Onepage结账中实现了这方面的显示部分(步骤5)。我遇到的问题是,当您单击"下订单"时,它会删除(或重置)subTotal、grandTotal和taxAmount的自定义值。我可以在sales_flat_quote和sales_flat_quote_item表中看到,这些值是用我给它的自定义值设置的。但sales_flal_quote_address表中的grandTotal和taxAmount没有正确设置(不确定这是否相关,但假设)。他们正在重新计算的默认方式马根托计算他们。
例如,我可以将TaxAmount设置为自定义值,比如20美元。但Magento会把产品价格和税率重新计算出来。如果这有道理的话。
我已经在我们的OnepageController.php方法saveOrderAction()中指出了这一点
if ($data = $this->getRequest()->getPost('payment', false)) {
$this->getOnepage()->getQuote()->getPayment()->importData($data);
}
这段代码用Magento通常在中设置的方式替换了我设置的自定义值
我的问题是,为什么要阻止上面的代码块重新计算值,只使用我已经在中设置的值
Mage::getSingleton('checkout/session')->getQuote()
提前感谢
我不认为覆盖onepage控制器是应用自定义折扣/税收的最佳方式。最好在事件sales_quote_collect_totals_after
上放置一个观察员,并在此处重新计算订单总额/修改项目/应用折扣。
此外,我经常看到人们犯错误,忘记调用collectTotals(),或者忘记保存更改,即
$quote = Mage::getSingleton('checkout/session')->getQuote();
$quote->setGrandTotal(999.99)->save();
如果我没有抓住你问题的要点,请提供进一步的细节。您在订单表中使用自定义列吗?
向致以最良好的问候
您不能像下面这样设置订单金额。
$quote->setGrandTotal(999.99)->save();
因为小计、合计和税额是订单总额,并且是在调用以下代码时计算的。
$quote->collectTotals();
这将合并您的价值。
只需检查Mage_Sales_Model_Quote_Address_Total_Abstract中名为collect的函数,并在函数开头添加以下代码。
foreach (Mage::getSingleton('checkout/cart')->getQuote()->getAllVisibleItems() as $item ) {
if ($item->getParentItem()) {
$item = $item->getParentItem();
}
$item->setTaxAmount(20);
$item->getProduct()->setIsSuperMode(true);
}
当然你应该重写这个方法。如果您想在模块的config.xml 中重写,请使用以下内容
<sales>
<quote>
<totals>
<wrapping>
<class>pay/total_taksit</class>
<before>subtotal</before>
</wrapping>
</totals>
</quote>
</sales>