একটি কার্টে কেবল একটি পণ্যকে কীভাবে অনুমতি দেওয়া যায়?


18

আমাদের একটি প্রয়োজনীয়তা রয়েছে, যার মধ্যে একজন গ্রাহককে একবারে কার্টে কেবল একটি পণ্য যুক্ত করার অনুমতি দেওয়া হবে। তবে সে / সে পণ্যটির যে কোনও পরিমাণ যুক্ত করতে পারে।

কার্টটিতে ইতিমধ্যে একটি পণ্য উপস্থিত থাকলে আমি কীভাবে কোনও পণ্যকে কার্টে যুক্ত হওয়া থেকে আটকাতে পারি?

কেউ কি এতে সাহায্য করতে পারে?


1
আমি মনে করি এটি আপনার প্রয়োজন: ক্রেয়ারগ্রুপ- কৌমার্স.কম.বুক / ব্লগ / উপসাগর- টিপস/… অন্য বিকল্পটি হ'ল একটি পণ্য যুক্ত করার জন্য ক্রিয়াটি পুনর্লিখন করা এবং checkout_cart_product_add_before সেখানে একটি কাস্টম ইভেন্ট ফায়ার করা , উদাহরণস্বরূপ, মার্কশাস্ট.কম / ২০১২ /
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>

তারপরে আপনার অবজারভার ক্লাসে

<?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
@ ফিলিভিঙ্কল এটি কার্টে যুক্ত করার আগে যে কোনও কিছুর জন্য খুব কার্যকর হয়ে আসে। আমি মনে করি এটি প্রচুর চিট শিটগুলি থেকে হারিয়ে গেছে কারণ একটি সাধারণ গ্রেপ কেবল ম্যাজ :: ডিসপ্যাচইভেন্ট তৈরি করে (N ইভেন্টনাম, পূর্ববর্তী লাইনটি অনুপস্থিত $ ইভেন্টনাম = স্প্রিন্টফ ('ক্যাটালগ_প্রডেক্ট_টাইপ_প্রিপ্রে_% s_options', $ প্রসেসমোড);
ক্রিস্টফ

ভাল যে একটি কবজ মত কাজ।
দীপানশু গোয়েল

ফুমান, এটি আমাকে গ্রাট করে
অমিত বেরা

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>

সেই মানটি এখন এক্সএমএল মানের মাধ্যমে নিয়ন্ত্রণ করা। আপনি যদি সত্যই সত্যই অভিনব হতে চান তবে এটি আপনার নতুন মডিউলের 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

একটি সম্ভাব্য উপায় হ'ল ম্যাজ_চেকআউট_কার্টকন্ট্রোলারের অ্যাডাকশনটি পুনরায় লিখন।

সুতরাং কার্টে ইতিমধ্যে কোনও পণ্য আছে কিনা এবং হ্যাঁ একটি উপযুক্ত ত্রুটি বার্তা দেখায় কিনা তা পরীক্ষা করে দেখুন। যদি না হয় তবে আপনি মূল অ্যাড-প্রসেসটি সম্পন্ন প্যারেন্ট পদ্ধতিতে কল করতে পারেন:

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

আমি দুঃখিত, $this->_goBack();কাজ করে না! আমি যদি শর্তে প্রবেশ করি তবে পণ্যটি এখনও যুক্ত হচ্ছে।
শথিশ

আপনি যদি কেবলমাত্র সেই মুহূর্তে প্রস্থান করেন, তবে কী ঘটবে তা ঘটবে কেবল ডিবাগ করার জন্য, কারণ পুরো অ্যাডাকশন প্রক্রিয়াটি সম্পাদন করা উচিত নয়
টোবিয়াস

সেই সময়ে প্রস্থান
করানো

কিন্তু এটি কি পণ্য যুক্ত করে?
টোবিয়াস

3
দয়া করে ওহ দয়া করে নিয়ন্ত্রকদের পুনর্লিখন করবেন না
ফিলিউঙ্কল

1

আমি মনে করি আপনি একটি পর্যবেক্ষক ব্যবহার করতে পারেন এবং নীচের ইভেন্টগুলি আপনি কী চান তা চেক করতে দরকারী হবে। (সম্ভবত কিছু ইভেন্ট আপনি ব্যবহার করছেন এমন ম্যাজেন্টো সংস্করণে নাও থাকতে পারে)।

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ইভেন্ট দিয়ে চেষ্টা করছি , প্রশ্ন আমি কীভাবে পণ্যটিকে কার্টে যুক্ত হওয়া থেকে আটকাতে পারি?
Shathish

বা যদি এটি ইতিমধ্যে যুক্ত করা হয় তবে কীভাবে এটি সরিয়ে ফেলবেন?
শাতিশ

1

সম্ভবত কিছুটা বাম মাঠের ধারণা কিন্তু কীভাবে catalog_product_is_salable_afterইভেন্টটি ব্যবহার করবেন ?

আপনি এখানে যা করতে পারেন তা হ'ল পণ্যটি কার্টে রয়েছে কিনা বা কার্টে অন্য কোনও পণ্য রয়েছে কিনা তা পরীক্ষা করে দেখুন। কার্ট আপডেটে অন্য পণ্য উপস্থিত থাকলে 'বিক্রয়যোগ্য' অবজেক্টের 'is_salable' বৈশিষ্ট্যটি দর্শকের কাছে মিথ্যা হয়ে যায়।

লক্ষ্য করুন যে এটি পরীক্ষা করা হয়নি এবং এটি কেবল একটি ধারণা। যদি আপনার টেম্পলেটটি$product->isSaleable()বোতামটি প্রদর্শনের আগেপরীক্ষা না করে তবে এটি ব্যর্থ হবে। এটি কেবলমাত্র বোতামটি সরিয়ে ফেলবে এবং ব্যবহারকারীর ইউআরএল অনুমান করতে সক্ষম হলে অ্যাড প্রক্রিয়াটি বন্ধ করবে না।


1

আমি জানি এই বিষয়টি পুরানো কিছু, তবে আমারও একই সমস্যা ছিল। আমি কার্টে কেবল একটি আইটেম চাই এবং গ্রাহক যদি একটি নতুন যুক্ত করেন, আমি পুরানোটি নতুন সাথে প্রতিস্থাপন করতে চাই। সুতরাং আমি অ্যাডঅ্যাকশনটিকে ওভাররাইড করব ( এখানে এখানে বর্ণিত :

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

}

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.