2012-02-08 115 views
1

我们添加了“是/否”产品属性,标记为:“允许此产品应用优惠券?”默认值为“是”。购物车做相反的规则

这样做的原因是,我们不希望销售团队给予某些核心产品的可用成千上万的折扣。

我们可以将这些产品作为SKU的增加创造了千元的优惠券中的每一个,但可以再由事故发生变化,或者通过销售团队创建券不当上市。

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

enter image description here

当我测试的Magento的1.5,社区版的规则,它不会完全的条件说的正好相反。

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

当我在购物车中一个产品,是具有此属性设置为“否”,我申请优惠券代码产品,它接受优惠券代码。在另一个系统(企业)它拒绝它,因为它应该。

有没有人遇到过这个?

UPDATE: 好吧,这只是得到更有趣。 当我遍历Rule类时,产品已通过,但产品属性未通过。范围设置为网站,我确实检查了它是否保存在后端的范围内。

这真是奇怪......

在企业制度,产品属性,使用相同的配置和数据即将通过。

我甚至试图没有双重否定,与另一个新的属性,以确保。 针对以下规则运行时,优惠券被拒绝:“优惠券代码无效。” 这是正确的,因为该产品设置为“可以使用优惠券?=否”。

enter image description here

但问题是,我不想做对所有的其他产品进行检查,而是反对,已被标记为“否”的寥寥无几。

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

这是一个双重否定规则,不管你看它哪一种方式。

通过validate()函数,当我第二次添加产品时,我通过了/app/code/core/Mage/SalesRule/Model/Rule/Condition/Product.php,并且数据显示在属性,但是当我去和重新应用优惠券,并再次通过这个函数,这些值都消失了。这很奇怪。

当增加新产品购物车: before Adding Coupon

当重新申请优惠券代码: after re-applying coupon

凡赫克做了描述和其他一些属性的消失?

UPDATE NOTE我越来越接近了。 当我更改以下验证在 “/app/code/core/Mage/SalesRule/Model/Rule/Condition/Product.php”()函数从以下方面:

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

然后它工作正常!

回答

6

发现了实际问题,这里是我所做的解决方案:

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

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

罪魁祸首是这一行:$ product = $ object-> getProduct();

从“报价/项目/摘要”中调用一行。PHP”是:$产品= $这个 - > _的getData( '产品');

它只是从系统得到缓存数据,而由一个选择这样的:

$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

真的不知道工作。我认为企业可能正在寻找关于实际属性定义的设置,并将其包括到要收集的属性列表中,然后为其返回数据,我的猜测。我会研究,并在这里更新到帖子。

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

感谢所有那些帮助过我一些很好的问题和建议。

另一个明智的与magento ...

+0

你刚救了我的命,男人! – 2012-09-17 16:28:28

0

我测试了这与Magento CE 1.5.1.0并不能重现您的问题。对我而言,它有效。

请重新检查你的CE安装如下:

  • 您设置的默认属性值“是”
  • 你做了重新编制索引的要求。
  • 您编辑了一个测试产品并明确地将属性值设置为“no”。
  • (只是可以肯定)你更新了缓存。
  • 您完全按照上面所述设置购物车价格规则(如果条件为FALSE并且allow设置为NO,则应用)。

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

如果仍然不工作:

  • 如果你改写的条件,只有当所有条件都为TRUE,并允许设置为TRUE(不去除双重否定这是比较复杂的)申请,会发生什么?
  • 请张贴购物车价格规则,产品属性和产品的后端表单截图。
+0

我检查了你的观点,一切都按照你在建议的要点完成。将检查双重否定。 – ShaunOReilly 2012-02-09 04:57:37

+0

没有双重否定的工作,但是这个规则永远不会为我们工作。但是我也需要找出为什么我没有得到属性中代码的价值。我认为规则系统不是怪罪,而是获取Attribute的值的位:return $ this-> validateAttribute($ object-> getData($ this-> getAttribute())); - 即使设置了默认值,也会返回null。 – ShaunOReilly 2012-02-09 05:31:53

+1

1.5和1.9实例之间的数据库表“eav_attribute”或“catalog_eav_attribute”中的属性属性有任何区别吗? – Vinai 2012-02-09 07:35:06