系统学习magento二次开发,推荐小册:《Magento中文全栈二次开发 》
本小册面向Magento2以上版本,书代码及示例兼容magento2.0-2.4版本。涵盖了magento前端开发,后端开发,magento2主题,magento2重写,magento2 layout,magento2控制器,magento2 block等相关内容,带领您成为magento开发技术专家。
防止在Magento 2中多次将同一产品添加到购物车的步骤:
步骤1:首先,转到以下路径
app\code\Vendor\Extension\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\Checkout\Model\Cart"> <plugin disabled="false" name="Vendor_Extension_Plugin_Magento_Checkout_Cart_BeforeAddToCartProduct" type="Vendor\Extension\Plugin\Magento\Checkout\Cart\BeforeAddToCartProduct"/> </type> </config>
步骤2:现在,移至以下路径
app\code\Vendor\Extension\Plugin\Magento\Checkout\Cart\BeforeAddToCart.php
并添加下面提到的代码
<?php
declare(strict_types=1);
namespace Vendor\Extension\Plugin\Magento\Checkout\Cart;
use Magento\Checkout\Model\Cart;
use Magento\Checkout\Model\Session;
use Magento\Catalog\Model\Product;
use Magento\Checkout\Model\Session\Proxy as SessionProxy;
use Magento\Framework\Message\ManagerInterface;
use Magento\ConfigurableProduct\Model\Product\Type\Configurable;
use Magento\Framework\UrlInterface;
class BeforeAddToCartProduct
{
private $messageManager;
private $cartSession;
private $configurableProduct;
private $url;
private $session;
public function __construct(
Configurable $configurableProduct,
ManagerInterface $messageManager,
SessionProxy $cartSession,
UrlInterface $url,
Session $session)
{
$this->messageManager = $messageManager;
$this->cartSession = $cartSession;
$this->configurableProduct = $configurableProduct;
$this->url = $url;
$this->session = $session;
}
public function beforeAddProduct(Cart $subject, $productInfo, $requestInfo=null)
{
$enableProductCartControl=true;
$product = null;
$parentProduct=null;
if ($productInfo instanceof Product)
{
$product = $productInfo;
if (!$product->getId())
{
throw new \Magento\Framework\Exception\LocalizedException(
__("This product wasn't found. Verify the product and try again.")
);
}
}
if ($product)
{
// For Simple Product
if ($product->getTypeId()==='configurable')
{
if (isset($requestInfo['super_attribute']))
{
$parentProduct=$product;
$childProduct = $this->configurableProduct->getProductByAttributes($requestInfo['super_attribute'] ,$product);
// change $product to child
$product=$childProduct;
}
}
if ($product && $enableProductCartControl)
{
// For check product is in cart or not
if($this->cartSession->getQuote()->hasProductId($product->getId()))
{
// Redirection to the cart page
$this->session->setRedirectUrl($this->url->getUrl('checkout/cart/index'));
throw new \Magento\Framework\Exception\LocalizedException(
__("[x] This product is already in the cart. Testing, testing : ". $product->getSku())
);
}
}
}
return [$productInfo, $requestInfo];
}
/**
* Get request for product add to cart procedure
*
* @param \Magento\Framework\DataObject|int|array $requestInfo
* @return \Magento\Framework\DataObject
* @throws \Magento\Framework\Exception\LocalizedException
*/
private function _getProductRequest($requestInfo)
{
if ($requestInfo instanceof \Magento\Framework\DataObject)
{
$request = $requestInfo;
}
elseif (is_numeric($requestInfo))
{
$request = new \Magento\Framework\DataObject(['qty' => $requestInfo]);
}
elseif (is_array($requestInfo))
{
$request = new \Magento\Framework\DataObject($requestInfo);
}
else
{
throw new \Magento\Framework\Exception\LocalizedException(
__('We found an invalid request for adding product to quote.')
);
}
return $request;
}
}结论:
因此,通过上述步骤,您可以防止在Magento 2中多次将同一产品添加到购物车。