【问题标题】:Magento: Create coupon code rule that discount differently base on the current discount of items in cartMagento:根据购物车中商品的当前折扣创建不同折扣的优惠券代码规则
【发布时间】:2015-07-26 21:05:36
【问题描述】:

要求是,如果商品已经打折,则额外打折 x%,如果商品未打折,则打折 y%。我需要处理上述两种类型的物品出现在同一个购物车中的情况吗?是否有现有的解决方案,或者如果我需要自己实施,我将从哪里开始。谢谢

【问题讨论】:

  • 您必须自定义总计才能执行此类折扣或在后端创建与您的问题相关的新操作

标签: php magento magento-1.9


【解决方案1】:

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 函数将在报价总额更新时被调用,因此无需显式调用它。

在这里检查它是如何工作的。

设置magento会话变量,检查here

希望对你有帮助!

【讨论】:

  • 非常感谢,请您解释一下。我看到了$quote-&gt;setSubtotal(0)$address-&gt;setSubtotal(0),然后你有$quote-&gt;setSubtotal((float) $quote-&gt;getSubtotal() + $address-&gt;getSubtotal()); 这对我来说不是很直观,因为$quote$address 上的getSubtotal() 都将是0。你能解释一下你为什么这样做吗?
  • 请您解释一下我上面的一些问题。我将不胜感激。非常感谢
  • 要更新订单总额,我首先将小计存储在 $total 变量中,然后将小计设置为零以处理正确的计算
猜你喜欢
  • 2011-06-21
  • 2012-12-27
  • 1970-01-01
  • 2020-08-12
  • 2020-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多