0

我们正在使用 Magento Enterprise 1.10,并且一直在实施一种自定义方式来提供免费送货,并且对特定产品不征税。我已经成功地在购物车和 Onepage 结帐中实现了显示部分(第 5 步)。我遇到的问题是,当您单击“下订单”时,它会删除(或重置)subTotal、grandTotal 和 taxAmount 的自定义值。我可以在 sales_flat_quote 和 sales_flat_quote_item 表中看到,这些值是使用我给它的自定义值设置的。但是sales_flat_quote_address 表中的grandTotal 和taxAmount 设置不正确(不确定这是否相关,但假设)。它们正在按照 Magento 计算它们的默认方式重新计算。

因此,例如,我可能会将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()

提前致谢,

4

2 回答 2

0

您不能像下面这样设置订单金额。

$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>
于 2014-02-12T09:37:38.573 回答
0

我不认为覆盖 onepage-controller 是应用自定义折扣/税收的最佳方式。最好在事件中放置一个观察者并在sales_quote_collect_totals_after此处重新计算订单总数/修改项目/应用折扣。

另外,我经常看到人们犯的错误是他们忘记调用 collectTotals(),或者他们忘记保存更改,即

$quote = Mage::getSingleton('checkout/session')->getQuote();
$quote->setGrandTotal(999.99)->save();

如果我错过了您的问题的要点,请提供更多详细信息。您在订单表中使用自定义列吗?

此致

于 2013-03-08T15:32:04.027 回答