2012-07-02 2 views
1

Я хотел бы обновить вес моей позиции котировки, когда добавляю продукт в свою корзину на пурпуре.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

Вам необходимо сохранить цитату или корзину, а не пункт котировки. Try:

$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 событие. Это событие вызывается по каждому запросу после того, как элемент Quote задает свой продукт. Так вы можете изменить цену и вес на пользовательские значения.

/* 
* 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/Quote в app/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

Смежные вопросы