ম্যাজেন্টো 2 - কোনও প্রোগ্রামকে কার্টে কার্টে যুক্ত হওয়া থেকে কীভাবে থামানো যায়?


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');  

সহ (এটি করার সর্বোত্তম উপায় নয় If যদি এর থেকে আরও ভাল উপায় থাকে তবে দয়া করে পরামর্শ দিন)

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

এটি শেষ পর্যন্ত কার্ট প্রক্রিয়াতে অ্যাড থামায় তবে কার্ট বোতামে যুক্ত হওয়া এখনও "যুক্ত করা" দেখায় । আমি কীভাবে এটি সঠিকভাবে সম্পাদন করতে পারি যাতে কার্টের বোতামে যুক্ত হওয়া তার আগের অবস্থায় ফিরে যায় এবং পণ্যটিও কার্টে যুক্ত না হয়?

এখানে চিত্র বর্ণনা লিখুন


হাই @ রেনা আপনি কীভাবে তা করেছিলেন আমাকে সাহায্য করতে পারেন
এমকোডার

@ এমকোডার - আমি এটি একটি প্লাগইন দিয়ে করেছি। আপনি আরও তথ্যের জন্য নীচে গৃহীত উত্তর উল্লেখ করতে পারেন।
রেনা পেরেক

আমি চেষ্টা করেছিলাম কিন্তু করতে পারছি না আপনি দয়া করে আমাকে কীভাবে সাহায্য করেছেন তা আপনি যেভাবে দেখলেন আমি যেমন চেষ্টা করেছি তা দেখে আপনি কীভাবে চেষ্টা করেছিলেন: magento.stackexchange.com/questions/111231/… তবে এটি কার্যকর হয়নি
এমকোডার

আমি google.com এর মতো বাহ্যিক ইউআরএলটিতে পুনঃনির্দেশিত করতে চাই আমি এজ্যাক্ট কার্ট ইউআরএল থেকে পুনঃনির্দেশিত একের নীচে চেষ্টা করেছি, আমি দু'দিন আটকে আছি তবে তা করতে পারলাম না :( আমি আপনাকে সাহায্যের জন্য অনুদান দেওয়ার চেষ্টা করব
এমকোডার

কীভাবে সমাধান পাবেন ?? আপনি আমাকে কোড ফাইলের সব ফাইল দিতে পারেন? আমার একই সমস্যা আছে
জিগস পারমার

উত্তর:


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

এবং যদি এটি না হয় তবে এটি goBack কে ডাকে। আপনি একটি এজাক্স অনুরোধ করেছেন কিনা তা goBack পদ্ধতি পরীক্ষা করে (আমার মনে হয় আপনি করেছেন) এবং তারপরে এজাক্স প্রতিক্রিয়াতে একটি অতিরিক্ত প্যারাম ব্যাকআরএল প্রদান করে।

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

GetBackUrl পদ্ধতিটি তারপরে রিটার্ন_আরল পরম দেয়:

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

=== আপডেট ===

ঠিক আছে যেহেতু বার্তা যুক্ত করা এখানে কাজ করে না, তাই আপনার অন্য একটি উপায় চেষ্টা করা উচিত (এটি আরও সোজা এগিয়ে)

এই ফাংশনটির আগে ইন্টারসেটপ-এ একটি প্লাগইন তৈরি করুন: https://github.com

আপনি যদি নিজের পণ্যটি যুক্ত না করতে চান তবে পছন্দসই বার্তা সহ একটি ব্যতিক্রম ছুঁড়ে দিন। আপনি এখানে প্লাগইনগুলি তৈরি করার জন্য একটি সুন্দর টিউটোরিয়ালটি পেয়েছেন: http://alanstorm.com

পণ্য যুক্ত হওয়া বাধাগুলি হওয়া উচিত এবং ব্যতিক্রমটি বার্তা হিসাবে রেন্ডার করা উচিত https://github.com

আপনার মডিউল ইত্যাদি / ফ্রন্টএন্ড / di.xML এ নিম্নলিখিত ধরণের যুক্ত করুন

<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
হ্যাঁ, পাট আরেকটি সমাধান যুক্ত করেছে। এই পরিবর্তনগুলি প্রয়োগ করার জন্য
ভের

আপনার 1 ম পদ্ধতিটি ব্যবহার করেছেন তবে ত্রুটি বার্তা পেতে সক্ষম হন না, আমি কীভাবে আপনার 2 তম পদ্ধতিতে রিটার্ন url এবং বার্তা সেট করতে পারি।
অমিত সিং

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

শেষ তিনটি লাইন কোড সরান

এবং এই এক লাইন যুক্ত করুন: মিথ্যা প্রত্যাবর্তন; এবং পণ্য পরমের মান নির্ধারণ করুন: ভুয়া তারপরে আপনি ত্রুটির বার্তা পান এবং লোডারটি হাইড হয় ... ধন্যবাদ

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.