Magento2 - प्रोग्राम से कार्ट में जोड़े जाने से किसी उत्पाद को कैसे रोकें?


13

मैं क्या करना चाहता हूं अगर मेरे कस्टम विशेषता को उद्धरण में सेट किया गया है, तो मैं नहीं चाहता कि कोई भी उत्पाद कार्ट में जोड़ा जाए। मेरे कस्टम विशेषता को सही तरीके से सेट किया जा रहा है।

उत्पाद को कार्ट में शामिल होने से रोकने के लिए, मैंने एक ऑब्जर्वर लिखा है जो इस घटना को देखता है controller_action_predispatch_checkout_cart_add

मेरा पर्यवेक्षक फ़ाइल कोड:

public function execute(\Magento\Framework\Event\Observer $observer) {
    $addedItemId = $observer->getRequest()->getParam('product');
    $quote       = $this->_cart->getQuote();

    if(!empty($quote)) {
        $customAttribute = $quote->getData('custom_attribute');

        if(!empty($customAttribute)) {
             $controller = $observer->getControllerAction();
             $storeId     = $this->_objectManager->get('Magento\Store\Model\StoreManagerInterface')->getStore()->getId();
             $product    = $this->_productRepository->getById($addedItemId, false, $storeId);
             $observer->getRequest()->setParam('product', null);

             $this->_messageManager->addError(__('This product cannot be added to your cart.'));
             echo false;            

             $this->_actionFlag->set('', \Magento\Framework\App\Action\Action::FLAG_NO_DISPATCH, true);
             $this->redirect->redirect($controller->getResponse(), 'checkout/cart/index');          
        }
    }       
}

इस कोड के साथ, मैं ऐड टू कार्ट प्रक्रिया को रोकने में सक्षम नहीं हूं।

तो Magento1 के इस उत्तर के अनुसार - /programming/14190358/stop-add-to-cart-and-supply-message-to-user-in-magento । मैंने बदलने की कोशिश की

$this->_actionFlag->set('', \Magento\Framework\App\Action\Action::FLAG_NO_DISPATCH, true);
$this->redirect->redirect($controller->getResponse(), 'checkout/cart/index');  

के साथ (यह करने का सबसे अच्छा तरीका नहीं है। अगर कोई बेहतर तरीका है, तो कृपया सुझाव दें)

header("Location: " . $product->getProductUrl());
die();

यह अंततः ऐड टू कार्ट प्रक्रिया को रोकता है लेकिन कार्ट बटन में ऐड अभी भी " ऐड " को दिखाता रहता है । मैं इसे कैसे सही ढंग से निष्पादित कर सकता हूं ताकि कार्ट बटन को जोड़कर अपनी पिछली स्थिति में वापस चला जाए और उत्पाद भी कार्ट में नहीं जोड़ा जाए?

यहाँ छवि विवरण दर्ज करें


Hi @reena क्या आप मेरी मदद कर सकते हैं कि आपने ऐसा कैसे किया
mcoder

@mcoder - मैंने इसे एक प्लगइन के साथ किया। यू अधिक विवरण के लिए नीचे दिए गए उत्तर को संदर्भित कर सकता है।
रीना पारेख

मैंने कोशिश की लेकिन क्या आप ऐसा नहीं कर सकते, क्या आप मेरी मदद कर सकते हैं कि आपने यह कैसे किया कि मेरे पास भी वही मुद्दा है जैसा कि मैंने देखा कि मैंने क्या कोशिश की: magento.stackexchange.com/questions/111231/… लेकिन यह काम नहीं किया
mcoder

मैं जैसे google.com मैं एक यह ajax ऐड गाड़ी यूआरएल को को अनुप्रेषित, मैं दो दिनों के लिए अटक कर रहा हूँ नीचे की कोशिश की बाहरी url रीडायरेक्ट करना चाहते हैं, लेकिन यह नहीं कर सका :( मैं आपकी मदद के लिए दान करने के लिए कोशिश करेंगे।
mcoder

आप समाधान कैसे प्राप्त कर सकते हैं ?? क्या आप मुझे सभी फ़ाइल सीटी कोड दे सकते हैं? मैं एक ही समस्या है
जिग्स परमार

जवाबों:


22

आप उत्पाद परम को गलत पर सेट करने का प्रयास कर सकते हैं और फिर रिटर्न_आर्ल परम सेट कर सकते हैं:

$observer->getRequest()->setParam('product', false);
$observer->getRequest()->setParam('return_url', $this->_redirect->getRefererUrl());
$this->_messageManager->addError(__('This product cannot be added to your cart.'));

कार्ट कंट्रोलर जाँचता है कि क्या उत्पाद परम यहाँ सेट है: https://github.com/magento/magento2/blob/2.0/app/code/Magento/Checkout/Controller/Cart/Addp.php#L99

और अगर ऐसा नहीं है, तो इसे गो बैक कहते हैं। यदि आपने अजाक्स अनुरोध किया है (मुझे लगता है कि आपने किया था) तो गो बैक विधि जांचती है और फिर अजाक्स प्रतिक्रिया में एक अतिरिक्त पैराम बैकयुअल देता है।

https://github.com/magento/magento2/blob/2.0/app/code/Magento/Checkout/Controller/Cart/Add.php#L165

GetBackUrl मेथड फिर return_url परम देता है:

https://github.com/magento/magento2/blob/2.0/app/code/Magento/Checkout/Controller/Cart.php#L113

=== अद्यतन ===

ठीक है क्योंकि संदेश जोड़ने का काम यहां नहीं होता है, आपको दूसरे तरीके से प्रयास करना चाहिए (यह अधिक सीधे आगे है)

इस फ़ंक्शन से पहले इंटरस्कैप पर एक प्लगइन बनाएं: https://github.com/magento/magento2/blob/2.0/app/code/Magento/Checkout/Model/Cart.php##341

यदि आप अपने उत्पाद को नहीं जोड़ना चाहते हैं, तो बस इच्छित संदेश के साथ एक अपवाद फेंक दें। आप यहाँ प्लगइन्स बनाने के लिए एक अच्छा ट्यूटोरियल पाते हैं: http://alanstorm.com/magento_2_object_manager_plugio_system

उत्पाद जोड़ने बाधित होना चाहिए और अपवाद संदेश के रूप में प्रदान किया जाना चाहिए https://github.com/magento/magento2/blob/2.0/app/code/Magento/Checkout/Controller/Cart/Add.php#L137

अपने मॉड्यूल इत्यादि में निम्नलिखित प्रकार जोड़ें / फ्रंटएंड / डी.एक्सएमएल

<type name="Magento\Checkout\Model\Cart">
    <plugin name="interceptAddingProductToCart"
            type="Vendor\Module\Model\Checkout\Cart\Plugin"
            sortOrder="10"
            disabled="false"/>
</type>

तब वर्ग Vendor/Module/Model/Checkout/Cart/Pluginको इस तरह दिखना चाहिए:

<?php
namespace Vendor\Module\Model\Checkout\Cart;

use Magento\Framework\Exception\LocalizedException;

class Plugin
{
    /**
     * @var \Magento\Quote\Model\Quote
     */
    protected $quote;

    /**
     * Plugin constructor.
     *
     * @param \Magento\Checkout\Model\Session $checkoutSession
     */
    public function __construct(
        \Magento\Checkout\Model\Session $checkoutSession
    ) {
        $this->quote = $checkoutSession->getQuote();
    }

    /**
     * beforeAddProduct
     *
     * @param      $subject
     * @param      $productInfo
     * @param null $requestInfo
     *
     * @return array
     * @throws LocalizedException
     */
    public function beforeAddProduct($subject, $productInfo, $requestInfo = null)
    {
        if ($this->quote->hasData('custom_attribute')) {
            throw new LocalizedException(__('Could not add Product to Cart'));
        }

        return [$productInfo, $requestInfo];
    }
}

1
धन्यवाद डेविड। आपका समाधान काम करता है, मुझसे उबरता है। हालाँकि, त्रुटि संदेश प्रदर्शित नहीं होता है। मैं इस लाइन के कारण मान रहा हूँ: github.com/magento/magento2/blob/2.0/app/code/Magento/Checkout/… ? क्या आप सुझाव दे सकते हैं कि मैं इसे कैसे हल कर सकता हूं?
रीना पारेख

1
हाँ, jut ने एक और उपाय जोड़ा। इन परिवर्तनों को लागू करने के लिए var / पीढ़ी फ़ोल्डर और कॉन्फ़िगरेशन कैश को साफ करना सुनिश्चित करें
डेविड वेरहोलन

अपनी पहली विधि का उपयोग किया है, लेकिन त्रुटि संदेश प्राप्त करने में सक्षम नहीं है, मैं आपके 2 तरीके में वापसी यूआरएल और संदेश कैसे सेट कर सकता हूं।
अमित सिंह

1
क्या आप बता सकते हैं, मैं यहाँ कस्टम विकल्प मान कैसे प्राप्त कर सकता हूँ?
अनुजेट

+1 बिल्कुल शानदार! सही समाधान (अद्यतन)। 2.1.5 के साथ काम करता है।
डेव

2

नीचे कार्ट में कार्ट को जोड़ने से रोकने के लिए मेरा कोड है और प्रेक्षक का उपयोग करके त्रुटि संदेश प्रदर्शित करना है।

<?php
use Magento\Framework\Event\ObserverInterface;

class ProductAddCartBefore implements ObserverInterface
{

    protected $_request;
    protected $_checkoutSession;
    protected $_messageManager;

    public function __construct(
        \Magento\Framework\App\RequestInterface $request,  
        \Magento\Framework\Message\ManagerInterface $messageManager,
        \Magento\Checkout\Model\SessionFactory $checkoutSession
    )
    {
        $this->_request = $request;
        $this->_messageManager = $messageManager;
        $this->_checkoutSession = $checkoutSession;
    }

    public function execute(\Magento\Framework\Event\Observer $observer)
    {
        $productId = $observer->getRequest()->getParam('product');

        $quote = $this->_checkoutSession->create()->getQuote();

        $itemsCount = $quote->getItemsSummaryQty();

        if($itemsCount > 0 && $productId != 1949)
        {
            if($quote->hasProductId(1949)) 
            {   
                $observer->getRequest()->setParam('product', false);
                $observer->getRequest()->setParam('return_url', false);
                $this->_messageManager->addErrorMessage(__('To proceed please remove other items from the cart.'));
            }
        }
    }
}

उत्पाद को कार्ट में जोड़ने से रोकने के लिए आप अपनी आवश्यकताओं के अनुसार स्थितियां निर्धारित कर सकते हैं।


इसने मेरे लिए काम किया।
हसन अल-जेशी

0

अंतिम तीन लाइन कोड निकालें

और इस एक पंक्ति को जोड़ें: असत्य लौटाएं; और उत्पाद मान का सेट करें: गलत तब आपको त्रुटि संदेश मिलता है और लोडर छिपा होता है ... धन्यवाद

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.