Обновить цену товара в корзине после сбора итогов magento2

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

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

попробуйте удалить $ quote-> setTotalsCollectedFlag (false); или вызовите $ quote-> collectTotals (); после того, как вы изменили цену

AlexanderPop 17.01.2020 23:02

Спасибо, @AlexanderPop, ты спас меня .. $ quote-> setTotalsCollectedFlag (false); этот бит был критической частью.

nuwaus 24.04.2021 10:06

@nuwaus хорошо. Рад, что это было полезно. Добавлено как ответ. пожалуйста, отметьте это как полезное, если оно вам помогло

AlexanderPop 25.04.2021 18:48
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
3
3 878
1

Ответы 1

попробуйте удалить $ quote-> setTotalsCollectedFlag (false); или вызовите $ quote-> collectTotals (); после того, как вы изменили цену. Я вижу, это помогло некоторым людям

Другие вопросы по теме