สิ่งที่ฉันต้องการทำคือถ้าแอตทริบิวต์ที่กำหนดเองของฉันถูกตั้งค่าในเครื่องหมายคำพูดแล้วฉันไม่ต้องการให้ผลิตภัณฑ์ใด ๆ ที่จะเพิ่มในรถเข็น แอตทริบิวต์ที่กำหนดเองของฉันถูกตั้งค่าอย่างถูกต้อง
หากต้องการหยุดการเพิ่มสินค้าลงในรถเข็นฉันได้เขียนผู้สังเกตการณ์ซึ่งสังเกตเหตุการณ์นี้ controller_action_predispatch_checkout_cart_add
รหัสไฟล์ผู้สังเกตการณ์ของฉัน:
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');
}
}
}
ด้วยรหัสนี้ฉันไม่สามารถหยุดกระบวนการสั่งซื้อได้
ดังนั้นตามคำตอบของ Magento1 นี้ - /programming/14190358/stop-add-to-cart-and-supply-message-to-user-in-magento ฉันพยายามแทนที่
$this->_actionFlag->set('', \Magento\Framework\App\Action\Action::FLAG_NO_DISPATCH, true);
$this->redirect->redirect($controller->getResponse(), 'checkout/cart/index');
ด้วย (นี่ไม่ใช่วิธีที่ดีที่สุดในการทำหากมีวิธีที่ดีกว่าโปรดแนะนำ)
header("Location: " . $product->getProductUrl());
die();
ในที่สุดสิ่งนี้จะหยุดกระบวนการเพิ่มลงในรถเข็น แต่ปุ่มเพิ่มลงในรถเข็นยังคงแสดง"กำลังเพิ่ม"อยู่ ฉันจะทำสิ่งนี้อย่างถูกต้องได้อย่างไรเพื่อให้ปุ่มสั่งซื้อกลับไปสู่สถานะก่อนหน้าและสินค้าไม่ได้ถูกเพิ่มลงในรถเข็นด้วย?