1

I need to create a possibility for customers to offer a one product free of charge (as an example) in Magento shop. I figured out most of things from this post, but now I have one problem. I am created an Observer method that is executed on checkout_cart_product_add_after. And there I have some code (its just a part of whole thing):

    $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;
                }
            }

So first of all my code adds a product to cart with 0.00 price (product as an example) based on some request parameters. Thats part works fine so it is not posted here. The second part (that I posted above) must delete an existing product and replace it with product with normal price. Almost everything works fine except one thing - the line $cart->addProduct($product, $this->_getRequest()->getParams()); don't work and I cant understand why (no errors, no exceptions, no logs). _getRequest method looks like this:

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

And if I log an $this->_getRequest()->getParams() there is will be something like this:

    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
)

So why that $cart->addProduct($product, $this->_getRequest()->getParams()); will not work? How to do it right? Maybe it is better to use addAction() of Mage_Checkout_CartController (overwrite it)? Sorry for my language. Thanks for answers. Hope somebody can help me...

Community
  • 1
  • 1
alphacentauri
  • 647
  • 6
  • 21
  • It seems like you are adding the same product you are removing (you are using both times the same $productId. Is that what you wanted? – Alex Siri Apr 13 '12 at 11:53
  • Yes, it is. The logic of this is to add product to cart with normal price if this product already was added before with 0.00 price. Maybe I would rather just change the price of a quote? But i think it will not work to. – alphacentauri Apr 18 '12 at 10:26
  • Aren't you supposed to be working with the QUOTE vs. the cart. Products are added to the quote before the checkout process begins. – MB34 Apr 23 '12 at 14:46
  • Working with cart model is still fine for things I wanted to do. I have succeeded what I wanted. – alphacentauri May 23 '12 at 14:24

1 Answers1

0

I'll answer my question to clarify things for anybody, who will stumble the same problem. The code:

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

will not work because I call $cart->save() before it and than tried to do the same after it and that was the problem. When I removed first $cart->save() it is worked just fine.

alphacentauri
  • 647
  • 6
  • 21