Как добавить в корзину только один товар?

18

У нас есть требование, согласно которому клиенту будет разрешено добавлять только один продукт в корзину за раз. Однако он / она может добавить любое количество этого продукта.

Как я могу предотвратить добавление товара в корзину, если в корзине уже есть товар?

Может ли кто-нибудь помочь в этом?

Shathish
источник
1
Я думаю, что это то, что вам нужно: crearegroup-ecommerce.co.uk/blog/magento-tips/… Другой вариант - переписать действие для добавления продукта и запустить там пользовательское событие checkout_cart_product_add_before , например markshust.com/2012/.
08/27
@enenen: это круто, но как я могу предотвратить добавление продукта в корзину в этом наблюдателе?
Shathish

Ответы:

20

События catalog_product_type_prepare_full_optionsи catalog_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);
Кристоф в Fooman
хорошо, что работал как шарм.
Дипаншу Гоял
Fooman, это grts меня
Амит Бера
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>

Помните, что вам нужно установить a <depends>Mage_Checkout</depends>для вашего модуля, чтобы использовать его предопределенную конфигурацию системы.

philwinkle
источник
Большое спасибо, ваш ответ "действительно фантастический", но ответ Фумана соответствовал тому, что я уже пробовал, поэтому принял это как ответ. Но если бы я не начал использовать наблюдателей, я бы использовал ваш метод :).
Шатиш
1
Конечно! @fooman был прав - это было для меня тоже
познавательно
2

Возможный способ - переписать addAction в Mage_Checkout_CartController.

Поэтому проверьте, есть ли уже продукт в корзине, и если да, покажите соответствующее сообщение об ошибке. Если нет, вы можете вызвать родительский метод, который выполняет полный процесс добавления:

    if (count($this->_getCart()->getProductIds()) > 0) {
        $this->_goBack();
    } else {
        parent::addAction();
    }
Тобиас
источник
Извините, $this->_goBack();не работает! Я попал в условие if, но продукт все еще добавляется.
Shathish
Что произойдет, если вы просто выйдете в этот момент, просто чтобы отладить то, что действительно происходит, потому что весь процесс addAction не должен выполняться
Тобиас
давая выход в этот момент выход из казни, давая мне пустой экран
Shathish
но это добавляет продукт?
Тобиас
3
пожалуйста ой пожалуйста не переписывайте контроллеры
philwinkle
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
Sukeshini
источник
Я уже пробую с checkout_cart_product_add_afterсобытием, вопрос в том, как я могу предотвратить добавление товара в корзину?
Shathish
или если он уже добавлен, как его убрать?
Shathish
1

Может быть, немного левая идея, но как насчет использования catalog_product_is_salable_afterсобытия?

Здесь вы можете проверить, есть ли товар в корзине или в нем есть другой товар. Когда в корзине есть другой товар, обновите атрибут is_salable объекта 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();

}

www.abo-killer.de
источник