Ce que je veux faire, c'est que si mon attribut personnalisé est défini dans le devis, je ne veux pas qu'un produit soit ajouté au panier. Mon attribut personnalisé est correctement défini.
Pour éviter que le produit ne soit ajouté au panier, j'ai écrit un observateur qui observe cet événement controller_action_predispatch_checkout_cart_add
Mon code de fichier d'observateur:
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');
}
}
}
Avec ce code, je ne peux pas arrêter le processus d'ajout au panier.
Donc, selon cette réponse de Magento1 - /programming/14190358/stop-add-to-cart-and-supply-message-to-user-in-magento . J'ai essayé de remplacer
$this->_actionFlag->set('', \Magento\Framework\App\Action\Action::FLAG_NO_DISPATCH, true);
$this->redirect->redirect($controller->getResponse(), 'checkout/cart/index');
avec (Ce n'est pas la meilleure façon de le faire. S'il y a une meilleure façon, veuillez suggérer)
header("Location: " . $product->getProductUrl());
die();
Cela arrête finalement le processus d'ajout au panier, mais le bouton Ajouter au panier continue d'afficher "Ajout" . Comment puis-je effectuer cela correctement afin que le bouton Ajouter au panier revienne à son état précédent et que le produit ne soit pas ajouté au panier?