Немного покопавшись в коде ядра 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);
}
}
}