Chcę zrobić, jeśli mój niestandardowy atrybut jest ustawiony w cudzysłowie, nie chcę, aby jakikolwiek produkt został dodany do koszyka. Mój niestandardowy atrybut jest ustawiany poprawnie.
Aby zapobiec dodawaniu produktu do koszyka, napisałem Obserwatora, który obserwuje to wydarzenie controller_action_predispatch_checkout_cart_add
Kod mojego pliku obserwatora:
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');
}
}
}
Dzięki temu kodowi nie mogę zatrzymać procesu dodawania do koszyka.
Więc zgodnie z tą odpowiedzią Magento1 - /programming/14190358/stop-add-to-cart-and-supply-message-to-user-in-magento . Próbowałem wymienić
$this->_actionFlag->set('', \Magento\Framework\App\Action\Action::FLAG_NO_DISPATCH, true);
$this->redirect->redirect($controller->getResponse(), 'checkout/cart/index');
z (To nie jest najlepszy sposób na zrobienie tego. Jeśli istnieje lepszy sposób, proszę zasugerować)
header("Location: " . $product->getProductUrl());
die();
To ostatecznie zatrzymuje proces dodawania do koszyka, ale przycisk dodawania do koszyka nadal pokazuje „Dodawanie” . Jak mogę to zrobić poprawnie, aby przycisk dodawania do koszyka powrócił do poprzedniego stanu, a produkt nie został dodany do koszyka?
źródło
Odpowiedzi:
możesz spróbować ustawić parametr produktu na false, a następnie ustawić parametr return_url:
Kontroler wózka sprawdza, czy parametr produktu jest ustawiony tutaj: https://github.com/magento/magento2/blob/2.0/app/code/Magento/Checkout/Controller/Cart/Add.php#L99
a jeśli nie, wywołuje goBack. metoda goBack sprawdza, czy wykonałeś żądanie ajax (myślę, że to zrobiłeś), a następnie zwraca dodatkowy parametr backUrl w odpowiedzi ajax.
https://github.com/magento/magento2/blob/2.0/app/code/Magento/Checkout/Controller/Cart/Add.php#L165
Metoda getBackUrl zwraca następnie parametr return_url:
https://github.com/magento/magento2/blob/2.0/app/code/Magento/Checkout/Controller/Cart.php#L113
=== AKTUALIZACJA ===
ok, ponieważ dodawanie wiadomości nie działa tutaj, powinieneś spróbować w inny sposób (jest to również bardziej proste)
utwórz wtyczkę do Intercetp przed tą funkcją: https://github.com/magento/magento2/blob/2.0/app/code/Magento/Checkout/Model/Cart.php#L341
Jeśli nie chcesz, aby Twój produkt został dodany, po prostu wyślij wyjątek z żądaną wiadomością. Miły samouczek dotyczący tworzenia wtyczek znajduje się tutaj: http://alanstorm.com/magento_2_object_manager_plugin_system
Dodanie produktu powinno zostać przerwane, a wyjątek powinien zostać wyświetlony jako wiadomość https://github.com/magento/magento2/blob/2.0/app/code/Magento/Checkout/Controller/Cart/Add.php#L137
dodaj następujący typ do modułów etc / frontend / di.xml
Klasa
Vendor/Module/Model/Checkout/Cart/Plugin
powinna wyglądać następująco:źródło
Poniżej znajduje się mój kod, aby zapobiec dodawaniu produktu do koszyka i wyświetlać komunikat o błędzie za pomocą obserwatora.
możesz ustawić warunki zgodnie ze swoimi wymaganiami, aby zapobiec dodawaniu produktu do koszyka.
źródło
Usuń trzy ostatnie kody wiersza
I dodaj tę jedną linię: return false; I ustaw wartość parametru produktu: false Następnie pojawia się komunikat o błędzie, a moduł ładujący jest ukryty ... Dzięki
źródło