Jak zezwolić tylko na jeden produkt w koszyku?

18

Mamy wymaganie, aby klient mógł dodawać tylko jeden produkt do koszyka na raz. Może jednak dodać dowolną ilość tego produktu.

Jak mogę zapobiec dodaniu produktu do koszyka, jeśli w koszyku jest już produkt?

Czy ktoś może w tym pomóc?

Shathish
źródło
1
Myślę, że właśnie tego potrzebujesz: crearegroup-ecommerce.co.uk/blog/magento-tips/ ... Inną opcją jest przepisanie akcji dodawania produktu i uruchomienie tam niestandardowego zdarzenia checkout_cart_product_add_before , np. Markshust.com/2012/
08/27
@enenen: fajnie, ale jak mogę zapobiec dodawaniu produktu do koszyka w tym obserwatorze?
Shathish

Odpowiedzi:

20

Wydarzenia catalog_product_type_prepare_full_optionsi catalog_product_type_prepare_lite_optionssą twoimi przyjaciółmi

<?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>

Następnie w klasie 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.');
        }
    }
}
Kristof w Fooman
źródło
catalog_product_type_prepare_lite_optionsjest dla mnie pierwszy! ładnie wykonane.
philwinkle
4
@ philwinkle jest bardzo przydatny do wszystkiego tuż przed dodaniem do koszyka. Myślę, że jest pomijany z wielu ściągów, ponieważ normalny grep produkuje tylko Mage :: dispatchEvent ($ eventName, brakuje poprzedniej linii $ eventName = sprintf ('catalog_product_type_prepare_% s_options', $ processMode);
Kristof na Fooman
dobrze, że działało to jak urok.
Deepanshu Goyal,
Fooman, to mnie miesza
Amit Bera
8

Zamiast przepisać kontroler (proszę, nie rób tego), zamiast tego przepisz addProductmetodę, aby uwzględnić limit:

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

Jeśli chcesz się podobać, zamień 1powyższe na Mage::getStoreConfig('checkout/options/max_cart_qty)i ustaw następujące config.xml modułu:

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

Ta wartość jest teraz kontrolowana za pomocą wartości XML. Jeśli chcesz się naprawdę bardzo spodobać , dodaj to do pliku system.xml nowego modułu:

<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>

Pamiętaj, że musisz ustawić a <depends>Mage_Checkout</depends>dla swojego modułu, aby móc korzystać z jego predefiniowanej konfiguracji systemu.

philwinkle
źródło
Wielkie dzięki, twoja odpowiedź jest „naprawdę fantazyjna”, ale odpowiedź Foomana była zgodna z tym, co już próbowałem, więc zaakceptowałem to jako odpowiedź. Ale gdybym nie zaczął używać obserwatorów, użyłbym twojej metody :).
Shathish
1
Oczywiście! @fooman miał rację - to też było dla mnie
pouczające
2

Możliwym sposobem jest przepisanie addAction Mage_Checkout_CartController.

Sprawdź, czy w koszyku jest już produkt, a jeśli tak, pokaż odpowiedni komunikat o błędzie. Jeśli nie, możesz wywołać metodę nadrzędną, która wykonuje cały proces dodawania:

    if (count($this->_getCart()->getProductIds()) > 0) {
        $this->_goBack();
    } else {
        parent::addAction();
    }
Tobiasz
źródło
Przepraszam, $this->_goBack();nie działa! Wchodzę w warunek if, ale produkt wciąż się dodaje.
Shathish
Co się stanie, jeśli wyjdziesz w tym momencie, aby debugować, co się naprawdę dzieje, ponieważ cały proces addAction nie powinien zostać wykonany
Tobias
wyjście w tym momencie wychodzi z egzekucji dając mi pusty ekran
Shathish
ale czy to dodaje produkt?
Tobias
3
prosze oh prosze nie przepisywac kontrolerów
philwinkle 17.10.13
1

Myślę, że możesz użyć obserwatora, a następujące wydarzenia przydadzą się do sprawdzenia warunków, które chcesz. (Być może niektóre z wydarzeń mogą nie występować w używanej wersji 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
źródło
Już próbuję ze checkout_cart_product_add_afterzdarzeniem, pytanie brzmi: jak mogę zapobiec dodaniu produktu do koszyka?
Shathish
lub jeśli jest już dodany, jak go usunąć?
Shathish
1

Może trochę pomysł na lewe pole, ale co powiesz na wykorzystanie catalog_product_is_salable_afterwydarzenia?

Tutaj możesz sprawdzić, czy produkt znajduje się w koszyku lub czy w koszyku jest inny produkt. Gdy w aktualizacji koszyka znajduje się inny produkt, atrybut „is_salable” obiektu „nadającego się do sprzedaży” jest przekazywany obserwatorowi na false.

UWAGA: nie zostało to przetestowane i jest jedynie pomysłem. Nie powiedzie się, jeśli Twój szablon nie sprawdzi się$product->isSaleable()przed wyświetleniem przycisku. Spowoduje to również usunięcie przycisku i nie zatrzyma procesu dodawania, jeśli użytkownik będzie w stanie odgadnąć adres URL.

David Manners
źródło
1

Wiem, że ten temat jest czymś starym, ale miałem podobny problem. Chcę tylko jeden produkt w koszyku, a jeśli klient doda nowy, chcę wymienić stary na nowy. Zastępuję więc addAction (opisane tutaj tak:

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

}

www.abo-killer.de
źródło