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?
fuente
Respuestas:
podría intentar establecer el parámetro del producto en falso y luego establecer el parámetro return_url:
El controlador del carrito verifica si el parámetro del producto está configurado aquí: https://github.com/magento/magento2/blob/2.0/app/code/Magento/Checkout/Controller/Cart/Add.php#L99
y si no es así, llama a goBack. el método goBack comprueba si realizó una solicitud ajax (creo que lo hizo) y luego devuelve un parámetro adicional backUrl en la respuesta ajax.
https://github.com/magento/magento2/blob/2.0/app/code/Magento/Checkout/Controller/Cart/Add.php#L165
El método getBackUrl luego devuelve el parámetro return_url:
https://github.com/magento/magento2/blob/2.0/app/code/Magento/Checkout/Controller/Cart.php#L113
=== ACTUALIZACIÓN ===
ok ya que el mensaje que agrega no funciona aquí, deberías intentarlo de otra manera (también es más sencillo)
cree un complemento para Intercetp antes de esta función: https://github.com/magento/magento2/blob/2.0/app/code/Magento/Checkout/Model/Cart.php#L341
Si no desea que se agregue su producto, simplemente inicie una Excepción con el Mensaje deseado. Aquí encontrará un buen tutorial para crear complementos: http://alanstorm.com/magento_2_object_manager_plugin_system
La adición del producto debe interrumpirse y la excepción debe mostrarse como mensaje https://github.com/magento/magento2/blob/2.0/app/code/Magento/Checkout/Controller/Cart/Add.php#L137
agregue el siguiente tipo a sus módulos, etc / frontend / di.xml
Entonces la clase
Vendor/Module/Model/Checkout/Cart/Plugin
debería verse así:fuente
A continuación se muestra mi código para evitar que el producto se agregue al carrito y muestre un mensaje de error con el observador.
Puede establecer las condiciones según sus requisitos para evitar que el producto se agregue al carrito.
fuente
Eliminar el último código de tres líneas
Y agregue esta línea: devuelva falso; Y establezca el valor del parámetro del producto: falso Entonces obtiene un mensaje de error y el cargador está oculto ... Gracias
fuente