每当您在Magento中加载购物车页面时,都会运行以下代码
$cart->init();
$cart->save();
这样做的一个副作用是,如果产品价格已更新,则更新购物车中任何商品的价格。这实际上更新了sales_flat_quote_item
中的条目。我正在尝试跟踪每个报价项目中代码的价格更新位置以及每个报价项目的保存位置。
我知道可以设置的myrid位置。我希望有人知道它实际上在哪里设置。 Magento 1.7x分支专门,虽然欢迎来自所有版本的信息。
答案 0 :(得分: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());
}
//...
}
这是报价项目得到它的价格设定/休息的地方。
答案 1 :(得分:15)
从较高层面来看,启动整个过程的代码是Mage_Checkout_Model_Cart
的第464和465行:
$this->getQuote()->collectTotals();
$this->getQuote()->save();
新产品价格是根据Mage_Sales_Model_Quote_Address_Total_Subtotal
方法中_initItem
的报价设置的。您将在从第104行开始的if / else语句中看到$item->setPrice
答案 2 :(得分:1)
我不知道这对你有多大帮助,但如果你试图对购物车中的产品进行自定义价格更改,而不是扩展和修改核心类,我会使用观察者sales_quote_save_before。如果您尝试自定义定价(特别是当我的产品可以定制长度时),它会很有效。如果你需要,我有代码示例。
但是我在这里和艾伦风暴说话,所以你可能会笑我过于简单的回答。