2012-07-18 52 views
11

,下面的代碼運行的這Magento在哪裏設置報價項目的價格?每當你在Magento裝載車頁面

$cart->init(); 
$cart->save(); 

一個副作用是,如果產品的價格已經更新在車中的所有商品的價格進行更新。這實際上更新了sales_flat_quote_item中的條目。我正在嘗試追蹤代碼的價格是否在每個報價項目上更新,以及每個報價項目的保存位置。

我知道myrid的位置它可能被設置。我希望有人知道它實際設置的位置。 Magento 1.7x分支明確,雖然來自所有版本的信息是受歡迎的。

回答

15

從高電平,啓動全過程的代碼是線464和465 Mage_Checkout_Model_Cart

$this->getQuote()->collectTotals(); 
$this->getQuote()->save(); 

該新產品價格以_initItem方法被設置針對報價中Mage_Sales_Model_Quote_Address_Total_Subtotal。你會在第104行開始的if/else語句中看到$item->setPrice

+1

打了我一分鐘! – 2012-07-18 20:25:16

+0

哈 - 對不起:) - 雖然+1更詳細的答案 – 2012-07-18 20:27:37

1

我不知道這是否對您有所幫助,但如果您試圖對購物車中的產品進行自定義價格更改,而不是擴展和修改核心類,那麼我使用觀察者sales_quote_save_before。如果您嘗試定製定價(尤其是當我有可定製長度的產品時),它會很好。我有代碼示例,如果你想要他們。

但我在這裏和Alan Alan Storm交談,所以你可能會嘲笑我過於簡單的回答。

+0

良好的建議,一般所以+1,但我現在專門在深奧的實施細節今天的一些新的文章。 – 2012-07-18 20:18:27

23

自己挖了一個。因此,有這個

#File: app/code/core/Mage/Sales/Model/Quote.php 
foreach ($this->getAllAddresses() as $address) { 
    ... 
    $address->collectTotals(); 
    ... 
}  

導致該

#File: app/code/core/Mage/Sales/Model/Quote/Address.php 
public function collectTotals() 
{ 
    Mage::dispatchEvent($this->_eventPrefix . '_collect_totals_before', array($this->_eventObject => $this)); 
    foreach ($this->getTotalCollector()->getCollectors() as $model) { 
     $model->collect($this);    
    } 
    Mage::dispatchEvent($this->_eventPrefix . '_collect_totals_after', array($this->_eventObject => $this)); 
    return $this; 
} 

getTotalCollector對象返回sales/quote_address_total_collector對象,它加載從global/sales/quote/totals一系列收集模型並對其調用collect。子總集熱的collect方法最終調用這個

#File: app/code/core/Mage/Sales/Model/Quote/Address/Total/Subtotal.php 
protected function _initItem($address, $item) 
{ 
    //... 
    if ($quoteItem->getParentItem() && $quoteItem->isChildrenCalculated()) { 
     $finalPrice = $quoteItem->getParentItem()->getProduct()->getPriceModel()->getChildFinalPrice(
      $quoteItem->getParentItem()->getProduct(), 
      $quoteItem->getParentItem()->getQty(), 
      $quoteItem->getProduct(), 
      $quoteItem->getQty() 
     ); 
     $item->setPrice($finalPrice) 
      ->setBaseOriginalPrice($finalPrice); 
     $item->calcRowTotal(); 
    } else if (!$quoteItem->getParentItem()) { 
     $finalPrice = $product->getFinalPrice($quoteItem->getQty()); 
     $item->setPrice($finalPrice) 
      ->setBaseOriginalPrice($finalPrice); 
     $item->calcRowTotal(); 
     $this->_addAmount($item->getRowTotal()); 
     $this->_addBaseAmount($item->getBaseRowTotal()); 
     $address->setTotalQty($address->getTotalQty() + $item->getQty()); 
    }  
    //... 
} 

而這正是報價項獲得它的價格設定/休息。

+2

來到這裏說相同。期待Magento深奧的文章。 – benmarks 2012-07-18 20:43:29