Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Programmatically add product to cart with price change

Tags:

php

magento

I want to add a product to cart programmatically. Also, I want to change the product price when added to cart.

Suppose, my product's price is $100. I wanted to change it to $90 when added to cart.

I added product to cart. However, I am unable to change the product price.

Is it possible?

Here is the code to add product to cart:-

$cart = Mage::getSingleton('checkout/cart');  try {        $cart->addProduct($product, array('qty' => 1));     $cart->save(); } catch (Exception $ex) {     echo $ex->getMessage(); } 
like image 303
Mukesh Chapagain Avatar asked Feb 24 '11 12:02

Mukesh Chapagain


1 Answers

After digging a bit into Magento's core code, I found that you need to use $item->getProduct()->setIsSuperMode(true) in order to make $item->setCustomPrice() and $item->setOriginalPrice() work.

Here is some sample code you can use within an Observer that listens for the checkout_cart_product_add_after or checkout_cart_update_items_after events. The code is logically the same except checkout_cart_product_add_after is called for only one item and checkout_cart_update_items_after is called for all items in the cart. This code is separated/duplicated into 2 methods only as an example.

Event: checkout_cart_product_add_after

/**  * @param Varien_Event_Observer $observer  */ public function applyDiscount(Varien_Event_Observer $observer) {     /* @var $item Mage_Sales_Model_Quote_Item */     $item = $observer->getQuoteItem();     if ($item->getParentItem()) {         $item = $item->getParentItem();     }      // Discounted 25% off     $percentDiscount = 0.25;       // This makes sure the discount isn't applied over and over when refreshing     $specialPrice = $item->getOriginalPrice() - ($item->getOriginalPrice() * $percentDiscount);      // Make sure we don't have a negative     if ($specialPrice > 0) {         $item->setCustomPrice($specialPrice);         $item->setOriginalCustomPrice($specialPrice);         $item->getProduct()->setIsSuperMode(true);     } } 

Event: checkout_cart_update_items_after

/**  * @param Varien_Event_Observer $observer  */ public function applyDiscounts(Varien_Event_Observer $observer) {     foreach ($observer->getCart()->getQuote()->getAllVisibleItems() as $item /* @var $item Mage_Sales_Model_Quote_Item */) {          if ($item->getParentItem()) {              $item = $item->getParentItem();          }           // Discounted 25% off          $percentDiscount = 0.25;            // This makes sure the discount isn't applied over and over when refreshing          $specialPrice = $item->getOriginalPrice() - ($item->getOriginalPrice() * $percentDiscount);           // Make sure we don't have a negative          if ($specialPrice > 0) {              $item->setCustomPrice($specialPrice);              $item->setOriginalCustomPrice($specialPrice);              $item->getProduct()->setIsSuperMode(true);          }     } } 
like image 91
interimpulso Avatar answered Oct 18 '22 19:10

interimpulso