如何使用Magento中的getQuoteItem()在购物车中添加可配置产品

问题描述 投票:1回答:1

我想为所有类型的产品设定定制价格。我正在听观察员checkout_cart_product_add_after。在它的功能我使用以下代码来设置产品的自定义价格。

$newPrice  = $_POST["txtprice"];
$event = $observer->getEvent();
$minPrice = $observer->getProduct()->getMinPrice();
$quoteItem = $event->getQuoteItem();

if($newPrice > $minPrice){          
$quoteItem->setCustomPrice($newPrice);              
$quoteItem->setOriginalCustomPrice($newPrice);
    $quoteItem->getProduct()->setIsSuperMode(true);
}

此代码适用于简单的产品。对于可配置的产品,它不起作用。 $ quoteItem对象中没有设置购物车的可配置项。因此我无法使用$ quoteItem设置自定义价格。

magento cart configurable
1个回答
1
投票

看到我编辑的答案here

下面是一些示例代码,您可以在Observer中使用它来侦听checkout_cart_product_add_aftercheckout_cart_update_items_after事件。代码在逻辑上是相同的,除了checkout_cart_product_add_after只调用一个项目,checkout_cart_update_items_after调用购物车中的所有项目。此代码仅作为示例分离/复制为2个方法。

对于可配置产品,您需要检查$item->getParentItem(),如该答案中的示例代码所示:

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

Event: 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);
         }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.