W niestandardowym rozszerzeniu musisz utworzyć wtyczkę „Around”.
app / code / MageKnight / Quote / etc / module.xml
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
<module name="MageKnight_Quote">
<sequence>
<module name="Magento_Quote"/>
</sequence>
</module>
</config>
app / code / MageKnight / Quote / register.php
<?php
use \Magento\Framework\Component\ComponentRegistrar;
ComponentRegistrar::register(ComponentRegistrar::MODULE, 'MageKnight_Quote', __DIR__);
app / code / MageKnight / Quote / etc / di.xml
<?xml version="1.0" ?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<type name="Magento\Quote\Api\CartManagementInterface">
<plugin name="mergeGuestCart"
type="MageKnight\Quote\Plugin\Model\CartManagement"/>
</type>
</config>
app / code / MageKnight / Quote / Plugin / Model / CartManagement.php
<?php
namespace MageKnight\Quote\Plugin\Model;
use Magento\Framework\Exception\StateException;
/**
* Class CartManagement
*/
class CartManagement
{
/**
* @var \Magento\Quote\Api\CartRepositoryInterface
*/
protected $quoteRepository;
/**
* @var \Magento\Customer\Api\CustomerRepositoryInterface
*/
protected $customerRepository;
/**
* @var \Magento\Customer\Model\CustomerFactory
*/
protected $customerModelFactory;
/**
* @var \Magento\Quote\Model\QuoteIdMaskFactory
*/
private $quoteIdMaskFactory;
/**
* @param \Magento\Quote\Api\CartRepositoryInterface $quoteRepository
* @param \Magento\Customer\Api\CustomerRepositoryInterface $customerRepository
* @param \Magento\Customer\Model\CustomerFactory $customerModelFactory
* @param \Magento\Quote\Model\QuoteIdMaskFactory $quoteIdMaskFactory
*/
public function __construct(
\Magento\Quote\Api\CartRepositoryInterface $quoteRepository,
\Magento\Customer\Api\CustomerRepositoryInterface $customerRepository,
\Magento\Customer\Model\CustomerFactory $customerModelFactory,
\Magento\Quote\Model\QuoteIdMaskFactory $quoteIdMaskFactory
) {
$this->quoteRepository = $quoteRepository;
$this->customerRepository = $customerRepository;
$this->customerModelFactory = $customerModelFactory;
$this->quoteIdMaskFactory = $quoteIdMaskFactory;
}
/**
* Around plugin to assign customer to guest cart
*
* @param \Magento\Quote\Api\CartManagementInterface $subject
* @param callable $proceed
* @param int $cartId The cart ID.
* @param int $customerId The customer ID.
* @param int $storeId
* @return boolean
*/
public function aroundAssignCustomer(
\Magento\Quote\Api\CartManagementInterface $subject,
callable $proceed,
$cartId,
$customerId,
$storeId
) {
$quote = $this->quoteRepository->getActive($cartId);
$customer = $this->customerRepository->getById($customerId);
$customerModel = $this->customerModelFactory->create();
if (!in_array($storeId, $customerModel->load($customerId)->getSharedStoreIds())) {
throw new StateException(
__("The customer can't be assigned to the cart. The cart belongs to a different store.")
);
}
if ($quote->getCustomerId()) {
throw new StateException(
__("The customer can't be assigned to the cart because the cart isn't anonymous.")
);
}
try {
$customerActiveQuote = $this->quoteRepository->getForCustomer($customerId);
} catch (\Magento\Framework\Exception\NoSuchEntityException $e) {
$customerActiveQuote = false;
}
if ($customerActiveQuote) {
/** Merge carts */
$quote->merge($customerActiveQuote);
$this->quoteRepository->delete($customerActiveQuote);
}
$quote->setCustomer($customer);
$quote->setCustomerIsGuest(0);
$quote->setStoreId($storeId);
$quote->setIsActive(1);
/** @var \Magento\Quote\Model\QuoteIdMask $quoteIdMask */
$quoteIdMask = $this->quoteIdMaskFactory->create()->load($cartId, 'quote_id');
if ($quoteIdMask->getId()) {
$quoteIdMask->delete();
}
$this->quoteRepository->save($quote);
return true;
}
}