我的模块带有我的自定义折扣,没关系。
config.xml中:
<sales>
<quote>
<totals>
<aver>
<class>Dani_Prueba_Model_Total_Aver</class>
<after>subtotal</after>
</aver>
</totals>
</quote>
</sales>
我的模块:
<?php
class Dani_Prueba_Model_Total_Aver extends Mage_Sales_Model_Quote_Address_Total_Abstract{
public function collect(Mage_Sales_Model_Quote_Address $address){
$baseDiscount = 2.5;
$discount = Mage::app()->getStore()->convertPrice($baseDiscount);
$address->setCustomDiscount($baseDiscount);
$address->setBaseGrandTotal($address->getBaseGrandTotal() - $baseDiscount);
$address->setGrandTotal($address->getGrandTotal() - $discount);
return $this;
}
public function fetch(Mage_Sales_Model_Quote_Address $address){
$this->setCode('aver');
$amount = $address->getCustomDiscount();
if ($amount != 0){
$address->addTotal(array(
'code' => $this->getCode(),
'title' => 'Custom Discount',
'value' => $amount
));
}
return $this;
}
}
这没关系,当我将产品添加到购物车时,会自动应用我的自定义折扣。
但现在我需要用按钮来做。当我向购物车添加产品时,不应用折扣并拥有正确的总数。但是当我点击一个按钮,应用我的自定义折扣,并使用其他按钮“取消”,取消折扣。我需要一些类似功能的优惠券代码。
我是怎么做到的?
答案 0 :(得分:8)
为此,您需要将另一个属性/列添加到sales/quote
表(可能还有sales/order
表)。
因此,在您的安装脚本中,执行此操作(我还包括销售/订单表/实体属性):
$installer->addAttribute('order', 'use_special_coupon', array('type' => 'int', 'grid' => true, 'source' => 'adminhtml/system_config_source_yesno'));
$installer->addAttribute('quote', 'use_special_coupon', array('type' => 'int', 'grid' => true, 'source' => 'adminhtml/system_config_source_yesno'));
$installer->getConnection()->addColumn($installer->getTable('sales/quote'), 'use_special_coupon', 'TINYINT(1) unsigned default 0');
$installer->getConnection()->addColumn($installer->getTable('sales/order'), 'use_special_coupon', 'TINYINT(1) unsigned default 0');
然后,在您的控制器中,执行以下操作:
$quote = Mage::getSingleton('checkout/session')->getQuote();
$quote
->setUseSpecialCoupon(true)
->save();
或者,相反,在你的removeAction中:
$quote = Mage::getSingleton('checkout/session')->getQuote();
$quote
->setUseSpecialCoupon(false)
->save();
最后,在你的整个模型中,将其修改为:
<?php
class Dani_Prueba_Model_Total_Aver extends Mage_Sales_Model_Quote_Address_Total_Abstract{
public function collect(Mage_Sales_Model_Quote_Address $address)
{
if ($address->getQuote()->getUseSpecialCoupon()) {
$baseDiscount = 2.5;
$discount = Mage::app()->getStore()->convertPrice($baseDiscount);
$address->setCustomDiscount($baseDiscount);
$address->setBaseGrandTotal($address->getBaseGrandTotal() - $baseDiscount);
$address->setGrandTotal($address->getGrandTotal() - $discount);
}
return $this;
}
public function fetch(Mage_Sales_Model_Quote_Address $address){
if ($address->getQuote()->useSpecialCoupon()) {
$this->setCode('aver');
$amount = $address->getCustomDiscount();
if ($amount != 0){
$address->addTotal(array(
'code' => $this->getCode(),
'title' => 'Custom Discount',
'value' => $amount
));
}
}
return $this;
}
}
答案 1 :(得分:2)
作为已接受答案的后续内容,我想指出的是,人们(像过去的我一样)在发票上反映自定义总数时遇到问题需要添加更多内容。
首先,您的列也需要添加到sales/invoice
表中。
其次,Mage_Sales使用Convert对象将数据从引号传播到订单到发票。要在此流程中包含your_custom_total
,请添加几个配置挂钩:
<global>
<fieldsets>
<sales_convert_quote>
<your_custom_total><to_order>*</to_order></your_custom_total>
</sales_convert_quote>
<sales_convert_order>
<your_custom_total><to_invoice>*</to_invoice></your_custom_total>
</sales_convert_order>
</fieldsets>
</global>
现在,当报价转换为订单时,您的总金额将被包括在内,而该订单将被包含在发票中。
但是,即使您的总额已保存在发票上,发票也不知道该总额如何影响其总计。因此,需要添加类似于报价地址总模型的发票总模型。
配置挂钩:
<global>
<sales>
<order_invoice>
<totals>
<namespace_custom>
<class>namespace/sales_order_invoice_total_custom</class>
<after>subtotal</after>
</namespace_custom>
</totals>
</order_invoice>
</sales>
</global>
上课:
class Package_Module_Model_Sales_Order_Invoice_Total_Custom extends Mage_Sales_Model_Order_Invoice_Total_Abstract
{
public function collect(Mage_Sales_Model_Order_Invoice $invoice)
{
$invoice->setBaseGrandTotal($invoice->getBaseGrandTotal() + $invoice->getYourCustomTotal())
->setGrandTotal($invoice->getGrandTotal() + $invoice->getYourCustomTotal());
return $this;
}
}
如果您的总额适用,您可以镜像以上内容将发票转换为贷项通知单。
此链接http://magento.ikantam.com/qa/how-add-discount-total-magento说明了如何重写adminhtml块以在后端显示总数。
答案 2 :(得分:0)
Joseph Maxwell,谢谢你的出色解决方案! 但是,
if ($address->getQuote()->useSpecialCoupon())
此代码应更改为以下代码
if ($address->getQuote()->getUseSpecialCoupon())
没有GET字我遇到了以下错误:
Invalid method Mage_Sales_Model_Quote::useSpecialCoupon(Array
花了一些时间,直到我意识到错误的原因。