2012-07-18 15 views
11

、次のコードは、Magentoはどこにお見積もり商品の価格を設定しますか?あなたはMagentoの中で、カートのページをロードするたびに

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

を実行しているこれの1つの副作用は、製品の価格が更新されている場合はカート内のすべてのアイテムの価格が更新されているということです。これは実際にsales_flat_quote_itemのエントリを更新します。私はコードののどこに価格が各見積もり項目で更新され、各見積もり項目が保存されているかを追跡しようとしています。

私はそれができるmyrid場所を知っています。私は誰かが実際にどこに設定されていることを知ってほしいと思っています。すべてのバージョンからの情報は歓迎しますが、特にMagento 1.7xブランチ。

答えて

15

ハイレベルから、全体のプロセスを起動するコードは、ライン464とMage_Checkout_Model_Cartの465です:

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

新製品の価格は_initItem方法でMage_Sales_Model_Quote_Address_Total_Subtotalに引用に対して設定されています。 if/else文の行104から始まる$item->setPriceが表示されます

+1

分で私を打つ! –

+0

ハ - 申し訳ありません:) - しかし、より詳細な回答のために+1 –

1

これはすべてのことを助けてくれるのかどうかは分かりませんが、コアクラスを拡張したり変更したりするのではなく、カート内の製品に対してカスタム価格の変更をしようとしている場合は、オブザーバーsales_quote_save_beforeを使用します。価格設定をカスタマイズしようとすると効果的です(特にカスタムの長さにできる製品がある場合)。あなたがそれらを望むなら、私はコード例を持っています。

しかし、私はここのアラン・ストームと話しているので、あなたは私の過度に単純な答えを笑っているかもしれません。

+0

良いアドバイスは一般的に+1ですが、今日はいくつかの新しい記事のために難解な実装の詳細を扱っています。 –

23

これを自分自身で掘り下げてください。したがって、この

#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; 
} 

につながるこの

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

がありますgetTotalCollectorオブジェクトがglobal/sales/quote/totalsからコレクタ一連のモデルをロードし、それらにcollectを呼び出しsales/quote_address_total_collectorオブジェクトを返します。サブトータルコレクター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

関連する問題