Magento在哪里设定报价项目的价格?

Ala*_*orm 11 php oop magento

每当您在Magento中加载购物车页面时,都会运行以下代码

$cart->init();
$cart->save(); 
Run Code Online (Sandbox Code Playgroud)

这样做的一个副作用是,如果产品的价格已经更新,则更新购物车中任何商品的价格.这实际上更新了条目sales_flat_quote_item.我正在尝试追踪代码中每个报价项目的价格更新位置以及每个报价项目的保存位置.

我知道它可以设置的myrid位置.我希望有人知道它实际上在哪里设置.Magento 1.7x分支专门,虽然欢迎来自所有版本的信息.

Ala*_*orm 23

自己挖这个.所以就是这样

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

这导致了这一点

#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;
}
Run Code Online (Sandbox Code Playgroud)

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());
    }    
    //...
}
Run Code Online (Sandbox Code Playgroud)

这是报价项目得到它的价格设定/休息的地方.

  • 来这里说同样的话.期待<strike> Magento </ strike>深奥的文章. (2认同)

Dre*_*ter 15

从高层次来看,启动整个过程的代码是:第464和465行Mage_Checkout_Model_Cart:

 $this->getQuote()->collectTotals();
 $this->getQuote()->save();
Run Code Online (Sandbox Code Playgroud)

新产品价格是Mage_Sales_Model_Quote_Address_Total_Subtotal根据_initItem方法中的报价设置的.您将$item->setPrice在第104行开始的if/else语句中看到