Frage

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;
    }
}
War es hilfreich?

Lösung

/vendor/magento/module-wishlist/Controller/Index/Add.php

from this line 137

        $this->messageManager->addComplexSuccessMessage(
            'addProductSuccessMessage',
            [
                'product_name' => $product->getName(),
                'referer' => $referer,
            ]
        );

You need to override wishlist add Controller and modify it according to your requirements.

app/code/VendoreName/ModuleName/etc

di.xml

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">

    <!-- for override add wishlist product  -->
    <preference for="Magento\Wishlist\Controller\Index\Add" type="VendoreName\ModuleName\Controller\Index\Add" />

</config>

app\code\VendoreName\ModuleName\Controller\Index

Add.php

<?php

namespace VendoreName\ModuleName\Controller\Index;

use Magento\Catalog\Api\ProductRepositoryInterface;
use Magento\Framework\App\Action;
use Magento\Framework\App\Action\HttpPostActionInterface;
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 implements HttpPostActionInterface
{
    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;
    }
}

Update

please comment this line

if (!$this->formKeyValidator->validate($this->getRequest())) {
    return $resultRedirect->setPath('*/');
}

and Please check file path

<magento root>\vendore\magento\module-wishlist\Model\ResourceModel\Item\Collection.php 

above file is exist or not if yes then please run below command

php bin/magento s:up
php bin/magento s:s:d -f
php bin/magento c:f

and please clean your browser cache by pressing Ctrl + Shift + Delete key

Andere Tipps

override vendor/magento/module-wishlist/i18n/en_US.csv to your theme in Magento_Wishlist and find "%1 has been added to your Wish List." and change the message. Whenever override any i18n/en_US.csv then compulsory to deploy.

sudo rm -rf var/*
sudo rm -rf pub/static/frontend/*

sudo php bin/magento setup:static-content:deploy -f
sudo php bin/magento ca:cl
sudo php bin/magento ca:fl
sudo chmod -R 777 /var/www/html/(project name)/

if above solution is not working then override /vendor/magento/module-wishlist/view/frontend/templates/messages/addProductSuccessMessage.phtml and change message.

I hope this will help you.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit magento.stackexchange
scroll top