我们添加了"是/否"产品属性,标记为:"允许此产品应用优惠券吗?" 默认值为"是".
这样做的原因是,我们从不希望销售团队对数千种可用的核心产品给予折扣.
我们可以将这些产品作为SKU添加到创建的千张优惠券中的每一张上,但随后可能会被意外更改,或者由创建优惠券的销售团队不正确地列出.
因此,我们要求他们将此规则添加到新的优惠券中,以排除这些产品.我们还通过代码更新了所有其他优惠券,以包含此规则.

当我在Magento 1.5社区版上测试规则时,它与条件所说的完全相反.
当我在我们的其他企业解决方案(magento 1.9)上测试相同的规则时,它实际上做了它应该做的事情.
当我在购物车中有一个产品,作为将此属性设置为"否"的产品,并且我应用优惠券代码时,它接受优惠券代码.在另一个系统(企业)上,它应该拒绝它.
还有其他人遇到过这个吗?
更新:好的,这更有趣.当我逐步完成规则类时,产品已通过,但产品属性未通过.范围设置为网站,我确实检查了它是否在后端保存在该范围内.
这真的很奇怪......
在企业系统上,具有相同配置和数据的产品属性即将到来.
我甚至试图没有双重否定,另有新的属性,以确保.根据以下规则运行,优惠券被拒绝:"优惠券代码无效." 这是正确的,因为产品设置为"可以使用优惠券?=否".

但问题是我不想对所有其他产品进行检查,而是针对少数被标记为"否"的产品.
无论如何,这对我们无效,因为如果购物车中的任何产品的属性为"可以使用优惠券?",其值为"否",我们不想申请优惠券.
这是一个双重否定规则,无论你以何种方式看待它.
当第二次添加产品时,我通过validate()函数逐步执行/app/code/core/Mage/SalesRule/Model/Rule/Condition/Product.php,数据显示在属性中,但是当我去重新申请优惠券,再次单步执行此功能,这些价值已经消失.这很奇怪.
将新产品添加到购物车时:

重新申请优惠券代码时:

heck做了什么描述,其他一些属性消失了?
更新说明我越来越近了.当我从以下内容更改"/app/code/core/Mage/SalesRule/Model/Rule/Condition/Product.php"中的以下validate()函数时:
public function validate(Varien_Object $object)
{
$product = false;
if ($object->getProduct() instanceof Mage_Catalog_Model_Product) {
$product = $object->getProduct();
} else {
$product = Mage::getModel('catalog/product')
->load($object->getProductId());
}
$product
->setQuoteItemQty($object->getQty())
->setQuoteItemPrice($object->getPrice())
->setQuoteItemRowTotal($object->getBaseRowTotal());
return parent::validate($product);
}
Run Code Online (Sandbox Code Playgroud)
对此:
public function validate(Varien_Object $object)
{
$product = false;
$product = Mage::getModel('catalog/product')
->load($object->getProductId());
$product
->setQuoteItemQty($object->getQty())
->setQuoteItemPrice($object->getPrice())
->setQuoteItemRowTotal($object->getBaseRowTotal());
return parent::validate($product);
}
Run Code Online (Sandbox Code Playgroud)
它然后工作正常!
找出实际问题,这就是我为解决方案所做的:
以下位获取购物车价格规则的产品数据:
if ($object->getProduct() instanceof Mage_Catalog_Model_Product) {
$product = $object->getProduct();
} else {
$product = Mage::getModel('catalog/product')
->load($object->getProductId());
}
Run Code Online (Sandbox Code Playgroud)
罪魁祸首就是这一行:$ product = $ object-> getProduct();
这称为"Quote/Item/Abstract.php"中的一行:$ product = $ this - > _ getData('product');
它只是从系统中获取缓存数据,并且包含如下选择:
$productCollection = Mage::getModel('catalog/product')->getCollection()
->setStoreId($this->getStoreId())
->addIdFilter($this->_productIds)
->addAttributeToSelect(Mage::getSingleton('sales/quote_config')->getProductAttributes())
->addOptionsToResult()
->addStoreFilter()
->addUrlRewrite()
->addTierPriceData();
Run Code Online (Sandbox Code Playgroud)
这个问题是,以下行:
->addAttributeToSelect(Mage::getSingleton('sales/quote_config')->getProductAttributes())
Run Code Online (Sandbox Code Playgroud)
这将只获得Config.xml中为报价项定义的属性:
<quote>
<item>
<product_attributes>
<sku/>
<type_id/>
<name/>
<status/>
<visibility/>
<price/>
<weight/>
<url_path/>
<url_key/>
<thumbnail/>
<small_image/>
<tax_class_id/>
<special_from_date/>
<special_to_date/>
<special_price/>
<cost/>
<is_recurring/><!-- for totals calculation, placing and processing order -->
<recurring_profile/><!-- for placing order -->
<gift_message_available/>
</product_attributes>
</item>
</quote>
Run Code Online (Sandbox Code Playgroud)
这将无法获得我想要的新自定义属性,并且该规则永远无法正确地将数据与期望值进行比较.
将以下xml添加到我的自定义销售模块config.xml中,其中有一些观察者用于解决其他问题.
<sales>
<quote>
<item>
<product_attributes>
<exclude_from_coupon/>
</product_attributes>
</item>
</quote>
</sales>
Run Code Online (Sandbox Code Playgroud)
这一切都有效!
为什么它在magento的企业版中有效
真的不知道.我认为Enterprise可能正在寻找实际属性定义的设置,并将其包含在要收集的属性列表中,然后返回它的数据,我的猜测.我将对此进行研究,并将其更新到帖子中.
至少我现在知道真正的问题是什么,以及购物车规则条件(优惠券)失败的原因.
感谢所有帮助我提出一些好问题和建议的人.
与magento相比,另一天更聪明......