Magento 2 : Check log in customer email id while applying coupon code on cart
-
17-03-2021 - |
Question
I want to check customer's email id when he is applying coupon code on cart page.
If customer email is valid for that coupon then coupon code will be apply otherwise display an error.
For this, i tried to overwrite CouponPost.php
controller but getting an error like "Type Error occurred when creating object: Vendor\Test\Controller\Cart\CouponPost\Interceptor
"
Solution
To override your CouponPost.php
controller file you can add preference
in di.xml file here..
app/code/Vendor/Module/etc/di.xml
Content for this file is..
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<preference for="Magento\Checkout\Controller\Cart\CouponPost" type="Vendor\Module\Controller\Cart\CouponPost" />
</config>
app/code/Vendor/Module/Controller/Cart/CouponPost.php
Content for this file is..
<?php
namespace Vendor\Module\Controller\Cart;
class CouponPost extends \Magento\Checkout\Controller\Cart\CouponPost
{
public function __construct(
\Magento\Framework\App\Action\Context $context,
\Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
\Magento\Checkout\Model\Session $checkoutSession,
\Magento\Store\Model\StoreManagerInterface $storeManager,
\Magento\Framework\Data\Form\FormKey\Validator $formKeyValidator,
\Magento\Checkout\Model\Cart $cart,
\Magento\SalesRule\Model\CouponFactory $couponFactory,
\Magento\Quote\Api\CartRepositoryInterface $quoteRepository
) {
parent::__construct(
$context,
$scopeConfig,
$checkoutSession,
$storeManager,
$formKeyValidator,
$cart,
$couponFactory,
$quoteRepository
);
}
public function execute()
{
$couponCode = $this->getRequest()->getParam('remove') == 1
? ''
: trim($this->getRequest()->getParam('coupon_code'));
$cartQuote = $this->cart->getQuote();
$oldCouponCode = $cartQuote->getCouponCode();
$codeLength = strlen($couponCode);
if (!$codeLength && !strlen($oldCouponCode)) {
return $this->_goBack();
}
try {
$isCodeLengthValid = $codeLength && $codeLength <= \Magento\Checkout\Helper\Cart::COUPON_CODE_MAX_LENGTH;
$itemsCount = $cartQuote->getItemsCount();
if ($itemsCount) {
$cartQuote->getShippingAddress()->setCollectShippingRates(true);
$cartQuote->setCouponCode($isCodeLengthValid ? $couponCode : '')->collectTotals();
$this->quoteRepository->save($cartQuote);
}
if ($codeLength) {
$escaper = $this->_objectManager->get(\Magento\Framework\Escaper::class);
$coupon = $this->couponFactory->create();
$coupon->load($couponCode, 'code');
if (!$itemsCount) {
if ($isCodeLengthValid && $coupon->getId()) {
$this->_checkoutSession->getQuote()->setCouponCode($couponCode)->save();
$this->messageManager->addSuccessMessage(
__(
'You used coupon code "%1".',
$escaper->escapeHtml($couponCode)
)
);
} else {
$this->messageManager->addErrorMessage(
__(
'The coupon code "%1" is not valid.',
$escaper->escapeHtml($couponCode)
)
);
}
} else {
if ($isCodeLengthValid && $coupon->getId() && $couponCode == $cartQuote->getCouponCode()) {
$this->messageManager->addSuccessMessage(
__(
'You used coupon code "%1".',
$escaper->escapeHtml($couponCode)
)
);
} else {
$this->messageManager->addErrorMessage(
__(
'The coupon code "%1" is not valid.',
$escaper->escapeHtml($couponCode)
)
);
}
}
} else {
$this->messageManager->addSuccessMessage(__('You canceled the coupon code.'));
}
} catch (\Magento\Framework\Exception\LocalizedException $e) {
$this->messageManager->addErrorMessage($e->getMessage());
} catch (\Exception $e) {
$this->messageManager->addErrorMessage(__('We cannot apply the coupon code.'));
$this->_objectManager->get(\Psr\Log\LoggerInterface::class)->critical($e);
}
return $this->_goBack();
}
}
Hope it will help you!
OTHER TIPS
If you are getting this Error
Type Error occurred when creating object: Vendor\Test\Controller\Cart\CouponPost\Interceptor
Simply Run this COmmand
php bin/magento setup:upgrade
chmod -R 0777 var/ pub/ generated/