2016-05-18 3 views
1

У меня есть немного пользовательских цен, которые должны быть выполнены для каждого продукта в заказе, который изменяет конечную цену товара.Magento | Update Item Price in Quote Loop

Я использую наблюдателя с событием sales_quote_item_qty_set_after, чтобы гарантировать, что цена будет выполняться каждый раз, когда продукт будет перенастроен, так как я не смог получить желаемые результаты от других событий.

Проблема, с которой я сталкиваюсь, заключается в невозможности изменить цену продукта в котировке при прохождении цикла с использованием ->getAllItems().

Я знаю, что цена может быть переопределена через следующие события для добавления продукта.

$_item = $obs->getQuoteItem(); 
$_item = ($_item->getParentItem() ? $_item->getParentItem() : $_item); 
$new_price = 1000; 
$_item->setCustomPrice($new_price); 
$_item->setOriginalCustomPrice($new_price); 
$_item->getProduct()->setIsSuperMode(true); 

Однако, я не могу найти способ сделать это, пробегая элементы котировки внутри тележки. Возможно ли это, или цена должна быть сделана другим наблюдателем, и если да, то какой?

Полный код ниже ...

public function adminAddProduct(Varien_Event_Observer $obs) { 
    $quote = $this->_getSession()->getQuote(); 
    foreach($quote->getAllItems() as $_item){ 
     $options = $_item->getProduct()->getTypeInstance(true)->getOrderOptions($_item->getProduct()); 
     $_product = $_item->getProduct(); 
     $sku = $options['simple_sku']; 
     if ($sku) { 
      $tierPrices = $_product->getTierPrice(); 
      $price = $_item->getPrice(); 
      $qty = $options['info_buyRequest']['qty']; 

      $product = Mage::getModel('catalog/product')->loadByAttribute('sku',$sku); 
      $runspeed = $product->getResource()->getAttribute('runspeed')->getFrontend()->getValue($product); 

      $prodOpts = []; 
      foreach($options['options'] as $option) { 
       $prodOpts[$option['label']] = $option['value']; 
      } 

      $index = 0; 
      foreach($tierPrices as $tierPrice) { 
       if($tierPrice['price_qty'] <= $qty && $tierPrices[$index + 1]['price_qty'] > $qty) { 
        $price = $tierPrice['price']; 
       } 
       //$prodTiers[$tierPrice['price_qty']] = $tierPrice['price']; 
      } 

      if($prodOpts['Quantity'] == 'Fixed Quantity' && array_key_exists('Quantity Select', $prodOpts)){ 
       $qty = str_replace(',', '', explode(" ", $prodOpts['Quantity Select'])[0]); 
      } else { 
       $qty = 1; 
      } 

      $_item->setQty($qty); 
      $_item->setCustomPrice($customPrice)->setOriginalCustomPrice($customPrice); 

      $new_price = 999; 

      $_item->setPrice($new_price); 
      $_item->setCustomPrice($new_price); 
      $_item->setOriginalCustomPrice($new_price); 
      $_item->save(); 

      Mage::log($price); 
      Mage::log($prodOpts); 
     } 
    } 
} 

Любая помощь приветствуется.

+0

Пожалуйста, разместите это как ответ, чтобы его можно было принять, это работает отлично. – Sidriel

ответ

1

Вы можете попробовать $quote->save() в конце своей функции.