3

我的模块有我的自定义折扣,没关系。

配置.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;
    }
}

这没关系,当我将产品添加到购物车时,会自动应用我的自定义折扣。

但现在我需要用一个按钮来做。当我将产品添加到购物车时,不应用折扣并且总数正确。但是当我单击一个按钮时,应用我的自定义折扣,并使用其他按钮“取消”取消折扣。我需要一些类似功能的优惠券代码。

我该怎么做??

4

3 回答 3

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;
    }
}
于 2012-11-15T15:48:23.077 回答
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 块以在后端显示您的总数。

于 2013-06-20T16:59:06.073 回答
0

Joseph Maxwell,感谢您提供的出色解决方案!然而,

if ($address->getQuote()->useSpecialCoupon())

此代码应更改为以下代码

if ($address->getQuote()->getUseSpecialCoupon())

没有 GET 字,我遇到了以下错误:

Invalid method Mage_Sales_Model_Quote::useSpecialCoupon(Array

并花了一些时间直到我意识到错误的原因。

于 2015-02-04T15:16:20.330 回答