2013-01-16 43 views
1

以编程方式更新购物车我正在接入sales_quote_save_after事件清除程序。首先作为测试,我试图让购物车中的物品变成0,然后我会在其他方面进行修改。Magento:通过事件

我遇到了麻烦。我可以改变单位价格没有问题,但是当我重新计算购物车总数时,价格将恢复到原始价格。

public function sales_quote_save_before($observer) { 

    if (Mage::registry('basket_observer_executed')) { 
     return $this; 
    } 

    $quote = $observer->getEvent()->getQuote(); 

    foreach ($quote->getAllItems() as $item) { 
     if($item->getId()) {  
      $item->setCustomPrice(0); 
     } 
    } 

    Mage::register('basket_observer_executed', true); 

    $quote->save(); 
    $quote->setTotalsCollectedFlag(false)->collectTotals(); 
} 

任何人都可以指向我维持新的价格,同时重新计算总数?

+1

你在quote_save_before或quote_save_after触发呢?你的问题说_after,但你的功能被命名为_before。 另外你为什么要确保这只运行一次?从内存来看,我相信save事件会被多次调用,所以在你的句柄运行后,它可能会被后来的Magento代码重置。 – ScottSB

回答

8

我想尝试使用不同的事件。我总是用checkout_cart_save_after做类似actions.Using我提到的事件,使用下面的代码:

$cart = $observer->getData('cart'); 

$quote = $cart->getData('quote'); 

$items = $quote->getAllVisibleItems(); 

foreach($items as $item) 
{ 
    $item->setCustomPrice(0); 
    $item->setOriginalCustomPrice(0); 
    $item->getProduct()->setIsSuperMode(true); 
    $item->save(); 
} 
$quote->save(); 
$quote->setTotalsCollectedFlag(false)->collectTotals(); 
+0

谢谢,这个工程。我确实需要添加'''$ quote-> setTotalsCollectedFlag(false) - > collectTotals();'''来重新计算总数 – iamjonesy