购物车规则相反

Posted

技术标签:

【中文标题】购物车规则相反【英文标题】:Shopping cart Rules doing the opposite 【发布时间】:2012-03-01 10:46:45 【问题描述】:

我们添加了一个“是/否”产品属性,标记为:“允许此产品应用优惠券吗?”默认值为“yes”。

这样做的原因是,我们从不希望销售团队在数以千计的可用产品中对某些核心产品给予折扣。

我们可以将这些产品作为 SKU 添加到创建的一千张优惠券中的每一张中,但这可能会被意外更改,或者被创建优惠券的销售团队不正确地列出。

因此,我们要求他们将此规则添加到他们的新优惠券中,以排除这些产品。我们还通过代码更新了所有其他优惠券,以包含此规则。

当我在 Magento 1.5 社区版上测试规则时,它的作用与条件完全相反。

当我在我们的其他企业解决方案(magento 1.9)上测试相同的规则时,它实际上做了它应该做的事情。

当我在购物车中有一个产品,该属性设置为“否”的产品,并且我应用优惠券代码时,它会接受优惠券代码。在另一个系统(企业)上,它应该拒绝它。

还有其他人遇到过这个吗?

更新: 好的,这变得更有趣了。 当我单步执行规则类时,产品通过了,但产品属性没有通过。范围设置为网站,我确实检查了它是否保存在后端的该范围下。

这真的很奇怪......

在企业系统上,产品属性,配置和数据相同。

我什至尝试不使用双重否定,并使用另一个新属性来确保。 违反以下规则,优惠券被拒绝:“优惠券代码无效。” 这是正确的,因为产品设置为“可以使用优惠券吗?= 否”。

但问题是我不想检查所有其他产品,而是检查那些被标记为“否”的少数产品。

无论如何,这对我们不起作用,因为如果购物车中有任何产品的属性“可以使用优惠券吗?”的值为“否”,我们不想应用优惠券。

这是一个双重否定的规则,不管你怎么看。

我通过validate()函数遍历/app/code/core/Mage/SalesRule/Model/Rule/Condition/Product.php,当第二次添加产品时,数据显示在属性中,但是当我去重新申请优惠券,并再次单步执行此功能时,这些值就消失了。这很奇怪。

将新产品添加到购物车时:

重新申请优惠码时:

描述和其他一些属性到底消失在哪里了?

更新说明我离我越来越近了。 当我从以下更改“/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);

到这里:

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);

然后就可以正常使用了!

【问题讨论】:

【参考方案1】:

找到了实际的问题,这是我为解决方案所做的:

以下位获取购物车价格规则的产品数据:

        if ($object->getProduct() instanceof Mage_Catalog_Model_Product) 
            $product = $object->getProduct();
         else 
            $product = Mage::getModel('catalog/product')
                ->load($object->getProductId());
        

罪魁祸首是这行:$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();

问题在于,下面这行:

->addAttributeToSelect(Mage::getSingleton('sales/quote_config')->getProductAttributes())

这将只获得在 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>

这将无法获得我想要的新自定义属性,并且规则将永远无法正确地将数据与预期值进行比较。

将以下 xml 添加到我的自定义销售模块 config.xml 中,其中包含一些其他内容的观察者,可以解决问题。

<sales>
    <quote>
        <item>
            <product_attributes>
                <exclude_from_coupon/>
            </product_attributes>
        </item>
    </quote>                
</sales>

然后一切正常!

为什么它在企业版的 magento 中有效

真的不知道。我认为 Enterprise 可能正在寻找实际属性定义的设置,并将其包含到要收集的属性列表中,然后返回它的数据,我猜。我会对此进行研究,并在此处将其更新到帖子中。

至少我现在知道真正的问题是什么,以及购物车规则条件(优惠券)失败的原因。

感谢所有帮助我提出一些好的问题和建议的人。

用 magento 又是明智的一天......

【讨论】:

【参考方案2】:

我使用 Magento CE 1.5.1.0 对此进行了测试,但无法重现您的问题。对我来说,它有效。

请为您的 CE 安装重新检查以下内容:

您将默认属性值设置为“是” 您确实根据需要重新索引了索引。 您编辑了一个测试产品并将属性值明确设置为“no”。 (只是为了确定)您更新了缓存。 您完全按照上述说明设置购物车价格规则(如果条件为 FALSE 且允许设置为 NO,则应用)。

如果您没有任何自定义代码干扰,这应该可以工作。它在默认安装中。

如果还是不行:

如果您将条件改写为仅在所有条件为 TRUE 且允许设置为 TRUE 时才应用会发生什么情况(是否删除了更复杂的双重否定)? 请发布购物车价格规则、产品属性和产品的后台表单截图。

【讨论】:

我检查了你的观点,一切都按照你在要点中的建议完成。将检查双重否定。 没有双重否定的工作,但规则永远不会对我们有用。但我还需要找出为什么我没有在通过属性的代码中获得值。我认为规则系统不是罪魁祸首,而是获取属性值的位: return $this->validateAttribute($object->getData($this->getAttribute())); - 即使设置了默认值,也会返回 null。 数据库表eav_attributecatalog_eav_attribute的属性属性在1.5和1.9实例之间有什么区别吗? 没有区别。我也查了资料,也是一样。我通过 validate() 函数逐步通过/app/code/core/Mage/SalesRule/Model/Rule/Condition/Product.php,添加产品时,数据显示在属性中,但是当我去申请时优惠券,然后再次单步执行此功能,这些值就消失了。这很奇怪。 @matthias,我认为您没有尝试向产品添加新属性、为其分配一个值并在您的规则中使用它,否则您会看到同样的问题

以上是关于购物车规则相反的主要内容,如果未能解决你的问题,请参考以下文章

关联规则与购物车比较

Magento 购物车价格规则小计不由某些类别组成

如何获取亚马逊购物车的内容?

从我的购物车中取消贝宝订阅

在 zen 购物车中添加商店名称以及产品

使用规则在 R 中使用重复项目进行购物篮分析