Программное добавление товара в корзину с изменением цены
Я хочу добавить товар в корзину программно. Кроме того, я хочу изменить цену товара при добавлении в корзину.
Предположим, цена моего продукта составляет 100 долларов. Я хотел изменить его на 90 долларов при добавлении в корзину.
Я добавил товар в корзину. Однако я не могу изменить цену продукта.
Возможно ли это?
Вот код для добавления товара в корзину: -
$cart = Mage::getSingleton('checkout/cart');
try {
$cart->addProduct($product, array('qty' => 1));
$cart->save();
}
catch (Exception $ex) {
echo $ex->getMessage();
}
6 answers
Немного покопавшись в основном коде 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 метода только в качестве примера.
Событие: проверка_карто_продукта_адд_афтер
/**
* @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_ после
/**
* @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 и далее. Если вы установите цену с помощью наблюдателя или другого устройства, она почти наверняка будет перезаписана обратно в цену каталога.
По сути, для этого вам необходимо использовать правила корзины покупок.
Можно установить конкретную для клиента цену товара по котировке. Следовательно, что-то вроде этого должно сделать это:
$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+.
Если мне придется поделиться своим решением, которое я сделал на основе Саймона, то мне удалось переписать функцию сохранения класса модели цитаты.
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 под названием "цена сайта". На странице товара это показывало более высокую цену в 100 долларов. фактическая цена предмета составляла 90 долларов. поэтому, когда покупатель добавляет его в корзину, он увидит фактическую цену товара, но на странице товара он увидит цену пользовательского атрибута в размере 100 долларов США
Если все ваши цены на странице товара на несколько% выше, чем реальная цена, просто умножьте вашу цена продукта на 1+процент. Поэтому, если вы хотите добавить 10% ко всем вашим ценам, сделайте цену*1.1 Это покажет вашу цену на 10 % выше, но когда покупатель добавит товар в корзину, он увидит реальную цену.