Як дозволити в кошику лише один товар?


18

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

Як я можу запобігти доданню товару у кошик, якщо в кошику вже є продукт?

Може хтось допоможе в цьому?


1
Я думаю, що це те, що вам потрібно: crearegroup-ecommerce.co.uk/blog/magento-tips/… Інший варіант - переписати дію для додавання продукту та запустити там спеціальну подію checkout_cart_product_add_before , наприклад markshust.com/2012/
08/27

@enenen: це здорово, але як я можу не допустити додавання продукту до кошика у цього спостерігача?
Шатіш

Відповіді:


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>

Потім у вашому класі спостерігача

<?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 дуже корисно для будь-чого перед тим, як додати в кошик. Я думаю, що його пропускають із багатьох шахрайських таблиць, тому що звичайний греп створює лише Mage :: dispatchEvent ($ eventName, відсутній попередній рядок $ eventName = sprintf ('catalog_product_type_prepare_% s_options', $ processMode);
Kristof у Fooman

добре, що працювало як шарм.
Deepanshu Goyal

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>для свого модуля, щоб виправити його за попередньо визначеною конфігурацією системи.


Велике спасибі, ваша відповідь "дійсно фантазії", але відповідь Фомана відповідала тому, що я вже намагався, тому прийняв це як відповідь. Але якби я не почав використовувати спостерігачів, я б застосував ваш метод :).
Шатіш

1
Звичайно! @fooman був прав на - це теж було для мене навчальним :)
philwinkle

2

Можливий спосіб - переписати додавання Mage_Checkout_CartController.

Тому перевірте, чи в кошику вже є продукт, і якщо так, покажіть відповідне повідомлення про помилку. Якщо ні, ви можете зателефонувати до батьківського методу, який виконує повний додаток:

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

Вибачте, $this->_goBack();не працює! Я потрапляю в стан if, але продукт все ще додається.
Шатіш

Що станеться, якщо ви просто вийдете з цього моменту, просто налагодити те, що відбувається насправді, тому що весь процес додавання не повинен виконуватися
Tobias

даючи вихід у цей момент, виходить з казни, даючи мені порожній екран
Шатіш

але чи додає продукт?
Тобіас

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

Я вже намагаюся з checkout_cart_product_add_afterподіями, питання полягає в тому, як я можу запобігти додаванню продукту в кошик?
Шатіш

або якщо він уже доданий, як його видалити?
Шатіш

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

}

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.