Làm thế nào để chỉ cho phép một sản phẩm trong giỏ hàng?


18

Chúng tôi có một yêu cầu, trong đó một khách hàng sẽ chỉ được phép thêm một sản phẩm vào giỏ hàng. Tuy nhiên anh ấy / cô ấy có thể thêm bất kỳ số lượng của sản phẩm đó.

Làm cách nào tôi có thể ngăn sản phẩm thêm vào giỏ hàng nếu đã có sản phẩm trong giỏ hàng?

Ai đó có thể giúp đỡ về điều này?


1
Tôi nghĩ rằng đây là những gì bạn cần: crearegroup-ec Commerce.co.uk/blog/magento-tips/ mẹo Tùy chọn khác là viết lại hành động để thêm sản phẩm và khởi động một sự kiện tùy chỉnh checkout_cart_product_add_before ở đó, ví dụ: markshust.com/2012/
08/27

@enenen: thật tuyệt, nhưng làm cách nào tôi có thể ngăn sản phẩm được thêm vào giỏ hàng trong người quan sát đó?
Shathish

Câu trả lời:


20

Các sự kiện catalog_product_type_prepare_full_optionscatalog_product_type_prepare_lite_optionslà bạn của bạn

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

Sau đó, trong lớp Người quan sát của bạn

<?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_optionslà lần đầu tiên đối với tôi! độc đáo thực hiện.
philwinkle

4
@philwinkle nó rất tiện cho mọi thứ ngay trước khi thêm vào giỏ hàng. Tôi nghĩ rằng nó được bỏ qua từ rất nhiều cheatsheet vì một grep bình thường chỉ sản xuất Mage :: dispatchEvent ($ EventName, thiếu dòng trước $ EventName = sprintf ( 'catalog_product_type_prepare_% s_options', $ processMode);
Kristof tại Fooman

tốt mà làm việc như một nét duyên dáng
Deepanshu Goyalty ngày 7/12/2015

Fooman, đó là grts tôi
Amit Bera

8

Thay vì viết lại bộ điều khiển (xin vui lòng đừng làm vậy), thay vào đó, hãy viết lại addProductphương thức để tính đến giới hạn:

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

Nếu bạn muốn nhận được sự ưa thích, hãy thay thế phần 1trên bằng Mage::getStoreConfig('checkout/options/max_cart_qty)và đặt tệp config.xml của mô-đun sau:

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

Giá trị đó hiện được kiểm soát thông qua giá trị XML. Nếu bạn muốn nhận được thực sự, thực sự ưa thích , hãy thêm phần này vào system.xml của mô-đun mới của bạn:

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

Hãy nhớ rằng bạn cần đặt một <depends>Mage_Checkout</depends>mô-đun của mình để cõng trên cấu hình hệ thống được xác định trước của nó.


Cảm ơn rất nhiều, câu trả lời của bạn là "thực sự lạ mắt", nhưng câu trả lời của Fooman phù hợp với những gì tôi đã cố gắng, vì vậy đã chấp nhận đó là câu trả lời. Nhưng nếu tôi chưa bắt đầu sử dụng người quan sát, tôi đã sử dụng phương pháp của bạn :).
Shathish

1
Tất nhiên! @fooman đã đúng - điều này cũng mang tính giáo dục đối với tôi :)
philwinkle

2

Một cách có thể là viết lại addAction của Mage_Checkout_CartControll.

Vì vậy, hãy kiểm tra xem đã có sản phẩm trong giỏ hàng chưa và nếu có hiển thị thông báo lỗi thích hợp. Nếu không, bạn có thể gọi phương thức cha đang thực hiện quá trình bổ sung hoàn chỉnh:

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

Tôi xin lỗi, $this->_goBack();không làm việc! Tôi nhận được vào điều kiện if nhưng sản phẩm vẫn được thêm vào.
Shathish

Điều gì xảy ra nếu bạn thoát ra vào thời điểm đó, chỉ để gỡ lỗi những gì đang thực sự xảy ra, bởi vì toàn bộ quá trình addAction không nên được thực thi
Tobias

đưa ra lối thoát tại thời điểm đó thoát khỏi thực thi cho tôi một màn hình trống
Shathish

Nhưng nó có thêm sản phẩm?
Tobias

3
xin vui lòng oh đừng viết lại bộ điều khiển
philwinkle

1

Tôi nghĩ bạn có thể sử dụng một người quan sát và các sự kiện sau đây sẽ hữu ích để kiểm tra các điều kiện bạn muốn. (Có lẽ một số sự kiện có thể không có trong phiên bản Magento mà bạn đang sử dụng).

checkout_cart_save_before

checkout_cart_product_add_after

checkout_cart_update_items_before

checkout_cart_update_items_after

checkout_cart_save_after

Tôi đã thử với checkout_cart_product_add_aftersự kiện, câu hỏi là làm thế nào tôi có thể ngăn sản phẩm được thêm vào giỏ hàng?
Shathish

hoặc nếu nó đã được thêm vào, làm thế nào để loại bỏ nó?
Shathish

1

Có thể một chút ý tưởng trường trái nhưng làm thế nào về việc sử dụng catalog_product_is_salable_aftersự kiện?

Những gì bạn có thể làm ở đây là kiểm tra xem sản phẩm có trong giỏ hàng hay nếu có một sản phẩm khác trong giỏ hàng. Khi có một sản phẩm khác trong giỏ hàng cập nhật, thuộc tính 'is_salable' của đối tượng 'có thể bán được' được chuyển cho người quan sát thành false.

LƯU Ý rằng điều này chưa được thử nghiệm và chỉ là một ý tưởng. Nó sẽ thất bại nếu mẫu của bạn không kiểm tra$product->isSaleable()trước khi hiển thị nút. Nó cũng sẽ chỉ loại bỏ nút và không thực sự dừng quá trình thêm nếu người dùng có thể đoán url.


1

Tôi biết chủ đề này là một cái gì đó cũ, nhưng tôi đã có một vấn đề tương tự. Tôi chỉ muốn một mặt hàng trong giỏ hàng và nếu khách hàng thêm một mặt hàng mới, tôi muốn thay thế mặt hàng cũ bằng mặt hàng mới. Vì vậy, tôi ghi đè addAction (được mô tả ở đây như thế này:

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

}

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.