Magento2 - Bagaimana cara menghentikan produk agar tidak ditambahkan ke troli secara terprogram?

13

Yang ingin saya lakukan adalah jika atribut khusus saya diatur dalam tanda kutip maka saya tidak ingin produk apa pun ditambahkan ke keranjang. Atribut khusus saya sedang diatur dengan benar.

Untuk menghentikan produk agar tidak ditambahkan ke troli, saya telah menulis Pengamat yang mengamati acara ini controller_action_predispatch_checkout_cart_add

Kode file pengamat saya:

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

Dengan kode ini, saya tidak dapat menghentikan proses penambahan ke keranjang.

Jadi sesuai jawaban Magento1 ini - /programming/14190358/stop-add-to-cart-and-supply-message-to-user-in-magento . Saya mencoba mengganti

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

with (Ini bukan cara terbaik untuk melakukannya. Jika ada cara yang lebih baik, silakan sarankan)

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

Ini pada akhirnya menghentikan proses tambahkan ke keranjang tetapi tombol tambahkan ke keranjang masih terus menampilkan "Menambahkan" . Bagaimana saya bisa melakukan ini dengan benar sehingga tombol tambah ke keranjang kembali ke keadaan sebelumnya dan produk juga tidak ditambahkan ke keranjang?

masukkan deskripsi gambar di sini

Reena Parekh
sumber
hi @reena Anda dapat membantu saya bagaimana Anda melakukannya
mcoder
@ mcoder - saya melakukannya dengan sebuah plugin. Anda dapat merujuk jawaban yang diterima di bawah ini untuk lebih jelasnya.
Reena Parekh
saya mencoba tetapi tidak bisa tolong bantu saya bagaimana Anda melakukan itu saya memiliki masalah yang sama seperti yang Anda lihat apa yang saya coba: magento.stackexchange.com/questions/111231/… tapi tidak berhasil
mcoder
saya ingin mengalihkan ke url eksternal seperti google.com saya mencoba di bawah ini untuk mengarahkan ke url add ajax, saya macet selama dua hari tetapi tidak bisa melakukannya :(. Saya akan mencoba menyumbang untuk bantuan Anda
mcoder
Bagaimana Anda bisa mendapat solusinya ?? dapatkah Anda memberi saya semua file dengan kode itu? Saya memiliki masalah yang sama
Jigs Parmar

Jawaban:

22

Anda dapat mencoba mengatur param produk menjadi false dan kemudian mengatur param return_url:

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

Pengontrol keranjang memeriksa apakah param produk diatur di sini: https://github.com/magento/magento2/blob/2.0/app/code/Magento/Checkout/Controller/Cart/Add.php#L99

dan jika tidak, ia memanggil goBack. metode goBack memeriksa apakah Anda membuat permintaan ajax (saya pikir Anda lakukan) dan kemudian mengembalikan param backUrl tambahan dalam respons ajax.

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

Metode getBackUrl kemudian mengembalikan param return_url:

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

=== UPDATE ===

ok karena menambahkan pesan tidak berfungsi di sini, Anda harus mencoba cara lain (itu juga lebih lurus ke depan)

buat Plugin untuk Intercetp sebelum fungsi ini: https://github.com/magento/magento2/blob/2.0/app/code/Magento/Checkout/Model/Cart.php#L341

Jika Anda tidak ingin produk Anda ditambahkan, buang saja Pengecualian dengan Pesan yang diinginkan. Anda menemukan tutorial yang bagus untuk membuat plugin di sini: http://alanstorm.com/magento_2_object_manager_plugin_system

Penambahan Produk harus terganggu dan Pengecualian harus diberikan sebagai pesan https://github.com/magento/magento2/blob/2.0/app/code/Magento/Checkout/Controller/Cart/Add.php#L137

tambahkan jenis berikut ke modul Anda dll / frontend / di.xml

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

Maka kelas Vendor/Module/Model/Checkout/Cart/Pluginakan terlihat seperti ini:

<?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];
    }
}
David Verholen
sumber
1
David terima kasih Solusi Anda berhasil, angkat saya. Namun, pesan kesalahan tidak ditampilkan. Saya berasumsi karena baris ini: github.com/magento/magento2/blob/2.0/app/code/Magento/Checkout/… ? Bisakah Anda menyarankan bagaimana saya bisa menyelesaikannya?
Reena Parekh
1
ya, hanya menambahkan solusi lain. Pastikan untuk membersihkan folder var / generation dan cache konfigurasi agar perubahan ini diterapkan
David Verholen
Digunakan metode 1 Anda tetapi tidak bisa mendapatkan pesan kesalahan, Bagaimana saya bisa mengatur url kembali dan pesan dalam metode 2 Anda.
Amit Singh
1
Bisakah Anda memberi tahu, bagaimana saya bisa mendapatkan nilai opsi khusus di sini?
anujeet
+1 Benar-benar brilian! Solusi sempurna (pembaruan). Bekerja dengan 2.1.5.
Dave
2

Di bawah ini adalah kode saya untuk menghentikan produk agar tidak ditambahkan ke troli dan menampilkan pesan kesalahan menggunakan pengamat.

<?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.'));
            }
        }
    }
}

Anda dapat mengatur ketentuan sesuai kebutuhan Anda untuk mencegah produk menambah keranjang.

Vips Lucky
sumber
Ini berhasil untuk saya.
Hassan Al-Jeshi
0

Hapus tiga kode baris terakhir

Dan tambahkan satu baris ini: return false; Dan atur nilai param produk: false Kemudian Anda mendapatkan pesan kesalahan dan loadernya disembunyikan ... Terima kasih

Kamal Jain
sumber