3

カスタムディスカウント付きのモジュールを持っていますが、問題ありません。

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;
    }
}

これで問題ありません。製品をカートに追加すると、カスタム割引が自動的に適用されます。

しかし、今はボタンでそれを行う必要があります。商品をカートに追加しても、割引が適用されず、正しい合計が表示されます。しかし、ボタンをクリックすると、カスタム割引が適用され、他のボタン「キャンセル」で割引がキャンセルされます。クーポンコードの機能のようなものが必要です。

どうやってやるの??

4

3 に答える 3

8

これを行うには、sales/quoteテーブル (場合によってはsales/orderテーブル) に別の属性/列を追加する必要があります。

したがって、インストール スクリプトで、これを実行します (sales/order table/entity 属性も含めました)。

$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 に答える