Я пытаюсь обновить корзину, цена товара зависит от общей суммы предложения. Я сделал наблюдателя, чтобы изменить цену до сохранения корзины. Моя проблема в том, что значения измененных элементов меняются не вовремя. Пример:
У меня есть два товара в корзине №1 товар - 150 долларов, №2 товар - 10 долларов, когда я меняю количество первого товара, общая сумма этого товара устанавливается на 300 долларов (это нормально), однако цена товара №2 изменяется на 0 (это хорошо), но в базе данных я все еще вижу price, base_price, row_total, base_row_total, price_incl_tax, base_price_incl_tax, row_total_incl_tax, base_row_incl_tax
со значениями в 10 долларов. Когда я снова меняю количество Предмета №1, Предмет №2 меняет цену на 10 долларов, но значения в базе данных теперь установлены на 0. Где и как мне изменить цену, чтобы иметь правильные данные в базе данных?
Вот мой код:
events.xml:
<event name = "checkout_cart_save_before">
<observer name = "Vendor::save_cart” instance = "Vendor\Observer\BeforeCartSaveObserver" shared = "false"/>
</event>
Наблюдатель:
public function execute(\Magento\Framework\Event\Observer $observer)
{
$cart = $observer->getCart();
$quote = $this->checkoutSession->getQuote();
$quote->collectTotals();
$quote->setTotalsCollectedFlag(false);
foreach ($quote->getAllVisibleItems() as $item) {
$product = $item->getProduct();
if (!$product->getIsFree()) {
continue;
}
$freeItem = $item;
break;
}
if ($quote->getGrandTotal() > 240) {
$item->setCustomPrice(0)
->setOriginalCustomPrice(0)
->getProduct()->setIsSuperMode(true);
} else {
$product = $freeItem->getProduct();
$defaultProductPrice = $product->getPriceInfo()
->getPrice('regular_price')
->getAmount()
->getBaseAmount();
$item->setConvertedPrice($defaultProductPrice)
->setCustomPrice($defaultProductPrice)
->setOriginalCustomPrice($defaultProductPrice);
$item->setPrice($defaultProductPrice)->setBaseOriginalPrice($item->getProduct()->getPrice());
}
$item->calcRowTotal();
return $this;
}
Спасибо, @AlexanderPop, ты спас меня .. $ quote-> setTotalsCollectedFlag (false); этот бит был критической частью.
@nuwaus хорошо. Рад, что это было полезно. Добавлено как ответ. пожалуйста, отметьте это как полезное, если оно вам помогло
попробуйте удалить $ quote-> setTotalsCollectedFlag (false); или вызовите $ quote-> collectTotals (); после того, как вы изменили цену. Я вижу, это помогло некоторым людям
попробуйте удалить $ quote-> setTotalsCollectedFlag (false); или вызовите $ quote-> collectTotals (); после того, как вы изменили цену