Magento2 - Làm thế nào để ngăn sản phẩm không được thêm vào giỏ hàng theo chương trình?


13

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?

nhập mô tả hình ảnh ở đây


xin chào @reena bạn có thể giúp tôi làm thế nào bạn đã làm điều đó
mcoder

@mcoder - Tôi đã làm điều đó với một plugin. u có thể tham khảo câu trả lời được chấp nhận dưới đây để biết thêm chi tiết.
Reena Parekh

Tôi đã thử nhưng không thể làm được. Bạn có thể giúp tôi không, bạn đã làm gì mà tôi gặp vấn đề tương tự như bạn đã thấy những gì tôi đã thử: magento.stackexchange.com/questions/111231/ Nhưng nhưng nó không hoạt động
mcoder

Tôi muốn chuyển hướng đến url bên ngoài như google.com, tôi đã thử bên dưới một cái, nó chuyển hướng đến ajax thêm url giỏ hàng, tôi bị kẹt trong hai ngày nhưng không thể làm được :(. Tôi sẽ cố gắng quyên góp giúp bạn
mcoder

Làm thế nào bạn có thể nhận được giải pháp ?? bạn có thể cho tôi tất cả các mã whith tập tin? tôi có cùng một vấn đề
Jigs Parmar

Câu trả lời:


22

bạn có thể thử đặt param sản phẩm thành false và sau đó đặt param_ 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.'));

Bộ điều khiển giỏ hàng kiểm tra xem thông số sản phẩm có được đặt ở đây không: https://github.com/magento/magento2/blob/2.0/app/code/Magento/Checkout/Contoder/Cart/Add.php#L99

và nếu không, nó gọi goBack. phương thức goBack kiểm tra nếu bạn đã thực hiện một yêu cầu ajax (tôi nghĩ rằng bạn đã làm) và sau đó trả về một backUrl param bổ sung trong phản hồi ajax.

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

Phương thức getBackUrl sau đó trả về param_ return_url:

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

=== CẬP NHẬT ===

ok vì việc thêm tin nhắn không hoạt động ở đây, bạn nên thử một cách khác (nó cũng thẳng hơn)

tạo Plugin để Intercetp trước chức năng này: https://github.com/magento/magento2/blob/2.0/app/code/Magento/Checkout/Model/Cart.php#L341

Nếu bạn không muốn sản phẩm của mình được thêm vào, chỉ cần ném Ngoại lệ với Thông báo mong muốn. Bạn tìm thấy một hướng dẫn thú vị để tạo plugin tại đây: http://alanstorm.com/magento_2_object_manager_plugin_system

Việc thêm Sản phẩm phải bị gián đoạn và Ngoại lệ sẽ được hiển thị dưới dạng tin nhắn https://github.com/magento/magento2/blob/2.0/app/code/Magento/Checkout/Contoder/Cart/Add.php#L137

thêm loại sau vào mô-đun của bạn, v.v. / frontend / di.xml

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

Sau đó, lớp Vendor/Module/Model/Checkout/Cart/Pluginsẽ trông như thế này:

<?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
Cảm ơn bạn David. Giải pháp của bạn hoạt động, upvote từ tôi. Tuy nhiên, thông báo lỗi không được hiển thị. Tôi giả sử vì dòng này: github.com/magento/magento2/blob/2.0/app/code/Magento/Checkout/ trộm ? Bạn có thể đề nghị làm thế nào tôi có thể giải quyết điều đó?
Reena Parekh

1
vâng, thêm một giải pháp khác. Hãy chắc chắn xóa thư mục var / thế hệ và bộ đệm cấu hình để áp dụng những thay đổi này
David Verholen

Đã sử dụng phương thức 1 của bạn nhưng không thể nhận được thông báo lỗi, Làm cách nào tôi có thể đặt url trả về và thông báo trong phương thức 2 của bạn.
Amit Singh

1
Bạn có thể cho biết, làm thế nào tôi có thể nhận các giá trị tùy chọn tùy chỉnh ở đây?
anujeet

+1 Hoàn toàn rực rỡ! Giải pháp hoàn hảo (bản cập nhật). Hoạt động với 2.1.5.
Dave

2

Dưới đây là mã của tôi để ngăn sản phẩm được thêm vào giỏ hàng và hiển thị thông báo lỗi bằng cách sử dụng trình quan sát.

<?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.'));
            }
        }
    }
}

bạn có thể đặt các điều kiện theo yêu cầu của mình để ngăn sản phẩm thêm vào giỏ hàng.


Điều này làm việc cho tôi.
Hassan Al-Jeshi

0

Xóa mã ba dòng cuối cùng

Và thêm một dòng này: return false; Và đặt giá trị của sản phẩm param: false Sau đó, bạn nhận được thông báo lỗi và trình tải bị ẩn ... Cảm ơn

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.