Обновление цены товара в корзине после сбора итогов magento2 - PullRequest
0 голосов
/ 24 октября 2018

Я пытаюсь обновить цену товара в корзине, зависит от итоговой суммы.Я заставил наблюдателя изменить цену перед сохранением корзины.Моя проблема в том, что значения для измененных элементов изменяются не вовремя.Пример:

У меня есть два товара в корзине # 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;
}
...