如何在结帐时在magento中的小计前统一费率

时间:2017-01-25 10:57:25

标签: magento-1.9 checkout rate flat

我想在小计之前加固定费率,默认情况下小于小计。

1 个答案:

答案 0 :(得分:0)

如何添加额外的费用或折扣,或任何类型的费用来订购全部结帐过程 在典型的订单中,订单总计通常包括子总计,运输成本,税收,折扣,基于这些值计算总订单总计。 我们添加到总额中的额外费用将反映在

Checkout Page Order Total, 购物车页面订单总数, 我的帐户订单查看页面, 打印订单PDF, 订购电子邮件, 管理订单查看/电子邮件/ PDF, 管理员发票查看/电子邮件/ PDF, 管理员贷项凭证查看/电子邮件/ PDF。

结帐页面总订单总计基础知识 我们将看到如何仅将总计添加到结帐页面。显示结帐页面的所有总计行项目来自位于文件夹 Mage \ Sales \ Model \ Quote \ Address \ Total 的文件。

在放置订单之前的magento中,所有订单数据都存储在报价对象中,并且在下订单后,它将被转移到订单对象。引用总计遵循收集器模式,我们可以添加收集器尽可能多的收集器类。要将收集器添加到config.xml中的quote对象,我们添加行

<global>
    <sales>
        <quote>
            <totals>
                <fee>
                    <class>fee/sales_quote_address_total_fee</class>
                </fee>
            </totals>
        </quote>
   </sales>

这意味着每当计算报价的总数时,它也会调用此类。

所有收集器都是从Quote Model中的collectTotals()函数调用的。

在我们的收藏家课程中,我们放入了代码

<?php class Excellence_Fee_Model_Sales_Quote_Address_Total_Fee 

扩展Mage_Sales_Model_Quote_Address_Total_Abstract {     受保护$ _code =&#39;费用&#39;;

public function collect(Mage_Sales_Model_Quote_Address $address)
{
    parent::collect($address);

    $this->_setAmount(0);
    $this->_setBaseAmount(0);

    $items = $this->_getAddressItems($address);
    if (!count($items)) {
        return $this; //this makes only address type shipping to come through
    }


    $quote = $address->getQuote();

    if(Excellence_Fee_Model_Fee::canApply($address)){ //your business logic
        $exist_amount = $quote->getFeeAmount();
        $fee = Excellence_Fee_Model_Fee::getFee();
        $balance = $fee - $exist_amount;
        $address->setFeeAmount($balance);
        $address->setBaseFeeAmount($balance);

        $quote->setFeeAmount($balance);

        $address->setGrandTotal($address->getGrandTotal() + $address->getFeeAmount());
        $address->setBaseGrandTotal($address->getBaseGrandTotal() + $address->getBaseFeeAmount());
    }
}

public function fetch(Mage_Sales_Model_Quote_Address $address)
{
    $amt = $address->getFeeAmount();
    $address->addTotal(array(
            'code'=>$this->getCode(),
            'title'=>Mage::helper('fee')->__('Fee'),
            'value'=> $amt
    ));
    return $this;
}

} 这里我们使用两个字段fee_amount和base_fee_amount,其中包含我们的费用金额。我们必须看到将这两个字段保存到数据库,因此在我们的模块安装程序文件中添加此代码

ALTER TABLE  `".$this->getTable('sales/quote_address')."` ADD  `fee_amount` DECIMAL( 10, 2 ) NOT NULL;
    ALTER TABLE  `".$this->getTable('sales/quote_address')."` ADD  `base_fee_amount` DECIMAL( 10, 2 ) NOT NULL;

订单页面 到目前为止,所有编写的代码都只针对引用对象完成。但是在下订单后,我们需要将所有信息传递给订单对象。正如您在上面所看到的,我们使用了两个字段fee_amount和base_fee_amount,我们现在也需要将这两个字段存储在订单表中。要做到以上所有,我们需要做两件事。首先在config.xml文件中将此代码添加到全局选项卡

<fieldsets>
        <sales_convert_quote_address>
        <fee_amount><to_order>*</to_order></fee_amount>
        <base_fee_amount><to_order>*</to_order></base_fee_amount>
        </sales_convert_quote_address>
  </fieldsets>

在我们的模块安装文件

ALTER TABLE  `".$this->getTable('sales/order')."` ADD  `fee_amount` DECIMAL( 10, 2 ) NOT NULL;
    ALTER TABLE  `".$this->getTable('sales/order')."` ADD  `base_fee_amount` DECIMAL( 10, 2 ) NOT NULL;