จะอนุญาตให้มีเพียงหนึ่งผลิตภัณฑ์ในตะกร้าได้อย่างไร


18

เรามีข้อกำหนดที่ลูกค้าจะได้รับอนุญาตให้เพิ่มสินค้าเพียงหนึ่งรายการในรถเข็นในแต่ละครั้ง อย่างไรก็ตามเขา / เธอสามารถเพิ่มปริมาณของผลิตภัณฑ์ใด ๆ

ฉันจะป้องกันไม่ให้สินค้าใส่ในรถเข็นได้อย่างไรถ้ามีสินค้าอยู่ในตะกร้าแล้ว?

บางคนสามารถช่วยในเรื่องนี้?


1
ฉันคิดว่านี่คือสิ่งที่คุณต้องการ: crearegroup-ecommerce.co.uk/blog/magento-tips/ ......ตัวเลือกอื่นคือการเขียนการกระทำเพื่อเพิ่มผลิตภัณฑ์ใหม่และเริ่มเหตุการณ์ที่กำหนดเองที่checkout_cart_product_add_before นั่นเช่นmarkshust.com/2012/
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เป็นคนแรกสำหรับฉัน! ทำได้ดีมาก
philwinkle

4
@philwinkle มันมีประโยชน์มากสำหรับทุกอย่างก่อนที่จะสั่งซื้อ ฉันคิดว่ามันพลาดจาก cheatsheets มากมายเพราะ grep ปกติเพียงสร้าง Mage :: dispatchEvent ($ eventName ขาดบรรทัดก่อนหน้า $ eventName = sprintf ('catalog_product_type_prepare_% s_options', $ processMode);
Kristof at Fooman

ดีที่ทำงานเหมือนมีเสน่ห์
Deepanshu Goyal

Fooman มันทำให้ฉันเป็นทุกข์
Amit Bera

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>โมดูลของคุณเพื่อ piggyback ในการกำหนดค่าระบบที่กำหนดไว้ล่วงหน้า


ขอบคุณมากคำตอบของคุณคือ "แฟนซีจริง ๆ " แต่คำตอบของ Fooman นั้นสอดคล้องกับสิ่งที่ฉันพยายามอยู่แล้วดังนั้นยอมรับว่าเป็นคำตอบ แต่ถ้าฉันไม่ได้เริ่มใช้ผู้สังเกตการณ์ฉันจะใช้วิธีการของคุณ :)
Shathish

1
แน่นอน! @fooman ถูกต้อง - นี่คือการศึกษาสำหรับฉันเช่นกัน :)
philwinkle

2

วิธีที่เป็นไปได้คือการเขียน addAction ของ Mage_Checkout_CartController

ดังนั้นตรวจสอบว่ามีสินค้าอยู่ในตะกร้าแล้วและถ้าใช่แสดงข้อความแสดงข้อผิดพลาดที่เหมาะสม หากไม่ใช่คุณสามารถเรียกใช้เมธอดพาเรนต์ซึ่งกำลังทำกระบวนการเพิ่มทั้งหมด:

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

ฉันขอโทษ$this->_goBack();ไม่ทำงาน! ฉันได้รับเงื่อนไขว่า แต่ผลิตภัณฑ์ยังคงได้รับการเพิ่ม
Shathish

จะเกิดอะไรขึ้นถ้าคุณเพิ่งออกจากจุดนั้นเพียงเพื่อดีบักสิ่งที่เกิดขึ้นจริงเพราะกระบวนการ addAction ทั้งหมดไม่ควรถูกดำเนินการ
Tobias

ให้ออกจากที่จุดที่การออกดำเนินการให้ฉันหน้าจอว่างเปล่า
Shathish

แต่มันเพิ่มผลิตภัณฑ์หรือไม่
โทเบียส

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กิจกรรมแล้วคำถามคือฉันจะป้องกันไม่ให้เพิ่มสินค้าลงในรถเข็นได้อย่างไร
Shathish

หรือหากมีการเพิ่มไว้แล้วจะลบอย่างไร?
Shathish

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

}

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.