如何在购物车中只允许一种产品?


18

我们有一个要求,即一次允许客户仅将一种产品添加到购物车中。但是他/她可以添加任意数量的该产品。

如果购物车中已经有产品,如何防止产品添加到购物车?

有人可以帮忙吗?


1
我认为这就是您所需要的:crearegroup-ecommerce.co.uk/blog/magento-tips/…另一个选择是重写添加产品的操作并在其中触发自定义事件checkout_cart_product_add_before ,例如markhust.com/2012/
08/27

@enenen:太酷了,但是如何阻止该产品被添加到该观察者的购物车中?
2013年

Answers:


20

事件catalog_product_type_prepare_full_optionscatalog_product_type_prepare_lite_options是你的朋友

<?xml version="1.0"?>
<config>
    <modules>
        <Fooman_Example>
            <version>0.1.0</version>
        </Fooman_Example>
    </modules>
    <global>
        <models>
            <fooman_example>
                <class>Fooman_Example_Model</class>
            </fooman_example>
        </models>
        <helpers>
            <fooman_example>
                <class>Fooman_Example_Helper</class>
            </fooman_example>
        </helpers>
    </global>
    <frontend>
        <events>
            <catalog_product_type_prepare_full_options>
                <observers>
                    <fooman_example_catalog_product_type_prepare>
                        <class>Fooman_Example_Model_Observer</class>
                        <method>catalogProductTypePrepare</method>
                    </fooman_example_catalog_product_type_prepare>
                </observers>
            </catalog_product_type_prepare_full_options>
        </events>
    </frontend>
</config>

然后在您的Observer类中

<?php

class Fooman_Example_Model_Observer
{
    public function catalogProductTypePrepare($observer)
    {
        $quote = Mage::getSingleton('checkout/session')->getQuote();
        if($quote->getItemsCount()>=1){
            Mage::throwException('You can only buy one product at a time.');
        }
    }
}

catalog_product_type_prepare_lite_options对我来说是第一个!做得很好。
philwinkle

4
@philwinkle在将其添加到购物车之前,它可以非常方便地进行任何操作。我认为它已经从很多备忘单中丢失了,因为普通的grep只产生Mage :: dispatchEvent($ eventName,缺少前一行$ eventName = sprintf('catalog_product_type_prepare_%s_options',$ processMode);
Kristof在Fooman,

像魅力一样运作良好。
Deepanshu Goyal

Fooman,这让我感到厌烦
Amit Bera

8

不要重写控制器(请不要这样做),而是重写addProduct方法以解决限制:

class YourCompany_YourModule_Model_Cart extends Mage_Checkout_Model_Cart
{
    public function addProduct($productInfo, $requestInfo=null){
        if($this->getItemsCount()>1){
            Mage::throwException(Mage::helper('checkout')->__('Cannot add item - cart quantity would exceed checkout the limit of %s per person.', 1));
        }
        parent::addProduct($productInfo, $requestInfo);
    }
}

如果想花哨的话,请用替换1上面的内容,Mage::getStoreConfig('checkout/options/max_cart_qty)并设置以下模块的config.xml:

<default>
    <checkout>
        <options>
            <max_cart_qty>1</max_cart_qty>
        </options>
    </checkout>
</default>

现在可以通过XML值控制该值。如果您真的花哨的话,请将其添加到新模块的system.xml中:

<config>
    <sections>
        <checkout>
            <groups>
                <options>
                    <fields>
                        <max_cart_qty translate="label">
                            <label>Maximum Quantity Allowed in Cart (total qty)</label>
                            <frontend_type>text</frontend_type>
                            <sort_order>100</sort_order>
                            <show_in_default>1</show_in_default>
                        </max_cart_qty>
                    </fields>
                </options>
            </groups>
        </checkout>
    </sections>
</config>

请记住,您需要为<depends>Mage_Checkout</depends>模块设置a ,以便搭载其预定义的系统配置。


非常感谢,您的回答“真是太花哨了”,但是Fooman的回答与我已经尝试过的一致,因此接受了它作为答案。但是,如果我还没有开始使用观察者,那么我会使用您的方法:)。
2013年

1
当然!@fooman是正确的-这对我也是有教育意义的:)
philwinkle

2

一种可能的方法是重写Mage_Checkout_CartController的addAction。

因此,请检查购物车中是否已有产品,如果显示,则显示相应的错误消息。如果没有,您可以调用正在执行完整添加过程的父方法:

    if (count($this->_getCart()->getProductIds()) > 0) {
        $this->_goBack();
    } else {
        parent::addAction();
    }

对不起,$this->_goBack();不起作用!我进入if条件,但是产品仍在添加中。
Shathish 2013年

如果您仅在此时退出,只是调试实际情况,会发生什么情况,因为不应执行整个addAction流程
Tobias

在该点给出退出将退出执行,这给了我一个空白画面
Shathish 2013年

但是会添加产品吗?
Tobias

3
请哦,请不要重写控制器
philwinkle 2013年

1

我认为您可以使用观察者,并且以下事件将对检查所需条件很有用。(也许某些事件可能不在您使用的Magento版本中)。

checkout_cart_save_before

checkout_cart_product_add_after

checkout_cart_update_items_before

checkout_cart_update_items_after

checkout_cart_save_after

我已经在尝试checkout_cart_product_add_after事件了,问题是如何防止产品添加到购物车中?
2013年

或如果已添加,如何将其删除?
2013年

1

也许有点左领域的想法,但如何使用该catalog_product_is_salable_after事件?

您可以在此处检查商品是否在购物车中或购物车中是否有其他商品。当购物车中还有其他产品时,请将传递给观察者的'salable'对象的'is_salable'属性更新为false。

注意,这尚未测试,仅是一个想法。如果您的模板$product->isSaleable()在显示按钮之前未检查,它将失败。如果用户能够猜到URL,它也只会删除按钮,而不会真正停止添加过程。


1

我知道这个话题有点老了,但是我有一个类似的问题。我只想要购物车中的一项,如果客户添加了新项,我想用新项替换旧项。所以我重写的addAction(形容这里是这样的:

public function addAction(){
    $items = $this->_getCart()->getItems();
            foreach ($items as $item)
                    {
                            $itemId = $item->getItemId();
                            $this->_getCart()->removeItem($itemId);
                    }
    parent::addAction();

}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.