【问题标题】:Remove SalesRule from Quote Magento 1.x从报价 Magento 1.x 中删除 SalesRule
【发布时间】:2026-02-04 08:50:01
【问题描述】:

如果规则优惠券类型为

,我想从 Quote 中删除 SalesRule

Mage_SalesRule_Model_Rule::COUPON_TYPE_NO_COUPON

我有这个代码:

    $event = $observer->getEvent();
    $quote = $event->getQuote();
    $address = $quote->getShippingAddress();
    $appliedRule = $event->getRule();

    if (strlen($quote->getCouponCode()) > 0) {
        $quote->setCouponCode('');
        $quote->collectTotals()->save();
    }

    return $this;

如果我想删除我在 salesRule 中设置的优惠券代码,它可以正常工作。但同样的规则不适用于我上面提到的优惠券类型。

我尝试了一些解决方案,例如遍历报价项目并将 appliedRules 设置为 null 并将 discount amount, value 设置为零,但没有任何效果。例如

    $event = $observer->getEvent();
    $quote = $event->getQuote();
    $address = $quote->getShippingAddress();
    $appliedRule = $event->getRule();

    $giftcards = $quote->getGiftCards();
    $giftCardsData = unserialize($giftcards);

    if ($appliedRule->getCouponType() == Mage_SalesRule_Model_Rule::COUPON_TYPE_NO_COUPON) {
                foreach($quote->getAllVisibleItems() as $item) {
                    $item->setAppliedRuleIds('');
                    $item->setDiscountPercent(0);
                    $item->setDiscountAmount(0);
                    $item->setBaseDiscountAmount(0);
                    $item->save();
                }
            }

或者也尝试在 QUOTE 和 ADDRESS 中将 AppliedRules 设置为 null:

if ($appliedRule->getCouponType() == Mage_SalesRule_Model_Rule::COUPON_TYPE_NO_COUPON) {
            $address->setAppliedRuleIds('');
            $quote->setAppliedRuleIds('');
        }

但到目前为止还没有成功。如果有人能告诉我如何从报价中删除 SalesRule,我会非常满意。

顺便说一下上面的代码是在下面运行的

salesrule_validator_process

事件。

【问题讨论】:

    标签: magento event-handling magento-1.9


    【解决方案1】:

    我自己想通了,虽然我不确定这个答案的效率如何。 如前所述,代码在

    中执行

    salesrule_validator_process

    此事件与自身传递以下数据:

    Mage::dispatchEvent('salesrule_validator_process', array(
                    'rule'    => $rule,
                    'item'    => $item,
                    'address' => $address,
                    'quote'   => $quote,
                    'qty'     => $qty,
                    'result'  => $result,
                ));
    

    您可以在函数下的类app/code/core/Mage/SalesRule/Model/Validator.php中找到代码 公共功能流程(Mage_Sales_Model_Quote_Item_Abstract $item) Magento EE的

    RESULT包含DISCOUNT AMOUNTBASE DISCOUNT AMOUNT

    的信息

    我只是将这两个值更改为零,这有助于我解决问题。以下是完整代码:

    public function YourFunctionName($observer)
    {
        $event = $observer->getEvent();
        $quote = $event->getQuote();
        $appliedRule = $event->getRule();
        $result = $event->getResult();
    
        $giftcards = $quote->getGiftCards();
        $giftCardsData = unserialize($giftcards);
    
        if (!empty($giftCardsData)) {
            if (!$appliedRule->getIsUsableWithGiftCard()) {
                if ($appliedRule->getCouponType() == Mage_SalesRule_Model_Rule::COUPON_TYPE_NO_COUPON) {
                    $result->setDiscountAmount(0); /// Here it is
                    $result->setBaseDiscountAmount(0);  /// Here it is
                } else {
                    $quote->setCouponCode('');
                    $quote->collectTotals()->save();
                }
            }
        }
    
        return $this;
    }
    

    【讨论】: