我正在尝试创建一步结帐,但在结帐页面中我遇到了订单审核部分的问题。当我选择付款方式时,例如“货到付款”有5美元额外,或“checkorder”有%4折扣或“信用卡付款”增加订单总额额外。 在保存付款方式之前,我需要一种计算折扣的方法。有什么建议吗?
答案 0 :(得分:17)
因为我们谈论的是Magento,所以有几种方法可以做到这一点。实现该功能的最佳方式是为折扣或额外费用创建自己的总模型。
要创建自己的总体模型,首先需要创建模块,然后将总模型添加到配置中。
<global>
<sales>
<quote>
<totals>
<your_total>
<class>your_module/quote_address_total_yourTotal</class>
<after>shipping</after><!-- calculate after these total models -->
<before>grand_total,tax</before><!-- calculate before these total models -->
</your_total>
</totals>
</quote>
<order_invoice>
<totals>
<your_total>
<class>your_module/order_invoice_total_yourTotal</class>
<after>shipping</after>
<before>grand_total,tax</before>
</your_total>
</totals>
</order_invoice>
<order_creditmemo>
<totals>
<your_total>
<class>your_module/order_creditmemo_total_yourTotal</class>
<after>shipping</after>
<before>grand_total,tax</before>
</your_total>
</totals>
</order_creditmemo>
</sales>
<pdf>
<totals>
<your_total translate="title">
<title>Your Total</title>
<source_field>your_total</source_field>
<font_size>7</font_size>
<display_zero>0</display_zero>
<sort_order>450</sort_order>
</your_total>
</totals>
</pdf>
</global>
然后实现XML中指定的三个类
引用地址总计需要延长sales/quote_address_total_abstract
并实施两种方法collect()
和fetch()
。
class Your_Module_Model_Quote_Address_Total_YourTotal
extends Mage_Sales_Model_Quote_Address_Total_Abstract
{
// Calculate your total value
public function collect(Mage_Sales_Model_Quote_Address $address)
{
parent::collect($address);
// Calculate the totals based on the information in the $address
// and the $address->getQuote()
// To get the items in the cart use $address->getAllItems()
// To get the payment method use getPayment()->getMethodInstance()
// etc
// When your totals are known..
$this->_addAmount($total); // store view currency amount
$this->_addBaseAmount($baseTotal); // base currency amount
// Also store in address for later reference in fetch()
$address->setMyTotal($total);
$address->setBaseMyTotal($baseTotal);
return $this;
}
// If the total should be displayed in the cart and the checkout
// add them to the address model here, otherwise just return
// (it will still be calculated and added to the grand total)
public function fetch(Mage_Sales_Model_Quote_Address $address)
{
if ($address->getMyTotal() > 0)
{
$address->addTotal(array(
'code' => $this->getCode(),
'title' => Mage::helper('your_module')->__('Your Total'),
'value' => $address->getMyTotal()
));
}
return $this;
}
}
配置XML中指定的下一个类是发票总模型your_module/order_invoice_total_yourTotal
class Your_Module_Model_Order_Invoice_Total_YourTotal
extends Mage_Sales_Model_Order_Invoice_Total_Abstract
{
// Collect the totals for the invoice
public function collect(Mage_Sales_Model_Order_Invoice $invoice)
{
$order = $invoice->getOrder();
$myTotal = $order->getMyTotal();
$baseMyTotal = $order->getBaseMyTotal();
$invoice->setGrandTotal($invoice->getGrandTotal() + $myTotal);
$invoice->setBaseGrandTotal($invoice->getBaseGrandTotal() + $basemyTotal);
return $this;
}
}
您需要在creditmemo总模型中实现的最后一个类,就像发票总模型一样,只是它扩展了抽象类Mage_Sales_Model_Order_Creditmemo_Total_Abstract
。
您还需要使用设置脚本添加属性:
/**
* @var Mage_Sales_Model_Resource_Setup $installer
*/
$installer = Mage::getResourceModel('sales/setup', 'default_setup');
$installer->startSetup();
$installer->addAttribute('order', 'base_your_total', array(
'label' => 'Base Your Total',
'type' => 'decimal',
));
$installer->addAttribute('order', 'your_total', array(
'label' => 'Your Total',
'type' => 'decimal',
));
$installer->addAttribute('invoice', 'base_your_total', array(
'label' => 'Base Your Total',
'type' => 'decimal',
));
$installer->addAttribute('invoice', 'your_total', array(
'label' => 'Your Total',
'type' => 'decimal',
));
$installer->addAttribute('creditmemo', 'base_your_total', array(
'label' => 'Base Your Total',
'type' => 'decimal',
));
$installer->addAttribute('creditmemo', 'your_total', array(
'label' => 'Your Total',
'type' => 'decimal',
));
$installer->endSetup();
要在管理区域中显示新总计,您需要使用布局XML为其添加总计块。为模块中的adminhtml
区域注册布局更新文件。以下是示例内容:
<layout version="0.1.0">
<adminhtml_sales_order_view>
<reference name="order_totals">
<block type="your_module/sales_total_yourTotal" name="total_your_total" as="your_total"/>
</reference>
</adminhtml_sales_order_view>
<adminhtml_sales_order_invoice_new>
<reference name="invoice_totals">
<block type="your_module/sales_total_yourTotal" name="total_your_total" as="your_total"/>
</reference>
</adminhtml_sales_order_invoice_new>
<adminhtml_sales_order_invoice_updateqty>
<reference name="invoice_totals">
<block type="your_module/sales_total_yourTotal" name="total_your_total" as="your_total"/>
</reference>
</adminhtml_sales_order_invoice_updateqty>
<adminhtml_sales_order_invoice_view>
<reference name="invoice_totals">
<block type="your_module/sales_total_yourTotal" name="total_your_total" as="your_total"/>
</reference>
</adminhtml_sales_order_invoice_view>
<adminhtml_sales_order_creditmemo_new>
<reference name="creditmemo_totals">
<block type="your_module/sales_total_yourTotal" name="total_your_total" as="your_total"/>
</reference>
</adminhtml_sales_order_creditmemo_new>
<adminhtml_sales_order_creditmemo_view>
<reference name="creditmemo_totals">
<block type="your_module/sales_total_yourTotal" name="total_your_total" as="your_total"/>
</reference>
</adminhtml_sales_order_creditmemo_view>
</layout>
如果您不想在某处显示总数,请将其删除。它仍将被计算。 好的,差不多了。最后,管理区域总块类实现:
// Many ways to implement this, here is one option
class Your_Module_Block_Sales_Total_YourTotal
extends Mage_Core_Block_Abstract
{
public function initTotals()
{
$parent = $this->getParentBlock();
$value = $parent->getSource()->getMyTotal();
if ($value > 0)
{
$total = new Varien_Object(array(
'code' => 'my_total',
'value' => $parent->getSource()->getMyTotal(),
'base_value' => $parent->getSource()->getBaseMyTotal(),
'label' => $this->__('My Total'),
'field' => 'my_total'
));
$parent->addTotal($total, 'my_total');
}
return $this;
}
}
现在唯一缺少的是字段集,用于将总金额从报价地址复制到订单,从订单复制到发票和creditmemo。将以下XML添加到config.xml:
<fieldsets>
<sales_convert_quote_address>
<shipping_surcharge><to_order>*</to_order></shipping_surcharge>
<base_shipping_surcharge><to_order>*</to_order></base_shipping_surcharge>
</sales_convert_quote_address>
<sales_convert_order>
<shipping_surcharge><to_invoice>*</to_invoice><to_cm>*</to_cm></shipping_surcharge>
</sales_convert_order>
</fieldsets>
就是这样。总数将随处显示(包括生成的PDF) 正如我所说,还有很多其他方法可以简单地更新核心中已经存在的总模型的值,但这是实现它的全面方式。
答案 1 :(得分:0)
订单包含setShippingAmount
和getShippingAmount
方法。修改以添加“货到付款”。
创建方法并将其作为观察者添加到checkout_type_onepage_save_order
/etc/config.xml
事件
# file: /Model/Observer.php
<?php
class Handling_Fee_Model_Observer
{
public function updateHandling ($observer)
{
$order = $observer->getEvent()->getOrder();
$shipping_amount = $order->getShippingAmount();
$order->setShippingAmount($shipping_amount * (1 + 0,5));
return $this;
}
}
这是你问题的一部分。在我看来,您可以通过这种方式自定义左侧部分。