То, что я хочу сделать, это если мой пользовательский атрибут установлен в цитате, то я не хочу, чтобы какой-либо продукт был добавлен в корзину. Мой пользовательский атрибут устанавливается правильно.
Чтобы товар не был добавлен в корзину, я написал Обозреватель, который наблюдает за этим событием. 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();
Это в конечном итоге останавливает процесс добавления в корзину, но кнопка «Добавить в корзину» продолжает показывать «Добавление» . Как я могу выполнить это правильно, чтобы кнопка «Добавить в корзину» вернулась в прежнее состояние, а продукт тоже не был добавлен в корзину?
источник
Ответы:
Вы можете попытаться установить для параметра продукта значение false, а затем установить параметр return_url:
Контроллер корзины проверяет, задан ли здесь параметр продукта: https://github.com/magento/magento2/blob/2.0/app/code/Magento/Checkout/Controller/Cart/Add.php#L99
и если это не так, он вызывает goBack. метод goBack проверяет, сделал ли вы запрос ajax (я думаю, что вы это сделали), а затем возвращает дополнительный параметр backUrl в ответе ajax.
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
=== UPDATE ===
хорошо, так как добавление сообщения здесь не работает, вы должны попробовать другой способ (это также более прямо)
создайте плагин для Intercetp перед этой функцией: https://github.com/magento/magento2/blob/2.0/app/code/Magento/Checkout/Model/Cart.php#L341
Если вы не хотите, чтобы ваш продукт был добавлен, просто добавьте исключение с нужным сообщением. Вы можете найти хороший учебник по созданию плагинов здесь: http://alanstorm.com/magento_2_object_manager_plugin_system
Добавление продукта должно быть прервано, а исключение должно быть отображено в виде сообщения https://github.com/magento/magento2/blob/2.0/app/code/Magento/Checkout/Controller/Cart/Add.php#L137.
добавьте следующий тип в ваши модули и т.д. / frontend / di.xml
Тогда класс
Vendor/Module/Model/Checkout/Cart/Plugin
должен выглядеть так:источник
Ниже приведен мой код для предотвращения добавления товара в корзину и отображения сообщения об ошибке с помощью обозревателя.
Вы можете установить условия в соответствии с вашими требованиями, чтобы предотвратить добавление товара в корзину.
источник
Удалить последние три строки кода
И добавьте эту строку: return false; И установить значение параметра продукта: false. Затем вы получите сообщение об ошибке, а загрузчик скрыть ... Спасибо
источник