11

Magentoでカートページをロードするたびに、次のコードが実行されます

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

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

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

4

3 に答える 3

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());
    }    
    //...
}

これは、見積もりアイテムが価格設定/残りを取得する場所です。

于 2012-07-18T20:19:08.667 に答える
15

大まかに言うと、プロセス全体を開始するコードは、次の行464と465ですMage_Checkout_Model_Cart

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

Mage_Sales_Model_Quote_Address_Total_Subtotal新製品の価格は、_initItemメソッドの見積もりに対して設定されています。$item->setPrice104行目から始まるif/elseステートメントに表示されます。

于 2012-07-18T20:17:48.770 に答える
1

コアクラスを拡張および変更するのではなく、カート内の商品のカスタム価格変更を行おうとしている場合は、オブザーバーsales_quote_save_beforeを使用します。価格設定をカスタマイズしようとしている場合(特に、カスタムの長さにできる製品がある場合)に最適です。

于 2012-07-18T20:03:24.483 に答える