カートに1つの製品のみを許可する方法は?


18

顧客が一度にカートに追加できる製品は1つだけであるという要件があります。ただし、彼/彼女はその製品をいくつでも追加できます。

カート内に既に商品が存在する場合、商品がカートに追加されないようにするにはどうすればよいですか?

これについて誰か助けてもらえますか?


1
これが必要だと思います:crearegroup-ecommerce.co.uk/blog/magento-tips / ...他のオプションは、製品を追加するアクションを書き換えて、checkout_cart_product_add_before そこでカスタムイベントを起動する
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>

次に、Observerクラスで

<?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
@philwinkleは、カートに追加する直前に何かに非常に便利です。私は、通常のgrepだけメイジ::は、dispatchEvent($ eventNameのは、前の行$ eventNameの=はsprintf(「catalog_product_type_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
もちろん!@foomanは正しかった-これも私にとって教育的でした:)
philwinkle

2

可能な方法は、Mage_Checkout_CartControllerのaddActionを書き換えることです。

そのため、カートに製品がすでに存在するかどうかを確認し、存在する場合は適切なエラーメッセージを表示します。そうでない場合は、完全な追加プロセスを実行している親メソッドを呼び出すことができます。

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

すみません、$this->_goBack();動作しません!if状態になりますが、製品はまだ追加されています。
シャシッシュ

addActionプロセス全体が実行されるべきではないため、実際に起こっていることをデバッグするために、その時点で終了した場合はどうなりますか?
トビアス

その時点で終了すると、実行が終了し、空白の画面が表示されます
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イベントで試していますが、質問は製品がカートに追加されないようにする方法ですか?
シャシッシュ

または既に追加されている場合、それを削除する方法は?
シャシッシュ

1

たぶん、ちょっとしたレフトフィールドのアイデアかもしれませcatalog_product_is_salable_afterんが、イベントの使い方はどうですか?

ここでできることは、製品がカートに入っているかどうか、またはカートに別の製品があるかどうかを確認することです。カートに別の製品がある場合、オブザーバーに渡された「salable」オブジェクトの「is_salable」属性をfalseに更新します。

これはテストされておらず、単なるアイデアにすぎないことに注意してください。テンプレートが$product->isSaleable()ボタンを表示する前にチェックしない場合、失敗します。また、ボタンを削除するだけで、ユーザーがURLを推測できた場合、実際には追加プロセスを停止しません。


1

このトピックは古いものですが、同様の問題がありました。カート内のアイテムを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.