在观察者中将产品添加到购物车

时间:2012-04-09 15:54:05

标签: php magento magento-1.4

我需要为客户创造一种在Magento商店免费提供一种产品(例如)的可能性。我从this帖子中找出了大部分内容,但现在我遇到了一个问题。我创建了一个在checkout_cart_product_add_after上执行的Observer方法。在那里我有一些代码(它只是整个事情的一部分):

    $productId = $observer->getProduct()->getId();
    $cartHelper = Mage::helper('checkout/cart');
    $items = $cartHelper->getCart()->getItems();
    Mage::getModel('core/session')->addNotice('Product id: '.$productId);
    foreach ($items as $item) {
         if ($item->getProduct()->getId() == $productId) {
              $itemId = $item->getItemId();
              $cart = $cartHelper->getCart()->removeItem($itemId)->save() ;//It WORKS!!!!!!!!!!!!
              $product = Mage::getModel('catalog/product')->load($productId);
              $cart->addProduct($product, $this->_getRequest()->getParams());                    
                    $cart->save();
                    Mage::getSingleton('checkout/session')->setCartWasUpdated(true);
                    break;
                }
            }

首先,我的代码根据一些请求参数将产品添加到购物车中,价格为0.00(产品为例)。这部分工作正常,所以它不会发布在这里。第二部分(我上面发布的)必须删除现有产品并将其替换为正常价格的产品。除了一件事之外几乎所有东西都工作正常 - 行$cart->addProduct($product, $this->_getRequest()->getParams());不起作用,我无法理解为什么(没有错误,没有例外,没有日志)。 _getRequest方法如下所示:

    protected function _getRequest()
    {
        return Mage::app()->getRequest();
    } 

如果我记录$this->_getRequest()->getParams(),那将会是这样的:

    2012-04-09T14:46:56+00:00 DEBUG (7): Array(
    [uenc] => aHR0cDovL2xvY2FsaG9zdC93b3AvZmVhdHVyZWQvY2xhc3NpYy1saW5lLXBvbHkuaHRtbA,,
    [product] => 50
    [related_product] => 
    [bundle_option] => Array(
            [20] => 75
            [21] => 84
            [22] => 94
        )
    [qty] => 1
    [send-request] => 0
)

为什么$cart->addProduct($product, $this->_getRequest()->getParams());不起作用?怎么做对了?也许最好使用addAction() Mage_Checkout_CartController(覆盖它)? 抱歉我的语言。谢谢你的回答。希望有人能帮助我...

1 个答案:

答案 0 :(得分:0)

我会回答我的问题,为任何人解释事情,他们会遇到同样的问题。 代码:

$cart->addProduct($product, $this->_getRequest()->getParams());

将无法正常工作,因为我之前会调用$cart->save(),而不是尝试在此之后执行相同操作,这就是问题所在。当我首先删除$cart->save()时,它工作正常。