2014-06-19 53 views
0

在我的magento商店中,如何動態改變購物車中的折扣總額?Magento - 動態更改購物車中的折扣費用

我能夠訪問和獲取與此代碼目前的優惠:

<?php 
$quote = Mage::getSingleton('checkout/cart')->getQuote(); 
$totals = $quote->getTotals(); 
$discount = $totals["discount"]->getValue(); 
?> 

我有我的購物車按鈕,當按下應該添加一個額外的£5到貼現值,更新總成本等。

回答

2

有在Magento的事件,

sales_quote_collect_totals_after 

這是發射時的總價計算,你可以做的是建立在會話標誌上點擊按鈕應用的折扣,並在上面這個事件的觀察者方法,檢查是否設置,然後應用折扣。

在你的config.xml

<global> 
<events> 
    <sales_quote_collect_totals_after> 
    <observers> 
     <class>Custom_Module_Model_Observer</class> 
     <method>collectTotals</method> 
    </observers> 
    </sales_quote_collect_totals_after> 
</events> 
</global> 

做一個Observer.php在

Custom 
    /Module 
    /Model 
     /Observer.php 

做一個功能Observer.php

public function collectTotals(Varien_Event_Observer $observer) 
{ 
     $quote=$observer->getEvent()->getQuote(); 
     $quoteid=$quote->getId(); 
    //check condition here if need to apply Discount 
     if($disocuntApply) $discountAmount =5; 

    if($quoteid) { 
       if($discountAmount>0) { 
      $total=$quote->getBaseSubtotal(); 
      $quote->setSubtotal(0); 
      $quote->setBaseSubtotal(0); 

      $quote->setSubtotalWithDiscount(0); 
      $quote->setBaseSubtotalWithDiscount(0); 

      $quote->setGrandTotal(0); 
      $quote->setBaseGrandTotal(0); 


      $canAddItems = $quote->isVirtual()? ('billing') : ('shipping'); 
      foreach ($quote->getAllAddresses() as $address) { 

        $address->setSubtotal(0); 
        $address->setBaseSubtotal(0); 

        $address->setGrandTotal(0); 
        $address->setBaseGrandTotal(0); 

        $address->collectTotals(); 

        $quote->setSubtotal((float) $quote->getSubtotal() + $address->getSubtotal()); 
        $quote->setBaseSubtotal((float) $quote->getBaseSubtotal() + $address->getBaseSubtotal()); 

        $quote->setSubtotalWithDiscount(
         (float) $quote->getSubtotalWithDiscount() + $address->getSubtotalWithDiscount() 
        ); 
        $quote->setBaseSubtotalWithDiscount(
         (float) $quote->getBaseSubtotalWithDiscount() + $address->getBaseSubtotalWithDiscount() 
        ); 

        $quote->setGrandTotal((float) $quote->getGrandTotal() + $address->getGrandTotal()); 
        $quote->setBaseGrandTotal((float) $quote->getBaseGrandTotal() + $address->getBaseGrandTotal()); 

      $quote ->save(); 

       $quote->setGrandTotal($quote->getBaseSubtotal()-$discountAmount) 
       ->setBaseGrandTotal($quote->getBaseSubtotal()-$discountAmount) 
       ->setSubtotalWithDiscount($quote->getBaseSubtotal()-$discountAmount) 
       ->setBaseSubtotalWithDiscount($quote->getBaseSubtotal()-$discountAmount) 
       ->save(); 


      if($address->getAddressType()==$canAddItems) { 

      $address->setSubtotalWithDiscount((float) $address->getSubtotalWithDiscount()-$discountAmount); 
      $address->setGrandTotal((float) $address->getGrandTotal()-$discountAmount); 
      $address->setBaseSubtotalWithDiscount((float) $address->getBaseSubtotalWithDiscount()-$discountAmount); 
      $address->setBaseGrandTotal((float) $address->getBaseGrandTotal()-$discountAmount); 
      if($address->getDiscountDescription()){ 
      $address->setDiscountAmount(-($address->getDiscountAmount()-$discountAmount)); 
      $address->setDiscountDescription($address->getDiscountDescription().', Amount Waived'); 
      $address->setBaseDiscountAmount(-($address->getBaseDiscountAmount()-$discountAmount)); 
      }else { 
      $address->setDiscountAmount(-($discountAmount)); 
      $address->setDiscountDescription('Amount Waived'); 
      $address->setBaseDiscountAmount(-($discountAmount)); 
      } 
      $address->save(); 
      }//end: if 
      } //end: foreach 
      //echo $quote->getGrandTotal(); 

      foreach($quote->getAllItems() as $item){ 
         //We apply discount amount based on the ratio between the GrandTotal and the RowTotal 
         $rat=$item->getPriceInclTax()/$total; 
         $ratdisc=$discountAmount*$rat; 
         $item->setDiscountAmount(($item->getDiscountAmount()+$ratdisc) * $item->getQty()); 
         $item->setBaseDiscountAmount(($item->getBaseDiscountAmount()+$ratdisc) * $item->getQty())->save(); 

         } 


        } 

      } 
     } 

collectTotals函數將被調用,無論何時報價總數已更新,因此無需明確調用。

檢查它是如何工作的here

設置magento會話變量,請檢查here

希望它有幫助!

+0

對不起,延遲響應,我已經離開了。哇,非常感謝你。我可以成爲一個痛苦,只是問我如何在購物車頁面中調用'collectTotals'函數?你提到在會議中設置一個標誌,但我不知道這與我有限的知識,並在網上搜索沒有任何運氣 –

+0

更新的代碼,檢查它 – huzefam

+0

偉大,謝謝。現在完美工作 –