Những gì tôi muốn làm là nếu thuộc tính tùy chỉnh của tôi được đặt trong trích dẫn thì tôi không muốn bất kỳ sản phẩm nào được thêm vào giỏ hàng. Thuộc tính tùy chỉnh của tôi đang được đặt chính xác.
Để ngăn sản phẩm không được thêm vào giỏ hàng, tôi đã viết một Người quan sát quan sát sự kiện này controller_action_predispatch_checkout_cart_add
Mã tập tin quan sát viên của tôi:
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');
}
}
}
Với mã này, tôi không thể dừng quá trình thêm vào giỏ hàng.
Vì vậy, theo câu trả lời này của Magento1 - /programming/14190353/stop-add-to-cart-and-supply-message-to-user-in-magento . Tôi đã thử thay thế
$this->_actionFlag->set('', \Magento\Framework\App\Action\Action::FLAG_NO_DISPATCH, true);
$this->redirect->redirect($controller->getResponse(), 'checkout/cart/index');
với (Đây không phải là cách tốt nhất để làm điều đó. Nếu có cách nào tốt hơn, vui lòng đề xuất)
header("Location: " . $product->getProductUrl());
die();
Điều này cuối cùng dừng quá trình thêm vào giỏ hàng nhưng nút thêm vào giỏ hàng vẫn tiếp tục hiển thị "Thêm" . Làm thế nào tôi có thể thực hiện điều này một cách chính xác để nút thêm vào giỏ hàng trở lại trạng thái trước đó và sản phẩm cũng không được thêm vào giỏ hàng?