为啥 $address->hasCouponCode() 总是返回 null?

Posted

技术标签:

【中文标题】为啥 $address->hasCouponCode() 总是返回 null?【英文标题】:Why is $address->hasCouponCode() always returning null?为什么 $address->hasCouponCode() 总是返回 null? 【发布时间】:2013-08-18 16:53:55 【问题描述】:

由于某种原因,magento 网站不应用优惠券代码。它总是返回一个无效的:

优惠券代码无效

消息。然而,奇怪的是,当购物车的价格大于我的货币 120 时,就会发生这种情况。

如果我在购物车中有一件价格为 65 的产品,优惠券代码可以正常工作,但如果我在购物车中有相同的产品但数量为 2(这意味着总价格变为 130),我得到上述无效错误信息

我已将代码追溯到Mage_Sales_Model_Quote class, which has a function named_validateCouponCode()`,其中包含以下内容:

$address->hasCouponCode() 

总是返回false。我应该尝试什么?我已经重新索引、刷新缓存等,但没有任何改变,我似乎无法在地址模型中找到 hasCouponCode 函数来查看那里发生了什么......

【问题讨论】:

你找到解决办法了吗? 我可以看看你的购物车规则条件吗? 如果您需要帮助诊断优惠券代码有时无效的原因,您需要发布序列化优惠券代码规则。 【参考方案1】:

首先 var_dump($address) 并检查详细信息。

那么,

检查以下内容:

    正确的开始和到期日期。 为优惠券设置正确的客户群。 设置它active

如果以上 1 ,2, 3 要求都为真,则将 Stop further rules processing 设置为 YES

除此之外,出于某种原因,SKU 还需要字母数字来表示条件。因此,请检查您的产品 SKU 值是否为字母数字。

【讨论】:

【参考方案2】:

首先你需要了解 $address->hasCouponCode() 是如何工作的。

没有这样的方法,它是使用魔术函数__call调用的。

您不能直接访问它,因为 $_data 受到保护。

现在,最好的调试方法是检查您的地址对象中是否设置了优惠券。

$data = $address->getData();
$coupon = $data['coupon_code'];

现在在您的购物车中有 2 件商品的情况下检查是否设置了优惠券。

另一种方法是尝试使用 setter as 添加优惠券

$address->setCouponCode('Your Coupon Code');

$address->setData('coupon_code', 'Your Coupon Code');

并检查这是否有效。 如果没有,请查看

_validateCouponCode in Mage_Sales_Model_Quote

将是一个良好的调试开始。

【讨论】:

【参考方案3】:

好吧,没有你的确切规则,很难给出完整的答案。

首先,如果优惠券代码不在报价地址上,Mage_Sales_Model_Quote::_validateCouponCode() 调用只有一项工作,即从报价单中删除优惠券代码。这是因为在 collectTotal 调用期间,折扣总计模型会将优惠券代码复制到有效并应用的地址。因此,在这种情况下 $address->hasCouponCode() 返回 null 的事实只是表明规则验证器拒绝应用提供的优惠券代码。

其次,您应该找出两种方法来找出您的优惠券未被应用的原因。取决于您的优惠券,可能只有一个或另一个,但我会指出两者。 Mage_SalesRule_Model_Validator::process()Mage_SalesRule_Model_Validator::processShippingAmount() 是检查您的优惠券代码并可能应用它并将代码复制到地址的两个地方。

附带说明,Mage_SalesRule_Model_Validator::_maintainAddressCouponCode() 是负责将优惠券代码从验证器(从报价中获取代码)复制到地址的方法。如果从未调用此方法,则您的优惠券代码将始终从报价中删除。

tl;博士

逐步调试Mage_SalesRule_Model_Validator::process()Mage_SalesRule_Model_Validator::processShippingAmount()以调试您的优惠券代码无效的原因。

【讨论】:

以上是关于为啥 $address->hasCouponCode() 总是返回 null?的主要内容,如果未能解决你的问题,请参考以下文章

为啥有人要重载 & (address-of) 运算符? [复制]

为啥未设置 DBUS_SESSION_BUS_ADDRESS 时 g_file_copy 返回 Operation not supported

dubbo-monitor 为啥zookeeper会刷

VC 为啥我获取客户端ip地址总是:204.204.204.204

我明白为啥我得到: TypeError: getsockaddrarg: AF_INET address must be tuple, not str

为啥 console.log 从日志中排除我的零?