2012-07-02 33 views
1

我想在我的购物车中添加magento商品时,更新报价商品的重量。Magento:更新报价商品的重量

我试过这段代码:

public function checkoutCartProductAddAfter(Varien_Event_Observer $observer) 
{ 
    $event = $observer->getEvent(); 
    $quote_item = $event->getQuoteItem(); 
    $myWeight = ($quote_item->getWeight()/100)*$number; 
    $quote_item->setWeight($myWeight); 
    $quote_item->save(); 
} 

但它不工作。我更新了 相同功能中的报价项目的价格,它可以工作。

有人知道为什么我的新体重不适用?

+0

'$ number'从哪里来? – vicch

+0

这是一个自定义选项的整数,但我知道它的工作原因,我可以显示它。如果在这个函数的末尾,我会回显getWeight();我有myWeight(我想要设置的正确值),但是如果我看看我的数据库:在表“sales_flat_quote_item”中,旧的权重是保存的。 – chocobob

+0

你为什么要修改报价产品的重量而不是产品的重量? – nachito

回答

1

您需要保存报价或购物车不是报价项目。 尝试:

$quote_item->getQuote()->save(); 

Mage::getSingleton('checkout/cart')->save(); 
+0

我已经快速尝试此操作,结果是一样的,它不会在结帐步骤中更改重量。我会尝试,直到它的工作,但有人知道女巫的价值是用在数据库中显示购物车的重量? – chocobob

0

,你可以在这里品尝我的代码。在sidebar.phtml

<?php 
$items = Mage::getSingleton('checkout/cart')->getQuote() 
    ->getItemsCollection()->getItems(); 
$product = Mage::getModel('catalog/product'); 
$total_weight = 0; 
foreach ($items as $item) { 
    $product = $item->getProduct(); 
    $qty = $item->getQty(); 
    $weight = $item->getWeight(); 
    if ($product->isConfigurable()) { 
     $total_weight += ($weight * ($qty - 1)); 
    } else { 
     $total_weight += ($weight * $qty); 
    }; 
} 
?> 


<div><strong>Total Weight</strong></div> 
</div><strong><?php echo $total_weight;?> KG</strong></div> 
+0

这里需要一些解释,如果你有问题的原因,为什么它不工作,他应该怎么做,需要做什么改变。 – Hamad

+1

这个答案只是获得一个值显示在前端。值不会在报价单上设置以供以后检索。 @aditcov你甚至读过这个问题吗? – pspahn

3

使用sales_quote_item_set_product事件。在报价项目设置其产品后,每次请求都会调用此事件。 这是如何将价格和重量更改为自定义值的方法。

/* 
* Called on every request, updates item after loaded from session 
*/ 
public function updateItem(Varien_Event_Observer $observer) 
{ 
    $item = $observer->getQuoteItem(); 
    if ($item->getParentItem()) { 
     $item = $item->getParentItem(); 
    } 

    // set price 
    $item->setCustomPrice($customPrice); 
    $item->setOriginalCustomPrice($customPrice); 
    $item->getProduct()->setIsSuperMode(true); 

    // set weight 
    $item->setWeight($customWeight); 
} 

希望它能帮助:)

+0

添加到购物车时,重量似乎不会持续在报价单上。在我的观察者的'setWeight()'方法中,我添加了一个日志文件来记录报价项的重量。如果在添加到购物车时使用'tail -f mylog.log',它会正确记录自定义重量,但接下来会触发观察者方法,并将重量设置为零。 – pspahn

+0

皮尔,从不知道。我基于产品上动态设置的一些值来计算权重Calc。由于这些值永远不会*保存到产品中,因此在第一次请求后它们不会保留。我将它们保存到报价项目中(我已经添加了一个额外的列)。 – pspahn

1

你所观察的右事件

checkout_cart_product_add_after 

没有必要做这个,你可以从你的函数删除此

$quote_item->save(); 

但加这个

$quote_item->getProduct()->setIsSuperMode(true); 

现在你的函数应该读作

public function checkoutCartProductAddAfter(Varien_Event_Observer $observer) 
{ 
    $event = $observer->getEvent(); 
    $quote_item = $event->getQuoteItem(); 
    $myWeight = ($quote_item->getWeight()/100)*$number; 

    $quote_item->getProduct()->setIsSuperMode(true); 

    $quote_item->setWeight($myWeight); 
} 

需要被这样做,它并没有写在原有产品的重量表sales_flat_quote_item最主要的是给item.php文件复制从app/code/core/Mage/Sales/Model/Quoteapp/code/local/Mage/Sales/Model/Quote和删除以下行(v1.9 CE)行#390

->setWeight($this->getProduct()->getWeight()) 

现在它应该像一个魅力。试过并测试过

+0

只是FYI给任何人看上面的答案,它是一种享受。有一个错字 - 要编辑并移动到本地文件夹的文件是/app/code/core/Mage/Sales/Model/Quote/Item.php – PixieMedia

相关问题