Программно добавить товар в корзину с изменением цены

Я хочу добавить продукт в корзину программно. Кроме того, я хочу изменить цену продукта при добавлении в корзину.

Предположим, цена моего продукта составляет 100 долларов. Я хотел изменить его до 90 долларов, когда его добавили в корзину.

Я добавил товар в корзину. Однако, я не могу изменить цену продукта.

Является ли это возможным?

Вот код для добавления товара в корзину: –

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

Solutions Collecting From Web of "Программно добавить товар в корзину с изменением цены"

После копания в основном коде Magento я обнаружил, что вам нужно использовать $item->getProduct()->setIsSuperMode(true) , чтобы сделать работу $item->setCustomPrice() и $item->setOriginalPrice() .

Вот пример кода, который вы можете использовать в Observer, который прослушивает события checkout_cart_product_add_after или checkout_cart_update_items_after . Код логически одинаковый, кроме checkout_cart_product_add_after вызывается только один элемент, а checkout_cart_update_items_after вызывается для всех элементов в корзине. Этот код разделяется / дублируется на 2 метода только в качестве примера.

Событие: 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); } } 

Событие: 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 изменил способ расчета цен в корзине, что делает это очень трудным для этого в версии 1.4. Если вы установите цену с помощью Observer или другого устройства, то почти наверняка будет перезаписано обратно по каталогу.

Чтобы реализовать это, вам необходимо использовать правила корзины покупок.

Можно указать конкретную цену клиента для позиции котировки. Следовательно, что-то вроде этого должно это сделать:

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

Надеюсь это поможет…

Ответ Джонатана, вероятно, лучший для большинства ситуаций. Но некоторым клиентам может не понравиться, как скидки корзины отображаются в корзине. Недавно я сделал проект (с Magento 1.3.3), когда клиенту не нравилось, как каждая позиция все еще показывала полную цену, а также промежуточный итог, со скидкой ниже подытожки – он хотел увидеть цену каждый предмет со скидкой, а промежуточный итог также показывает скидку. Ему действительно не понравилось, что линия «Скидка» после линии «Итого».

В любом случае, если вы окажетесь в одной лодке, один из подходов – переопределить методы getCalculationPrice () и getBaseCalculationPrice () в Mage_Sales_Model_Quote_Address_Item и Mage_Sales_Model_Quote_Item. Я знаю, что не всегда красиво переопределять, гораздо лучше использовать события, но в этом случае я не мог заставить события работать без проблем как на интерфейсе, так и на бэкэнд. Не уверен, что этот подход будет работать в Magento 1.4+.

Если мне нужно поделиться своим решением, которое я сделал на базе Simon, то мне удалось переписать функцию сохранения класса класса.

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

У меня была такая же проблема, и я не разработчик. Что я сделал, был добавлен новый атрибут цены в magento backend, называемый «цена сайта». На странице продукта это показало более высокую цену в 100 долларов. фактическая цена товара составила 90 долларов США. поэтому, когда покупатель добавляет его в корзину, он увидит фактическую цену товара, но на странице продукта они видят цену пользовательского атрибута в размере 100 долларов США

если все ваши цены на странице продукта установлены на% выше, чем реальная цена, просто умножьте свою цену на 1%. Так что если вы хотите добавить 10% ко всем вашим ценам, то цена * 1.1. Это покажет вашу цену как 10% выше, но когда покупатель добавит в корзину, они увидят реальную цену.