Magento2 - วิธีการหยุดผลิตภัณฑ์ไม่ให้ถูกเพิ่มลงในรถเข็นโดยทางโปรแกรม?


13

สิ่งที่ฉันต้องการทำคือถ้าแอตทริบิวต์ที่กำหนดเองของฉันถูกตั้งค่าในเครื่องหมายคำพูดแล้วฉันไม่ต้องการให้ผลิตภัณฑ์ใด ๆ ที่จะเพิ่มในรถเข็น แอตทริบิวต์ที่กำหนดเองของฉันถูกตั้งค่าอย่างถูกต้อง

หากต้องการหยุดการเพิ่มสินค้าลงในรถเข็นฉันได้เขียนผู้สังเกตการณ์ซึ่งสังเกตเหตุการณ์นี้ 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();

ในที่สุดสิ่งนี้จะหยุดกระบวนการเพิ่มลงในรถเข็น แต่ปุ่มเพิ่มลงในรถเข็นยังคงแสดง"กำลังเพิ่ม"อยู่ ฉันจะทำสิ่งนี้อย่างถูกต้องได้อย่างไรเพื่อให้ปุ่มสั่งซื้อกลับไปสู่สถานะก่อนหน้าและสินค้าไม่ได้ถูกเพิ่มลงในรถเข็นด้วย?

ป้อนคำอธิบายรูปภาพที่นี่


สวัสดี @reena คุณสามารถช่วยฉันได้อย่างไรว่าคุณทำเช่นนั้นได้อย่างไร
mcoder

@mcoder - ฉันทำมันด้วยปลั๊กอิน คุณสามารถอ้างถึงคำตอบที่ได้รับการยอมรับด้านล่างสำหรับรายละเอียดเพิ่มเติม
Reena Parekh

ฉันพยายาม แต่ไม่สามารถทำคุณได้โปรดช่วยฉันว่าคุณทำอย่างไรฉันมีปัญหาเช่นเดียวกับที่คุณเห็นสิ่งที่ฉันพยายาม: magento.stackexchange.com/questions/111231/ …… แต่มันไม่ทำงาน
mcoder

ฉันต้องการที่จะเปลี่ยนเส้นทางไปยัง URL ภายนอกเช่น google.com ฉันลองด้านล่างหนึ่งมันเปลี่ยนเส้นทางไปยัง ajax เพิ่ม url ตะกร้าฉันติดอยู่สองวัน แต่ไม่สามารถทำได้ :( ฉันจะพยายามบริจาคให้คุณช่วย
mcoder

คุณจะแก้ปัญหาได้อย่างไร? คุณสามารถให้รหัสไฟล์ทั้งหมดแก่ฉันได้หรือไม่ ฉันมีปัญหาเดียวกัน
Jigs Parmar

คำตอบ:


22

คุณสามารถลองตั้งค่าพารามิเตอร์ของผลิตภัณฑ์เป็นเท็จแล้วตั้งค่าพารามิเตอร์ return_url:

$observer->getRequest()->setParam('product', false);
$observer->getRequest()->setParam('return_url', $this->_redirect->getRefererUrl());
$this->_messageManager->addError(__('This product cannot be added to your cart.'));

ตัวควบคุมรถเข็นตรวจสอบว่ามีการตั้งค่าพารามิเตอร์ของผลิตภัณฑ์ที่นี่: https://github.com/magento/magento2/blob/2.0/app/code/Magento/Checkout/Controller/Cart/Add.php#L99

และหากไม่เป็นเช่นนั้นจะเรียก goBack วิธีการ goBack ตรวจสอบว่าคุณทำคำขอ ajax (ฉันคิดว่าคุณทำ) แล้วส่งคืน param backUrl เพิ่มเติมในการตอบกลับ ajax

https://github.com/magento/magento2/blob/2.0/app/code/Magento/Checkout/Controller/Cart/Add.php#L165

เมธอด getBackUrl จะส่งคืนพารามิเตอร์ return_url:

https://github.com/magento/magento2/blob/2.0/app/code/Magento/Checkout/Controller/Cart.php#L113

=== UPDATE ===

ตกลงเนื่องจากการเพิ่มข้อความไม่ทำงานที่นี่คุณควรลองวิธีอื่น

สร้างปลั๊กอินเพื่อ Intercetp ก่อนฟังก์ชั่นนี้: https://github.com/magento/magento2/blob/2.0/app/code/Magento/Checkout/Model/Cart.php#L341

หากคุณไม่ต้องการเพิ่มผลิตภัณฑ์ของคุณเพียงแค่โยนข้อยกเว้นด้วยข้อความที่ต้องการ คุณพบบทช่วยสอนที่ดีสำหรับการสร้างปลั๊กอินที่นี่: http://alanstorm.com/magento_2_object_manager_plugin_system

การเพิ่มผลิตภัณฑ์ควรถูกขัดจังหวะและการยกเว้นควรแสดงเป็นข้อความhttps://github.com/magento/magento2/blob/2.0/app/code/Magento/Checkout/Controller/Cart/Add.php#L137

เพิ่มประเภทต่อไปนี้ในโมดูลของคุณ etc / frontend / di.xml

<type name="Magento\Checkout\Model\Cart">
    <plugin name="interceptAddingProductToCart"
            type="Vendor\Module\Model\Checkout\Cart\Plugin"
            sortOrder="10"
            disabled="false"/>
</type>

จากนั้นชั้นVendor/Module/Model/Checkout/Cart/Pluginควรมีลักษณะเช่นนี้:

<?php
namespace Vendor\Module\Model\Checkout\Cart;

use Magento\Framework\Exception\LocalizedException;

class Plugin
{
    /**
     * @var \Magento\Quote\Model\Quote
     */
    protected $quote;

    /**
     * Plugin constructor.
     *
     * @param \Magento\Checkout\Model\Session $checkoutSession
     */
    public function __construct(
        \Magento\Checkout\Model\Session $checkoutSession
    ) {
        $this->quote = $checkoutSession->getQuote();
    }

    /**
     * beforeAddProduct
     *
     * @param      $subject
     * @param      $productInfo
     * @param null $requestInfo
     *
     * @return array
     * @throws LocalizedException
     */
    public function beforeAddProduct($subject, $productInfo, $requestInfo = null)
    {
        if ($this->quote->hasData('custom_attribute')) {
            throw new LocalizedException(__('Could not add Product to Cart'));
        }

        return [$productInfo, $requestInfo];
    }
}

1
ขอบคุณเดวิด โซลูชันของคุณใช้งานได้ดีมากขึ้นจากฉัน อย่างไรก็ตามข้อความแสดงข้อผิดพลาดไม่ปรากฏขึ้น ฉันสมมติว่าเป็นเพราะบรรทัดนี้: github.com/magento/magento2/blob/2.0/app/code/Magento/Checkout/ …? คุณช่วยแนะนำฉันจะแก้ไขได้อย่างไร
Reena Parekh

1
ใช่ jut เพิ่มโซลูชันอื่น อย่าลืมล้างโฟลเดอร์ var / generation และแคชการกำหนดค่าเพื่อใช้การเปลี่ยนแปลงเหล่านี้
David Verholen

ใช้วิธีที่ 1 ของคุณ แต่ไม่สามารถรับข้อความแสดงข้อผิดพลาดฉันจะตั้ง url ที่ส่งคืนและข้อความในวิธีที่ 2 ของคุณได้อย่างไร
Amit Singh

1
คุณสามารถบอกได้ฉันจะรับค่าตัวเลือกที่กำหนดเองได้ที่นี่ได้อย่างไร
anujeet

+1 ยอดเยี่ยมที่สุด! โซลูชั่นที่สมบูรณ์แบบ (อัปเดต) ทำงานร่วมกับ 2.1.5
เดฟ

2

ด้านล่างเป็นรหัสของฉันเพื่อหยุดการเพิ่มสินค้าลงในรถเข็นและแสดงข้อความข้อผิดพลาดโดยใช้ผู้สังเกตการณ์

<?php
use Magento\Framework\Event\ObserverInterface;

class ProductAddCartBefore implements ObserverInterface
{

    protected $_request;
    protected $_checkoutSession;
    protected $_messageManager;

    public function __construct(
        \Magento\Framework\App\RequestInterface $request,  
        \Magento\Framework\Message\ManagerInterface $messageManager,
        \Magento\Checkout\Model\SessionFactory $checkoutSession
    )
    {
        $this->_request = $request;
        $this->_messageManager = $messageManager;
        $this->_checkoutSession = $checkoutSession;
    }

    public function execute(\Magento\Framework\Event\Observer $observer)
    {
        $productId = $observer->getRequest()->getParam('product');

        $quote = $this->_checkoutSession->create()->getQuote();

        $itemsCount = $quote->getItemsSummaryQty();

        if($itemsCount > 0 && $productId != 1949)
        {
            if($quote->hasProductId(1949)) 
            {   
                $observer->getRequest()->setParam('product', false);
                $observer->getRequest()->setParam('return_url', false);
                $this->_messageManager->addErrorMessage(__('To proceed please remove other items from the cart.'));
            }
        }
    }
}

คุณสามารถกำหนดเงื่อนไขตามความต้องการของคุณเพื่อป้องกันไม่ให้สินค้าเพิ่มในรถเข็น


สิ่งนี้ใช้ได้สำหรับฉัน
Hassan Al-Jeshi

0

ลบรหัสสามบรรทัดสุดท้าย

และเพิ่มหนึ่งบรรทัดนี้กลับเท็จ; และกำหนดค่าของพารามิเตอร์ผลิตภัณฑ์: false จากนั้นคุณจะได้รับข้อความแสดงข้อผิดพลาดและตัวโหลดจะถูกซ่อน ... ขอบคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.