कार्ट में केवल एक उत्पाद की अनुमति कैसे दें?


18

हमारे पास एक आवश्यकता है, जिसमें एक ग्राहक को एक बार में केवल एक उत्पाद को कार्ट में जोड़ने की अनुमति दी जाएगी। हालाँकि वह उस उत्पाद की कोई भी मात्रा जोड़ सकता है।

यदि कार्ट में कोई उत्पाद पहले से मौजूद है तो मैं किसी उत्पाद को कार्ट में जोड़ने से कैसे रोक सकता हूं?

क्या कोई इस पर मदद कर सकता है?


1
मुझे लगता है कि यह वही है जो आपको चाहिए: crearegroup-ecommerce.co.uk/blog/magento-tips/… अन्य विकल्प उत्पाद को जोड़ने और एक कस्टम ईवेंट को आग लगाने के लिए कार्रवाई को फिर से लिखना है checkout_cart_product_add_before , उदाहरण के लिए markshustro/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मेरे लिए पहला है! अच्छी तरह से किया।
१।

4
@ एफिल्विंक यह कार्ट में जोड़ने से पहले किसी भी चीज के लिए बहुत उपयोगी है। मुझे लगता है कि यह बहुत सी चीटियों से छूट जाता है क्योंकि एक सामान्य grep केवल Mage का उत्पादन करता है :: dispatchEvent ($ eventName, पूर्ववर्ती पंक्ति $ घटना याद आ रही है = Sprintf ('कैटलॉग_प्रोडक्ट_t_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>

याद रखें कि आपको <depends>Mage_Checkout</depends>इसके 'पूर्वनिर्धारित सिस्टम कॉन्फ़िगरेशन' पर पिगबैक करने के लिए अपने मॉड्यूल को सेट करने की आवश्यकता है ।


बहुत बहुत धन्यवाद, आपका जवाब "वास्तव में फैंसी" है, लेकिन फोमन का जवाब उस चीज के अनुरूप था जो मैं पहले से ही कोशिश कर रहा था, इसलिए स्वीकार किया कि उत्तर के रूप में। लेकिन अगर मैंने पर्यवेक्षकों का उपयोग शुरू नहीं किया है, तो मैं आपकी विधि का उपयोग करूंगा :)।
शतहिश

1
बेशक! @ ओफ़ोमैन सही था - यह मेरे लिए भी शैक्षिक था, :)
फिलवंकल

2

एक संभावित तरीका Mage_Checkout_CartController के AddAction को फिर से लिखना है।

इसलिए जांच लें कि क्या कार्ट में कोई उत्पाद पहले से मौजूद है और यदि हाँ एक उपयुक्त त्रुटि संदेश दिखाते हैं। यदि आप उस पैरेंट मेथड को कॉल नहीं कर सकते हैं जो पूरी ऐड-प्रोसेस कर रहा है:

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

मुझे खेद है, $this->_goBack();काम नहीं कर रहा है! मैं इस स्थिति में पहुंच जाता हूं लेकिन उत्पाद अभी भी जुड़ रहा है।
शतहिश

क्या होता है यदि आप उस बिंदु से बाहर निकलते हैं, तो बस डिबग करने के लिए कि वास्तव में क्या हो रहा है, क्योंकि पूरी AddAction प्रक्रिया को निष्पादित नहीं किया जाना चाहिए
टोबियास

उस बिंदु से बाहर निकलने पर मुझे खाली स्क्रीन देने पर निष्पादन
शतीश

लेकिन क्या यह उत्पाद जोड़ता है?
तोबियों

3
कृपया ओह, कृपया नियंत्रकों को फिर से न
लिखें

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' विशेषता को झूठे के पास भेज दिया जाता है।

ध्यान दें कि यह परीक्षण नहीं किया गया है और केवल एक विचार है। यदि आपका टेम्पलेट$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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.