I try to override module-checkout/controller/cart/CouponPost.php
in my custom module.
so i created a 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">
<preference for="Magento\checkout\Controller\cart" type="namespace\modulename\Controller\cart\Coupontest" />
</config>
and then Controller/Cart/CouponPost
path for my CouponPost.php, but it dosen't work.
Does anyone know how can i override this CouponPost.php
controller in the right way?
and my controller:
<?php
/**
* Copyright © 2016 Magento. All rights reserved.
* See COPYING.txt for license details.
*/
namespace namespace\DiscountScript\Controller\Cart;
class CouponPost extends \Magento\Checkout\Controller\Cart
{
/**
* Sales quote repository
*
* @var \Magento\Quote\Api\CartRepositoryInterface
*/
protected $quoteRepository;
/**
* Coupon factory
*
* @var \Magento\SalesRule\Model\CouponFactory
*/
protected $couponFactory;
/**
* @param \Magento\Framework\App\Action\Context $context
* @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
* @param \Magento\Checkout\Model\Session $checkoutSession
* @param \Magento\Store\Model\StoreManagerInterface $storeManager
* @param \Magento\Framework\Data\Form\FormKey\Validator $formKeyValidator
* @param \Magento\Checkout\Model\Cart $cart
* @param \Magento\SalesRule\Model\CouponFactory $couponFactory
* @param \Magento\Quote\Api\CartRepositoryInterface $quoteRepository
* @codeCoverageIgnore
*/
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
);
$this->couponFactory = $couponFactory;
$this->quoteRepository = $quoteRepository;
}
/**
* Initialize coupon
*
* @return \Magento\Framework\Controller\Result\Redirect
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
* @SuppressWarnings(PHPMD.NPathComplexity)
*/
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');
if (!$itemsCount) {
if ($isCodeLengthValid) {
$coupon = $this->couponFactory->create();
$coupon->load($couponCode, 'code');
if ($coupon->getId()) {
$this->_checkoutSession->getQuote()->setCouponCode($couponCode)->save();
$this->messageManager->addSuccess(
__(
'Youx used coupon code "%1".',
$escaper->escapeHtml($couponCode)
)
);
} else {
$this->messageManager->addError(
__(
'Thex coupon code "%1" is not valid.',
$escaper->escapeHtml($couponCode)
)
);
}
} else {
$this->messageManager->addError(
__(
'The coupon code "%1" is not valid.',
$escaper->escapeHtml($couponCode)
)
);
}
} else {
if ($isCodeLengthValid && $couponCode == $cartQuote->getCouponCode()) {
$this->messageManager->addSuccess(
__(
'You used coupon code "%1".',
$escaper->escapeHtml($couponCode)
)
);
} else {
$this->messageManager->addError(
__(
'The coupon code "%1" is not valid.',
$escaper->escapeHtml($couponCode)
)
);
$this->cart->save();
}
}
} else {
$this->messageManager->addSuccess(__('You canceled the coupon code.'));
}
} catch (\Magento\Framework\Exception\LocalizedException $e) {
$this->messageManager->addError($e->getMessage());
} catch (\Exception $e) {
$this->messageManager->addError(__('We cannot apply the coupon code.'));
$this->_objectManager->get('Psr\Log\LoggerInterface')->critical($e);
}
return $this->_goBack();
}
}
Best Answer
Replace :
With:
And ensure your custom class is properly named
Namespace\Modulename\Controller\Cart\CouponPost
In your class replace:
With: