Lo que quiero hacer es que si mi atributo personalizado se establece entre comillas, no quiero que se agregue ningún producto en el carrito. Mi atributo personalizado se está configurando correctamente.
Para evitar que el producto se agregue al carrito, he escrito un Observador que observa este evento controller_action_predispatch_checkout_cart_add
Mi código de archivo de 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');
}
}
}
Con este código, no puedo detener el proceso de agregar al carrito.
Entonces, según esta respuesta de Magento1: /programming/14190358/stop-add-to-cart-and-supply-message-to-user-in-magento . Traté de reemplazar
$this->_actionFlag->set('', \Magento\Framework\App\Action\Action::FLAG_NO_DISPATCH, true);
$this->redirect->redirect($controller->getResponse(), 'checkout/cart/index');
con (Esta no es la mejor manera de hacerlo. Si hay una mejor manera, sugiérale)
header("Location: " . $product->getProductUrl());
die();
Esto finalmente detiene el proceso de agregar al carrito, pero el botón Agregar al carrito sigue mostrando "Agregar" . ¿Cómo puedo realizar esto correctamente para que el botón Agregar al carrito vuelva a su estado anterior y el producto tampoco se agregue al carrito?