Как остановить слияние не вошедших в корзину товаров при входе клиента в систему?


Я не хочу объединять товары в корзине, если у пользователя есть товары в корзине и он входит на сайт.

Давайте рассмотрим сценарий:

  1. Пользователь входит в систему, добавляет один товар в корзину и выходит с сайта.
  2. Теперь в качестве гостя он добавляет в корзину 2 товара.
  3. Он снова заходит на сайт и видит 3 элемента.

Чего я пытаюсь достичь?: Что я хочу сделать, так это, когда он войдет на сайт, элемент, который был там в его корзина до входа в систему не должна быть объединена, и после входа в систему он должен видеть только 1 товар в корзине.

Я заметил событие sales_quote_merge_before, как указано ниже, и удалил цитату гостя-пользователя, тем не менее, эти товары видны в корзине после входа в систему.

Etc/frontend/events.xml

<?xml version="1.0" encoding="UTF-8"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
    <event name="sales_quote_merge_before">
        <observer name="validate_quote_befor_merge" instance="Vendor\Module\Observer\QuoteBeforeMerge" />
    </event>
</config>

QuoteBeforeMerge.php

<?php

namespace Vendor\Module\Observer;

use Magento\Framework\Event\Observer;
use Magento\Framework\Event\ObserverInterface;
use Magento\Quote\Model\QuoteRepository;

class QuoteBeforeMerge implements ObserverInterface
{

    /**
     * @var QuoteRepository
     */
    private $quoteRepository;

    public function __construct(
        QuoteRepository $quoteRepository
    )
    {
        $this->quoteRepository = $quoteRepository;
    }

    /**
     * @param Observer $observer
     * @return void
     */
    public function execute(Observer $observer)
    {
        if ($observer->getSource()->hasItems()) {
            $currentQuote = $observer->getSource();
            $quoteId = $currentQuote->getId();
            $quote = $this->quoteRepository->get($quoteId);
            $this->quoteRepository->delete($quote);
        }
    }
}
Author: Arunprabakaran M, 2019-03-28

1 answers

Вы должны удалить элементы из объекта цитаты, переданного наблюдателю, потому что это то, что используется в методе слияния. Цитата не загружается из репозитория снова после выполнения вашего кода. Добавьте следующий код в свой метод выполнения:

// If you want to remove guest cart item from merged cart
//event: sales_quote_merge_after
$currentQuote = $observer->getSource();


// If you want to remove customer (old) cart item from merged cart
//event: sales_quote_merge_before
$currentQuote = $observer->getQuote();

foreach ($currentQuote->getAllVisibleItems() as $item) {
    $currentQuote->removeItem($item->getId());
}
//alternatively this should also work:
$currentQuote->removeAllItems();

Я предполагаю, что операция delete в репозитории не обновляет коллекцию элементов цитаты фактического объекта цитаты.

 2
Author: HelgeB, 2020-10-09 07:44:19