장바구니에 하나의 제품 만 허용하는 방법은 무엇입니까?


18

고객은 한 번에 하나의 제품 만 장바구니에 추가 할 수있는 요구 사항이 있습니다. 그러나 해당 제품의 수량을 추가 할 수 있습니다.

장바구니에 이미 제품이있는 경우 장바구니에 제품이 추가되지 않도록하려면 어떻게해야합니까?

이것에 대해 누군가가 도울 수 있습니까?


1
나는 이것이 당신이 필요하다고 생각 : crearegroup-ecommerce.co.uk/blog/magento-tips/... 다른 옵션은 사용자 정의 이벤트를 제품을 추가하기위한 작업을 다시하고 발사하는 checkout_cart_product_add_before 가, 예를 들어 markshust.com/2012/을 08 / 27 /…
enenen

@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 장바구니에 담기 직전에 무엇이든 사용할 수 있습니다. 일반적인 grep이 Mage :: dispatchEvent ($ eventName, 앞줄이없는 $ eventName = sprintf ( 'catalog_product_type_prepare_ % s_options', $ processMode)) 만 생성하기 때문에 많은 치트 시트
에서 누락 된 것 같습니다

그것은 매력처럼 작동했습니다.
Deepanshu Goyal

Fooman, grts me
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>사전 정의 된 시스템 구성을 피기 백하려면 모듈에 a를 설정해야 합니다.


고마워요, 당신의 대답은 "정말 멋지지만"Fooman의 대답은 내가 이미 시도한 것과 일치했기 때문에 대답으로 받아 들였습니다. 그러나 관찰자를 사용하지 않은 경우 방법을 사용했을 것입니다 :).
Shathish

1
물론이야! @fooman이 맞았습니다-이것은 저에게도 교육적이었습니다 :)
philwinkle

2

가능한 방법은 addAction of Mage_Checkout_CartController를 다시 작성하는 것입니다.

따라서 장바구니에 이미 제품이 있는지 확인하고 적절한 오류 메시지가 표시되는지 확인하십시오. 그렇지 않은 경우 완전한 추가 프로세스를 수행하는 상위 메소드를 호출 할 수 있습니다.

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

죄송합니다, $this->_goBack();작동하지 않습니다! if 조건에 들어가지만 제품이 여전히 추가되고 있습니다.
Shathish

전체 addAction 프로세스가 실행되어서는 안되기 때문에 실제로 발생하는 것을 디버깅하기 위해 그 시점에서 종료하면 어떻게됩니까?
Tobias

그 시점에서 종료를 제공하면 실행이 종료되어 나에게 빈 화면이 표시됩니다
Shathish

그러나 그것은 제품을 추가합니까?
Tobias

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이벤트 사용은 어떻습니까?

여기서 할 수있는 일은 제품이 카트에 있는지 또는 카트에 다른 제품이 있는지 확인하는 것입니다. 장바구니에 다른 제품이있는 경우 관찰자에게 전달 된 'salable'오브젝트의 'is_salable'속성이 false로 업데이트됩니다.

참고 이 테스트 만 생각되지 않았습니다. $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.