when i am trying to add product multiple times in wishlist i am getting below message :
Product A has been added to your Wish List. Click here to continue shopping.
instead, it should be
Product A is already in your Wish List. Click here to continue shopping.
Based on solution I added below code in Add.php as my magento version it 2.1 but it gives below error
Uncaught TypeError: Argument 5 passed to Vendor\Magento\Controller\Index\Add::__construct() must be an instance of Magento\Wishlist\Model\ResourceModel\Item\CollectionFactory, instance of Magento\Framework\Data\Form\FormKey\Validator given, called
<?php
namespace Vendor\Magento\Controller\Index;
use Magento\Catalog\Api\ProductRepositoryInterface;
use Magento\Framework\App\Action;
use Magento\Framework\Controller\ResultFactory;
use Magento\Framework\Data\Form\FormKey\Validator;
use Magento\Framework\Exception\NoSuchEntityException;
use Magento\Framework\Exception\NotFoundException;
class Add extends \Magento\Wishlist\Controller\AbstractIndex
{
protected $wishlistProvider;
protected $_customerSession;
protected $productRepository;
protected $formKeyValidator;
protected $wishItemscollection;
public function __construct(
Action\Context $context,
\Magento\Customer\Model\Session $customerSession,
\Magento\Wishlist\Controller\WishlistProviderInterface $wishlistProvider,
ProductRepositoryInterface $productRepository,
\Magento\Wishlist\Model\ResourceModel\Item\CollectionFactory $wishItemscollection,
Validator $formKeyValidator
) {
$this->_customerSession = $customerSession;
$this->wishlistProvider = $wishlistProvider;
$this->productRepository = $productRepository;
$this->wishItemscollection = $wishItemscollection;
$this->formKeyValidator = $formKeyValidator;
parent::__construct($context);
}
/**
* Adding new item
*
* @return \Magento\Framework\Controller\Result\Redirect
* @throws NotFoundException
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
* @SuppressWarnings(PHPMD.NPathComplexity)
* @SuppressWarnings(PHPMD.UnusedLocalVariable)
*/
public function execute()
{
/** @var \Magento\Framework\Controller\Result\Redirect $resultRedirect */
$resultRedirect = $this->resultFactory->create(ResultFactory::TYPE_REDIRECT);
if (!$this->formKeyValidator->validate($this->getRequest())) {
return $resultRedirect->setPath('*/');
}
$wishlist = $this->wishlistProvider->getWishlist();
if (!$wishlist) {
throw new NotFoundException(__('Page not found.'));
}
$session = $this->_customerSession;
$requestParams = $this->getRequest()->getParams();
if ($session->getBeforeWishlistRequest()) {
$requestParams = $session->getBeforeWishlistRequest();
$session->unsBeforeWishlistRequest();
}
$productId = isset($requestParams['product']) ? (int) $requestParams['product'] : null;
if (!$productId) {
$resultRedirect->setPath('*/');
return $resultRedirect;
}
try {
$product = $this->productRepository->getById($productId);
} catch (NoSuchEntityException $e) {
$product = null;
}
if (!$product || !$product->isVisibleInCatalog()) {
$this->messageManager->addErrorMessage(__('We can\'t specify a product.'));
$resultRedirect->setPath('*/');
return $resultRedirect;
}
try {
$buyRequest = new \Magento\Framework\DataObject($requestParams);
// your need to check here if product is already added or not
/* your logic is here */
$store_id = $this->_customerSession->getCustomer()->getStoreId();
$wishlist_id = $wishlist->getId();
// add to wishlist items table
$wishlist_itemCollection = $this->wishItemscollection->create();
$wishlist_itemCollection->addFieldToFilter('product_id', $productId);
$wishlist_itemCollection->addFieldToFilter('store_id', $store_id);
$wishlist_itemCollection->addFieldToFilter('wishlist_id', $wishlist_id);
//print_r($wishlist_itemCollection->getData());
$wishlist_count = count($wishlist_itemCollection->getData());
if ($wishlist_count == 0) {
// new product item come
$result = $wishlist->addNewItem($product, $buyRequest); // this line add product to wishlist
if (is_string($result)) {
throw new \Magento\Framework\Exception\LocalizedException(__($result));
}
if ($wishlist->isObjectNew()) {
$wishlist->save();
}
$this->_eventManager->dispatch(
'wishlist_add_product',
['wishlist' => $wishlist, 'product' => $product, 'item' => $result]
);
$referer = $session->getBeforeWishlistUrl();
if ($referer) {
$session->setBeforeWishlistUrl(null);
} else {
$referer = $this->_redirect->getRefererUrl();
}
$this->_objectManager->get(\Magento\Wishlist\Helper\Data::class)->calculate();
// this message you change or call your custom message
$this->messageManager->addComplexSuccessMessage(
'addProductSuccessMessage',
[
'product_name' => $product->getName(),
'referer' => $referer,
]
);
} else{
/// add your cusom message for already wishlist product
$this->messageManager->addErrorMessage(__($product->getName() . ' has been already added to your Wish List. '));
}
// phpcs:disable Magento2.Exceptions.ThrowCatch
} catch (\Magento\Framework\Exception\LocalizedException $e) {
$this->messageManager->addErrorMessage(
__('We can\'t add the item to Wish List right now: %1.', $e->getMessage())
);
} catch (\Exception $e) {
$this->messageManager->addExceptionMessage(
$e,
__('We can\'t add the item to Wish List right now.')
);
}
$resultRedirect->setPath('*', ['wishlist_id' => $wishlist->getId()]);
return $resultRedirect;
}
}