我有我的模块,我自定义的折扣,它的确定。
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;
}
}
这是OK,当我将产品添加到购物车,自动应用我的自定义折扣。
但现在我需要一个按钮做。 当我将产品添加到购物车不适用优惠,并有正确的总。 但是,当我点击一个按钮,应用我的自定义折扣,并与其他按钮“取消”,取消折扣。 我需要一些类似的功能等优惠券代码。
我该怎么办呢?
要做到这一点,你需要另一个属性/列添加到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;
}
}
作为后续的接受的答案,我想指出的是,谁是有麻烦的定制总计人(比如我从过去的)反映在发票将需要添加一些更多的东西。
首先,你的列需要被添加到sales/invoice
表,以及。
其次,Mage_Sales使用转换对象,从行情数据传播到订单到发票。 若要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块,以显示你的总在后端。
约瑟夫·麦克斯韦,感谢你的伟大的解决方案! 然而,
if ($address->getQuote()->useSpecialCoupon())
此代码应更改为以下一个
if ($address->getQuote()->getUseSpecialCoupon())
如果没有GET字我都面临着以下错误:
Invalid method Mage_Sales_Model_Quote::useSpecialCoupon(Array
并花了一些时间,直到我意识到错误的原因。