如何防止Magento删除分组项目

时间:2013-09-24 09:08:09

标签: php magento observers

我已经成功创建了一个包含4个产品的分组产品,并且一切正常。但是,其中一个项目是免费项目,仅在购买分组产品时可用。我的问题是,当我去篮子时,我可以编辑它并删除一些项目。如果有人从购物篮编辑分组产品并抛出消息,是否有办法删除免费项目,这可能吗?

我正在使用Magento v1.3.2.4

更新

我还有问题!使用Marius的建议,我在app / etc / modules /

中创建了一个名为FreePins的自定义模块,其中包含以下代码
<?xml version="1.0"?>
<config>
    <modules>
        <test_FreePins>
            <active>true</active>
            <codePool>local</codePool>
        </test_FreePins>
    </modules>
</config>

我在app / code / local / test / FreePins / etc / config.xml中创建并添加了以下内容

    <?xml version="1.0" encoding="UTF-8"?>
<config>
    <modules>
        <test_FreePins>
            <version>0.1.0</version>
        </test_FreePins>
    </modules>
    <global>
    </global>
    <frontend>
        <events>
                <sales_quote_remove_item>
                    <observers>
                        <test_FreePins>
                                <class>test_FreePins/observer</class>
                                <method>removeFreeItems</method>
                        </test_FreePins>
                    </observers>
                </sales_quote_remove_item>
        </events>
    </frontend>
</config>

最后,我在app / code / local / test / FreePins / Model / Observer.php中的Observer类中有以下内容

<?php

class test_FreePins {

    public function removeFreeItems($observer) {
        $quoteItem = $observer->getEvent()->getQuoteItem();
        $productId = $quoteItem->getProductId();

        print_r($productId);

        if($productId != 238 || $productId != 22 || $productId != 4) {
            return $this;
        }
    }

}

?>

我不完全确定这是否正确,因为我添加后无法从我的篮子中移除物品。如果我在模块配置中注释掉Frontend标签,该网站可以运行,但我的功能没有运行,有人可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

您可以为事件sales_quote_remove_item创建观察者。在该检查中,删除的项目是否是分组产品的一部分。如果是,也要删除免费产品 像这样的东西(用模块名称替换[module]): 在您的模块的config.xml中,将其添加到<frontend>标记内。

<events>
    <sales_quote_remove_item>
       <observers>
           <[module]>
               <class>[module]/observer</class>
                   <method>removeFreeItems</method>
           </[module]
       </observers>
    </sales_quote_remove_item>
</events>

在您的观察者类中添加此方法:

public function removeFreeItems($observer){
   $quoteItem = $observer->getEvent()->getQuoteItem();
   $productId = $quoteItem->getProductId();
   if (the $productId is not part of the grouped product){//add logic here
        return $this;//stop here
   }
   foreach ($quoteItem->getQuote()->getAllItems() as $item){
       if ($item is free){//add your logic here
           $item->isDeleted(true);
       }
    }
}

答案 1 :(得分:0)

您可以使用“购物车价格规则”来完成此操作。但是,如果您使用这种方法,该项目将以购物车中的全价显示,并将应用折扣。如果你可以忍受,那么这是如何做到的:

  1. 由于您无法转发有关产品ID的规则,因此我们需要创建一个新的隐藏类别(导航中未使用或停用的类别),您可以在其中添加捆绑产品
  2. 创建另一个隐藏类别,您可以在其中添加应该免费的项目
  3. 创建一个新的“购物车价格规则”,没有优惠券和高优先级(0是最高的)
  4. 根据条件添加“产品属性组合”,然后选择“产品属性 - >类别”
  5. 作为类别使用您之前创建的类别与您的包
  6. 在“操作”标签上选择“产品价格折扣百分比”并将折扣金额设置为“100”
  7. 在“仅将规则应用于符合以下条件的购物车商品”下的相同标签上(对所有商品保留空白)“再次选择”产品属性组合“,然后选择”产品属性 - >类别“,但现在选择带有“免费项目”的类别。
  8. 您添加捆绑购物车后立即完成,将应用并显示折扣。