Как остановить слияние не вошедших в корзину товаров при входе клиента в систему?
Я не хочу объединять товары в корзине, если у пользователя есть товары в корзине и он входит на сайт.
Давайте рассмотрим сценарий:
- Пользователь входит в систему, добавляет один товар в корзину и выходит с сайта.
- Теперь в качестве гостя он добавляет в корзину 2 товара.
- Он снова заходит на сайт и видит 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);
}
}
}
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
в репозитории не обновляет коллекцию элементов цитаты фактического объекта цитаты.