回答:
イベント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
私にとって初めてです!うまくやった。
コントローラを書き換える代わりに(そうしないでください)、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>
定義済みのシステム構成に便乗するには、モジュールにを設定する必要があることに注意してください。
可能な方法は、Mage_Checkout_CartControllerのaddActionを書き換えることです。
そのため、カートに製品がすでに存在するかどうかを確認し、存在する場合は適切なエラーメッセージを表示します。そうでない場合は、完全な追加プロセスを実行している親メソッドを呼び出すことができます。
if (count($this->_getCart()->getProductIds()) > 0) {
$this->_goBack();
} else {
parent::addAction();
}
$this->_goBack();
動作しません!if状態になりますが、製品はまだ追加されています。
オブザーバーを使用でき、次のイベントが必要な条件を確認するのに役立ちます。(おそらく、使用している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
イベントで試していますが、質問は製品がカートに追加されないようにする方法ですか?
たぶん、ちょっとしたレフトフィールドのアイデアかもしれませ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();
}
checkout_cart_product_add_before
そこでカスタムイベントを起動する