Come consentire un solo prodotto in un carrello?


18

Abbiamo un requisito, in cui un cliente sarà autorizzato ad aggiungere un solo prodotto al carrello. Tuttavia, può aggiungere qualsiasi quantità di quel prodotto.

Come posso impedire l'aggiunta di un prodotto al carrello se è già presente un prodotto nel carrello?

Qualcuno può aiutare su questo?


1
Penso che questo sia ciò di cui hai bisogno: crearegroup-ecommerce.co.uk/blog/magento-tips/… L'altra opzione è riscrivere l'azione per aggiungere un prodotto e lanciare un evento personalizzato checkout_cart_product_add_before lì, ad esempio markshust.com/2012/
08/27

@enenen: è fantastico, ma come posso impedire al prodotto di essere aggiunto al carrello in quell'osservatore?
Shathish,

Risposte:


20

Gli eventi catalog_product_type_prepare_full_optionse catalog_product_type_prepare_lite_optionssono i tuoi amici

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

Quindi nella tua classe 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è il primo per me! ben fatto.
Filwinkle,

4
@philwinkle è molto utile per qualsiasi cosa prima di aggiungere al carrello. Penso che manchi un sacco di trucchi perché un grep normale produce solo Mage :: dispatchEvent ($ eventName, manca la riga precedente $ eventName = sprintf ('catalog_product_type_prepare_% s_options', $ processMode);
Kristof at Fooman,

bene che ha funzionato come un fascino.
Deepanshu Goyal,

Fooman, mi grts
Amit Bera

8

Invece di riscrivere un controller (per favore, oh, per favore, non farlo), piuttosto, riscrivi il addProductmetodo per tenere conto del limite:

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

Se vuoi divertirti, sostituisci quanto 1sopra con Mage::getStoreConfig('checkout/options/max_cart_qty)e imposta il seguente config.xml del tuo modulo:

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

Tale valore è ora controllato tramite il valore XML. Se vuoi diventare davvero molto fantasioso , aggiungi questo al system.xml del tuo nuovo modulo:

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

Ricorda che devi impostare a <depends>Mage_Checkout</depends>sul tuo modulo per poter eseguire il piggyback sulla sua 'configurazione di sistema predefinita.


Grazie mille, la tua risposta è "davvero stravagante", ma la risposta di Fooman era in linea con quello che stavo già provando, quindi ho accettato che la risposta. Ma se non avessi iniziato a usare gli osservatori, avrei usato il tuo metodo :).
Shathish,

1
Ovviamente! @fooman aveva ragione: anche questo era educativo per me :)
Philwinkle,

2

Un modo possibile è riscrivere l'addAction di Mage_Checkout_CartController.

Quindi controlla se c'è già un prodotto nel carrello e se sì mostra un messaggio di errore appropriato. In caso contrario, puoi chiamare il metodo parent che sta eseguendo il processo di aggiunta completo:

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

Mi dispiace, $this->_goBack();non funziona! Ottengo la condizione if ma il prodotto viene ancora aggiunto.
Shathish,

Cosa succede se esci da quel punto, solo per eseguire il debug di ciò che sta realmente accadendo, perché l'intero processo addAction non dovrebbe essere eseguito
Tobias,

dare l'uscita a quel punto esce dall'esecuzione dandomi uno schermo vuoto
Shathish,

ma aggiunge il prodotto?
Tobias,

3
per favore oh per favore non riscrivere i controller
Philwinkle

1

Penso che tu possa usare un osservatore e i seguenti eventi saranno utili per verificare le condizioni che desideri. (Forse alcuni degli eventi potrebbero non essere presenti nella versione di Magento in uso).

checkout_cart_save_before

checkout_cart_product_add_after

checkout_cart_update_items_before

checkout_cart_update_items_after

checkout_cart_save_after

Sto già provando con l' checkout_cart_product_add_afterevento, la domanda è: come posso evitare che il prodotto venga aggiunto al carrello?
Shathish,

o se è già stato aggiunto, come rimuoverlo?
Shathish,

1

Forse un po 'di un'idea sul campo a sinistra, ma che ne dici di usare l' catalog_product_is_salable_afterevento?

Quello che puoi fare qui è controllare se il prodotto è nel carrello o se c'è un altro prodotto nel carrello. Quando c'è un altro prodotto nel carrello aggiorna l'attributo 'is_salable' dell'oggetto 'vendibile' passato all'osservatore su false.

NOTA che questo non è stato testato ed è solo un'idea. Non funzionerà se il modello non verifica$product->isSaleable()prima di visualizzare il pulsante. Rimuoverebbe anche il pulsante e non arresterebbe effettivamente il processo di aggiunta se l'utente fosse in grado di indovinare l'URL.


1

So che questo argomento è qualcosa di vecchio, ma ho avuto un problema simile. Voglio un solo articolo nel carrello e se il cliente ne aggiunge uno nuovo, voglio sostituire quello vecchio con quello nuovo. Quindi ho la precedenza su addAction (descritto qui in questo modo:

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

}

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.