O que eu quero fazer é se meu atributo personalizado estiver definido entre aspas, então não quero que nenhum produto seja adicionado ao carrinho. Meu atributo personalizado está sendo definido corretamente.
Para impedir que o produto seja adicionado ao carrinho, escrevi um Observador que observa esse evento controller_action_predispatch_checkout_cart_add
Meu código de arquivo observador:
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');
}
}
}
Com este código, não consigo parar o processo de adicionar ao carrinho.
Então, de acordo com esta resposta do Magento1 - /programming/14190358/stop-add-to-cart-and-supply-message-to-user-in-magento . Eu tentei substituir
$this->_actionFlag->set('', \Magento\Framework\App\Action\Action::FLAG_NO_DISPATCH, true);
$this->redirect->redirect($controller->getResponse(), 'checkout/cart/index');
with (Esta não é a melhor maneira de fazê-lo. Se houver alguma maneira melhor, por favor sugira)
header("Location: " . $product->getProductUrl());
die();
Em última análise, isso interrompe o processo de adicionar ao carrinho, mas o botão Adicionar ao carrinho continua mostrando "Adicionando" . Como posso fazer isso corretamente para que o botão adicionar ao carrinho volte ao seu estado anterior e o produto também não seja adicionado ao carrinho?
fonte
Respostas:
você pode tentar definir o parâmetro do produto como false e definir o parâmetro return_url:
O controlador do carrinho verifica se o parâmetro do produto está definido aqui: https://github.com/magento/magento2/blob/2.0/app/code/Magento/Checkout/Controller/Cart/Add.php#L99
e se não for, chama goBack. o método goBack verifica se você fez uma solicitação ajax (acho que você fez) e, em seguida, retorna um parâmetro adicional backUrl na resposta ajax.
https://github.com/magento/magento2/blob/2.0/app/code/Magento/Checkout/Controller/Cart/Add.php#L165
O método getBackUrl retorna o parâmetro return_url:
https://github.com/magento/magento2/blob/2.0/app/code/Magento/Checkout/Controller/Cart.php#L113
=== ATUALIZAÇÃO ===
ok, já que a adição da mensagem não funciona aqui, você deve tentar de outra maneira (também é mais direto)
crie um plugin para Intercetp antes desta função: https://github.com/magento/magento2/blob/2.0/app/code/Magento/Checkout/Model/Cart.php#L341
Se você não deseja que seu produto seja adicionado, basta lançar uma exceção com a mensagem desejada. Você encontra um bom tutorial para criar plug-ins aqui: http://alanstorm.com/magento_2_object_manager_plugin_system
A adição do produto deve ser interrompida e a exceção deve ser renderizada como mensagem https://github.com/magento/magento2/blob/2.0/app/code/Magento/Checkout/Controller/Cart/Add.php#L137
adicione o seguinte tipo aos seus módulos etc / frontend / di.xml
Então a classe
Vendor/Module/Model/Checkout/Cart/Plugin
deve ficar assim:fonte
Abaixo está o meu código para impedir que o produto seja adicionado ao carrinho e exibir a mensagem de erro usando o observador.
você pode definir as condições conforme seus requisitos para impedir que o produto seja adicionado ao carrinho.
fonte
Remova o último código de três linhas
E adicione esta linha: return false; E definir o valor do parâmetro do produto: false Então você recebe a mensagem de erro e o carregador está oculto ... Obrigado
fonte