Wenn mein benutzerdefiniertes Attribut im Angebot festgelegt ist, möchte ich nicht, dass ein Produkt in den Warenkorb gelegt wird. Mein benutzerdefiniertes Attribut wird korrekt festgelegt.
Um zu verhindern, dass das Produkt in den Warenkorb gelegt wird, habe ich einen Beobachter geschrieben, der dieses Ereignis beobachtet controller_action_predispatch_checkout_cart_add
Mein Beobachter-Dateicode:
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');
}
}
}
Mit diesem Code kann ich den Vorgang zum Hinzufügen zum Warenkorb nicht stoppen.
Also gemäß dieser Antwort von Magento1 - /programming/14190358/stop-add-to-cart-and-supply-message-to-user-in-magento . Ich habe versucht zu ersetzen
$this->_actionFlag->set('', \Magento\Framework\App\Action\Action::FLAG_NO_DISPATCH, true);
$this->redirect->redirect($controller->getResponse(), 'checkout/cart/index');
mit (Dies ist nicht der beste Weg, dies zu tun. Wenn es einen besseren Weg gibt, schlagen Sie bitte vor)
header("Location: " . $product->getProductUrl());
die();
Dies stoppt letztendlich den Vorgang zum Hinzufügen zum Warenkorb, aber die Schaltfläche zum Hinzufügen zum Warenkorb zeigt weiterhin "Hinzufügen" an . Wie kann ich dies korrekt ausführen, damit die Schaltfläche "In den Warenkorb" in den vorherigen Zustand zurückkehrt und auch das Produkt nicht in den Warenkorb gelegt wird?
quelle
Antworten:
Sie können versuchen, den Produktparameter auf false zu setzen und dann den Parameter return_url festzulegen:
Der Warenkorb-Controller prüft, ob der Produktparameter hier eingestellt ist: https://github.com/magento/magento2/blob/2.0/app/code/Magento/Checkout/Controller/Cart/Add.php#L99
und wenn nicht, ruft es goBack auf. Die goBack-Methode prüft, ob Sie eine Ajax-Anfrage gestellt haben (ich glaube, Sie haben dies getan) und gibt dann einen zusätzlichen Parameter backUrl in der Ajax-Antwort zurück.
https://github.com/magento/magento2/blob/2.0/app/code/Magento/Checkout/Controller/Cart/Add.php#L165
Die Methode getBackUrl gibt dann den Parameter return_url zurück:
https://github.com/magento/magento2/blob/2.0/app/code/Magento/Checkout/Controller/Cart.php#L113
=== UPDATE ===
ok, da das Hinzufügen von Nachrichten hier nicht funktioniert, sollten Sie einen anderen Weg versuchen (es ist auch einfacher)
Erstellen Sie vor dieser Funktion ein Plugin für Intercetp: https://github.com/magento/magento2/blob/2.0/app/code/Magento/Checkout/Model/Cart.php#L341
Wenn Sie nicht möchten, dass Ihr Produkt hinzugefügt wird, werfen Sie einfach eine Ausnahme mit der gewünschten Nachricht. Ein nettes Tutorial zum Erstellen von Plugins finden Sie hier: http://alanstorm.com/magento_2_object_manager_plugin_system
Das Hinzufügen des Produkts sollte unterbrochen und die Ausnahme als Nachricht https://github.com/magento/magento2/blob/2.0/app/code/Magento/Checkout/Controller/Cart/Add.php#L137 gerendert werden
Fügen Sie Ihren Modulen usw. den folgenden Typ hinzu: / frontend / di.xml
Dann sollte die Klasse
Vendor/Module/Model/Checkout/Cart/Plugin
so aussehen:quelle
Unten ist mein Code, um zu verhindern, dass das Produkt zum Warenkorb hinzugefügt wird, und um eine Fehlermeldung mit dem Beobachter anzuzeigen.
Sie können die Bedingungen gemäß Ihren Anforderungen festlegen, um zu verhindern, dass das Produkt in den Warenkorb gelegt wird.
quelle
Entfernen Sie die letzten drei Zeilen
Und fügen Sie diese eine Zeile hinzu: return false; Und setze den Wert des Produktparameters: false Dann bekommst du eine Fehlermeldung und der Lader ist versteckt ... Danke
quelle