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?
sumber
Jawaban:
Anda dapat mencoba mengatur param produk menjadi false dan kemudian mengatur param return_url:
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
Maka kelas
Vendor/Module/Model/Checkout/Cart/Plugin
akan terlihat seperti ini:sumber
Di bawah ini adalah kode saya untuk menghentikan produk agar tidak ditambahkan ke troli dan menampilkan pesan kesalahan menggunakan pengamat.
Anda dapat mengatur ketentuan sesuai kebutuhan Anda untuk mencegah produk menambah keranjang.
sumber
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
sumber