1

magentoのcheckout/controllers / cartController.phpに新しいカートaddAction()を作成しています。私の必要性は、製品がカートに追加されるときはいつでも、現在追加されているものを除いて、カート内のすべての既存の製品をクリアする必要があるということです。あれは、

Nokia 3220が空のカートに追加された場合は、アイテムとして配置する必要があります。

その後、Nokia N72が追加された場合は、Nokia 3220(つまり前のアイテム)をカートからクリアし、NokiaN72を配置する必要があります。

CartController.phpをオーバーライドし、CartController.phpのaddAction()の先頭にコードを追加しました。

$ checkout_my_cart = Mage :: getSingleton('checkout / cart'); $ current_items = $ checkout_my_cart-> getItems(); foreach($ current_items as $ item){$ itemId = $ item-> getItemId(); $ checkout_my_cart-> removeItem($ itemId)-> save(); }

ただし、既存のアイテムを置き換えるために新しいアイテムを追加すると、カート全体がクリアされます。Addaction()の先頭にコードを追加したので、そうすべきではないと思います。上記のコードを関数として定義し、addAction()で呼び出してみました。しかし、話は同じようです。

どんな助けでもありがたいです。

助けてください。

4

2 に答える 2

3

コントローラをオーバーライドするのではなく、オブザーバを使用することを検討する必要があります。addItem内のメソッドを見ると、Mage_Sales_Model_Quoteそのイベントが見つかりますsales_quote_add_item

あなたはそれを観察し、quote_item(イベントへの引数)をフェッチし、これ以外のアイテムを削除することができます(手で入力していたので、エラーを再確認してください):

public function observeAddItem($observer) 
{
  $item = $observer->getEvent()->getQuoteItem();
  $cart = Mage::getSingleton('checkout/cart');
  foreach ($cart->getQuote()->getItemsCollection() as $_item) {
    if($_item->getId() != $item->getId()) {
      $_item->isDeleted(true);
    }
  }
}

クラス(特にコントローラー)をオーバーライドすることが最後の手段になるはずです。

イベントを監視する方法の詳細については、magentowikiを参照してください。

http://www.magentocommerce.com/wiki/5_-_modules_and_development/0_-_module_development_in_magento/customizing_magento_using_event-observer_method

于 2012-11-28T10:14:50.147 に答える
0

こんにちは、以下のコードを確認してください:

$session= Mage::getSingleton('checkout/session');
$quote = $session->getQuote();
$cart = Mage::getModel('checkout/cart');
$cartItems = $cart->getItems(); 
foreach ($cartItems as $item){
    $quote->removeItem($item->getId())->save();
}
于 2016-02-24T06:39:40.570 に答える