2011-06-17 93 views
0

我们正在使用Magento主要用于交易,并已完全通过自定义应用程序重写前端。我无法在报价对象上应用优惠券代码(购物车价格规则)。优惠券代码似乎被拒绝 - setCouponCode不返回任何错误,但getCouponCode返回空字符串。Magento:setCouponCode似乎没有在报价模式上应用优惠券

我已通过管理后台进行交易验证了优惠券代码的有效性。这是下面的代码片段。

有人可以帮我获得报价模型对象接受并应用优惠券代码吗?

功能add_coupon($ shoppingCartId,$ COUPONCODE){

try { 
      $quoteObj = Mage::getModel('sales/quote')->load($shoppingCartId); 
      $quoteObj->getShippingAddress()->setCollectShippingRates(true); 
      $quoteObj->getShippingAddress()->setCouponCode($coupon) 
        ->setTotalsCollectedFlag(true) 
        ->collectTotals() 
        ->save(); 
    } catch (Exception $e) { 
      return array("status"=>"failed", "message"=>"Error applying coupon."); 
    } 
    if ($coupon) { 
      if (!$coupon == $quoteObj->getCouponCode()) { 
        return array("status"=>"failed", "message"=>"Coupon code is not valid."); 
      } 
    } 
    return array("status"=>"success"); 

}

回答

2

需要用于处理优惠券的所有逻辑是在SalesRule模块。

有模型Mage_SalesRule_Model_Coupon这是优惠券对象,它有一个资源模型Mage_SalesRule_Model_Mysql4_Coupon

要创建新优惠券,您可以实例化上述优惠券模型,填写所有字段并调用save()方法。它会将数据写入表salesrule_coupon。但是如果你看看这张桌子,你会发现优惠券依赖于规则ID,所以你需要先创建一些销售规则

Mage_SalesRule_Model_Rule关心规则,它也有自己的资源模型。我认为这将有助于你调查他们是如何工作的

4

我遇到了同样的问题,并发现我需要在添加任何项目到我的报价前调用setCouponCode()。

在你的情况,这将是这样的:

$quoteObj = Mage::getModel('sales/quote')->setCouponCode($coupon)->load($shoppingCartId); 
+0

这项工作如何,优惠券适用于付款步骤,我们是否应该在第一次创建购物车时申请空白优惠券? – 2016-05-19 08:35:19

1

我失去了几个小时到今晚。希望我能拯救一个人。 Emily对于此示例是正确的(您将购物车加载到报价中)。

这适用于Magento 1.7.0.2,我不确定它是否适用于其他版本。

如果以编程方式创建一个订单,但你不使用购物车,这样做这可能会帮助您: 根本的问题是,Magento的运行collectTotals()每次添加/次更新的地址引用 - 这里是重要的部分:它缓存它们。 (实际上,如果您检查getTotalsCollectedFlag,则保存地址后,您会看到它设置为true!)。在此之后设置优惠券代码,即使您运行collectTotals(),也不会应用优惠券代码。

您可以在报价单上调用setTotalsCollectedFlag(false),然后应用优惠券,但这不是一个好主意(根据不再可访问的Magento错误报告可能导致一些错误计算),您想要的在设置任何地址之前(或至少在设置最后一个地址之前),请先调用setCouponCode。