2

カスタムのカートへの追加イベントにバインドするオブザーバーをMagentoで正常に設定しました。ここで、特定の条件下で、カートへの追加イベントを停止し(または削除しますか?)、ユーザーにメッセージをフラッシュする必要があります。

現在、この製品は注文ごとに最大1つの数量を許可するように設定されています。ユーザーが1つを超えて追加しようとすると、Magentoはエラーメッセージを表示し、アイテムがカートに追加されないようにします。

スクリーンショット:[リンク] http://cl.ly/image/3V2C2j1S0f37

理想的には、オブザーバーから同じ機能を模倣したいのですが、Magentoを初めて使用するため、これにどのように取り組むかはまったくわかりません。

例外をスローする必要があることを読みました。しかし、それを行ったとき、エラーページが表示されました。どういうわけかこれの修正バージョンを追加する必要があるかどうか疑問に思います:

Mage::helper('cataloginventory')->__('The maximum quantity allowed for purchase is %s.', '<span class="sku-failed-qty" id="sku-stock-failed-' . $item->getId() . '">' . ($item->getQtyMaxAllowed()  * 1) . '</span>');

任意のヘルプ、またはポインタをいただければ幸いです。

4

2 に答える 2

5

次のことを試すことができます。これにより、数量が1より大きいかどうかがチェックされます。この場合、数量が1に更新されます。また、通知メッセージが追加され、ユーザーに数量の変更が通知されます。

<checkout_cart_product_add_after>
<observers>
    <company_module_name>
        <type>singleton</type>
        <class>Company_Module_Model_Observer</class>
        <method>checkItem</method>
    </company_module_name>
</observers>

public function checkItem($obj) {       
    //check if qty is more then 1
    if($obj->getProduct()->getQty() > 1) {
    //set notice to inform the visitor that there is a maximum
    Mage::getSingleton('core/session')->addNotice('The maximum quantity allowed for purchase is 1.');

    //get the event 
    $event = $obj->getEvent();

    //get the product we have added
    $product = $event->getProduct();

    //get the quote item
    $quoteItem = $event->getQuoteItem();

    //change the qty to 1 allowed
    $quoteItem->setQty(1);

    //recalc totals
    $quoteItem->getQuote()->collectTotals();

    //save the item
    $quoteItem->getQuote()->save();
}

=====編集======

別のオプションは次のとおりです。

<controller_action_predispatch_checkout_cart_add>
    <observers>
        <aquait_aquait_name>
            <type>singleton</type>
            <class>Aquait_Aquait_Model_Observer</class>
            <method>checkfunction</method>
        </aquait_aquait_name>
    </observers>
</controller_action_predispatch_checkout_cart_add>


public function checkfunction($observer) 
{
    if ($observer->getEvent()->getControllerAction()->getFullActionName() == 'checkout_cart_add') {
        $productId = Mage::app()->getRequest()->getParam('product');
        $product = Mage::getModel('catalog/product')->load($productId);
        if (Mage::app()->getRequest()->getParam('qty') > 1) {
            Mage::getSingleton('core/session')->addNotice('The maximum quantity allowed for purchase is 1.');
            Mage::app()->getResponse()->setRedirect($product->getProductUrl());
        }
    }

}
于 2013-01-07T21:51:04.887 に答える
1

特徴:

  • 後にエラーメッセージをクリアする
  • すべての「カートに追加」コードをスキップします
  • その後、選択したページにリダイレクトします

「カートに追加」を優雅に中止するために考えられるすべてのことを試みた後、私はなんとかピースを組み合わせ、ソースをステップスルーすることによってフラグFLAG_NO_DISPATCHを発見しました。パラメータを変更したり、リダイレクトを設定したりする他の試みは、「カートに追加」プロセスでさらにいくつかのコードによって上書きされます。

    Mage::app()->getResponse()->setRedirect($store_product->getProductUrl());
    Mage::getSingleton('checkout/session')->addError(Mage::helper('checkout')->__('Sorry, the price of this product has been updated. Please, add to cart after reviewing the updated price.'));
    $observer->getControllerAction()->setFlag('', Mage_Core_Controller_Varien_Action::FLAG_NO_DISPATCH, true);  

エラーの代わりに、次の通知を受け取ることができます。

Mage::getSingleton('core/session')->addNotice('Sorry, this product is currently not available...');
于 2013-02-06T20:14:13.370 に答える