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?
la source
Réponses:
vous pouvez essayer de définir le paramètre du produit sur false, puis définir le paramètre return_url:
Le contrôleur du panier vérifie si le paramètre du produit est défini ici: https://github.com/magento/magento2/blob/2.0/app/code/Magento/Checkout/Controller/Cart/Add.php#L99
et si ce n'est pas le cas, il appelle goBack. la méthode goBack vérifie si vous avez fait une demande ajax (je pense que vous l'avez fait), puis retourne un param backUrl supplémentaire dans la réponse ajax.
https://github.com/magento/magento2/blob/2.0/app/code/Magento/Checkout/Controller/Cart/Add.php#L165
La méthode getBackUrl renvoie ensuite le paramètre return_url:
https://github.com/magento/magento2/blob/2.0/app/code/Magento/Checkout/Controller/Cart.php#L113
=== MISE À JOUR ===
ok puisque l'ajout de message ne fonctionne pas ici, vous devriez essayer d'une autre manière (c'est aussi plus simple)
créez un plugin pour Intercetp avant cette fonction: https://github.com/magento/magento2/blob/2.0/app/code/Magento/Checkout/Model/Cart.php#L341
Si vous ne voulez pas que votre produit soit ajouté, lancez simplement une exception avec le message souhaité. Vous trouverez un joli tutoriel pour créer des plugins ici: http://alanstorm.com/magento_2_object_manager_plugin_system
L'ajout de produit doit être interrompu et l'exception doit être restituée sous forme de message https://github.com/magento/magento2/blob/2.0/app/code/Magento/Checkout/Controller/Cart/Add.php#L137
ajoutez le type suivant à vos modules etc / frontend / di.xml
Ensuite, la classe
Vendor/Module/Model/Checkout/Cart/Plugin
devrait ressembler à ceci:la source
Ci-dessous mon code pour empêcher l'ajout de produit au panier et afficher un message d'erreur à l'aide de l'observateur.
vous pouvez définir les conditions selon vos besoins pour empêcher l'ajout de produit au panier.
la source
Supprimez le code des trois dernières lignes
Et ajoutez cette seule ligne: return false; Et définissez la valeur du produit param: false Ensuite, vous obtenez un message d'erreur et le chargeur est masqué ... Merci
la source