Программно добавить товар в корзину с изменением цены
Я хочу добавить продукт в корзину программно. Кроме того, я хочу изменить цену товара при добавлении в корзину.
предположим, что цена моего продукта составляет $ 100. Я хотел изменить его на $ 90 при добавлении в корзину.
Я добавил товар в корзину. Однако, я не могу изменить цену товара.
это возможно?
вот код для добавления товара в корзину: -
$cart = Mage::getSingleton('checkout/cart');
try {
$cart->addProduct($product, array('qty' => 1));
$cart->save();
}
catch (Exception $ex) {
echo $ex->getMessage();
}
6 ответов:
немного покопавшись в основном коде Magento, я обнаружил, что вам нужно использовать
$item->getProduct()->setIsSuperMode(true)для того чтобы$item->setCustomPrice()и$item->setOriginalPrice()работа.вот пример кода, который вы можете использовать в наблюдателе, который слушает
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 изменили способ расчета цен в корзине, что делает его очень трудно сделать это в v1.4 и далее. Если вы установите цену с помощью наблюдателя или другого устройства, она почти наверняка будет перезаписана обратно в цену каталога.
эффективно, вам нужно использовать правила корзины для реализации этого.
можно установить конкретную цену клиента для элемента котировки. Следовательно, что-то вроде этого должно сделать это:
$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, то мне удалось переписать функцию сохранения класса модели quote.
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% выше, но когда покупатель добавляет в корзину, они увидят реальную цену.
Comments