我想在小计之前加固定费率,默认情况下小于小计。
答案 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;