Agregue producto programáticamente al carrito con el cambio de precio

Quiero agregar un producto al carrito mediante progtwigción. Además, quiero cambiar el precio del producto cuando lo agregue al carrito.

Supongamos que el precio de mi producto es de $ 100. Quería cambiarlo a $ 90 cuando lo agregué al carrito.

Agregué el producto al carrito. Sin embargo, no puedo cambiar el precio del producto.

¿Es posible?

Aquí está el código para agregar producto al carro:

$cart = Mage::getSingleton('checkout/cart'); try { $cart->addProduct($product, array('qty' => 1)); $cart->save(); } catch (Exception $ex) { echo $ex->getMessage(); } 

Después de profundizar un poco en el código central de Magento, descubrí que necesita usar $item->getProduct()->setIsSuperMode(true) para hacer que $item->setCustomPrice() y $item->setOriginalPrice() funcionen.

Aquí hay un ejemplo de código que puede usar dentro de un Observer que escucha los checkout_cart_product_add_after o checkout_cart_update_items_after events. El código es lógicamente el mismo, excepto checkout_cart_product_add_after llamado para un solo elemento y checkout_cart_update_items_after se llama para todos los artículos en el carro. Este código está separado / duplicado en 2 métodos solo como un ejemplo.

Evento: 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); } } 

Evento: 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); } } } 

Magento ha cambiado la forma en que se calculan los precios en el carrito, lo que hace que sea muy difícil hacer esto en la v1.4 en adelante. Si establece el precio usando un Observer u otro dispositivo, es casi seguro que se sobrescribirá al precio del catálogo.

Efectivamente, debe usar las reglas del carro de la compra para implementar esto.

Es posible establecer un precio específico para el cliente de un artículo de cotización. Por lo tanto, algo como esto debería hacerlo:

 $quoteItem = $quote->addProduct($product, $qty); $quoteItem->setCustomPrice($price); // we need this since Magento 1.4 $quoteItem->setOriginalCustomPrice($price); $quote->save(); 

Espero que esto ayude…

La respuesta de Jonathan es probablemente la mejor para la mayoría de las situaciones. Sin embargo, es posible que a algunos clientes no les guste la forma en que se muestran los descuentos en el carrito de compras en el carrito. Hace poco hice un proyecto (con Magento 1.3.3) en el que al cliente no le gustaba cómo cada línea de pedido mostraba el precio completo y el subtotal, con una línea de descuento debajo del subtotal, quería ver el precio de cada elemento descontado, y el subtotal también muestra el precio con descuento. Realmente no le gustaba tener la línea de descuento después de la línea subtotal.

De todos modos, si te encuentras en el mismo barco, un enfoque es anular los métodos getCalculationPrice () y getBaseCalculationPrice () en Mage_Sales_Model_Quote_Address_Item y Mage_Sales_Model_Quote_Item. Sé que no siempre es lindo anular, mucho mejor usar eventos, pero en este caso no pude lograr que los eventos funcionen sin problemas tanto en la interfaz como en el back-end. No estoy seguro de si este enfoque funcionará en Magento 1.4+.

Si tengo que compartir mi solución que hice en la base de Simon, entonces he logrado reescribir la función de cita de salvar de clase de modelo.

 public function save() { $this->getQuote()->getBillingAddress(); $this->getQuote()->getShippingAddress()->setCollectShippingRates(true); $this->getQuote()->collectTotals(); //$this->getQuote()->save(); foreach($this->getQuote()->getAllItems() as $item) { $productId = $item->getProductId(); $product = Mage::getModel('catalog/product')->load($productId); if($product->getAttributeText('is_dummy') == 'Yes') { $price = 2; $item->setCustomPrice($price); // we need this since Magento 1.4 $item->setOriginalCustomPrice($price); } } $this->getQuote()->save(); $this->getCheckoutSession()->setQuoteId($this->getQuote()->getId()); /** * Cart save usually called after chenges with cart items. */ Mage::dispatchEvent('checkout_cart_save_after', array('cart'=>$this)); return $this; } 

Tuve el mismo problema y no soy un desarrollador. Lo que hice fue agregar un nuevo atributo de precio en el backend magento llamado “precio del sitio”. En la página del producto, esto mostró el precio más alto $ 100. el precio real del artículo era $ 90. por lo tanto, cuando el comprador lo agrega al carrito, verá el precio real del artículo, pero en la página del producto verá el precio del atributo personalizado de $ 100.

Si todos sus precios en la página del producto son un conjunto% superior, entonces el precio real solo multiplicará el precio de su producto por el 1 + por ciento. Por lo tanto, si desea agregar un 10% a todos sus precios, haga clic en el precio * 1.1 Esto mostrará su precio un 10% más alto, pero cuando el comprador agregue al carro verá el precio real.