Magento2 - Cách thêm sản phẩm vào giỏ hàng theo chương trình khi checkout_cart_product_add_after được kích hoạt


8

Hãy xem xét có hai sản phẩm, ví dụ: Sản phẩm A và Sản phẩm B. Sản phẩm B là sản phẩm có tính chất virus mà tôi cần thêm vào giỏ hàng khi Sản phẩm A được thêm vào sản phẩm đó.

Để làm như vậy, tôi đang cố gắng thêm Sản phẩm B vào giỏ hàng bằng cách quan sát một sự kiện checkout_cart_product_add_after. Khi Sản phẩm A được thêm vào, tôi đang truy xuất số lượng sản phẩm được thêm vào Sản phẩm A và dựa trên sản phẩm đó, tôi đang cố gắng thêm Sản phẩm B theo chương trình. Để thêm sản phẩm B, tôi đã viết mã dưới đây:

<?php
namespace MyModule\Applicationcharges\Observer;

use Magento\Framework\Event\ObserverInterface;
use Magento\Framework\App\RequestInterface;

class AddCharges implements ObserverInterface
{
    protected $_productRepository;
    protected $_cart;

    public function __construct(\Magento\Catalog\Model\ProductRepository $productRepository, \Magento\Checkout\Model\Cart $cart){
        $this->_productRepository = $productRepository;
        $this->_cart = $cart;
    }

    public function execute(\Magento\Framework\Event\Observer $observer)
    {
        $item=$observer->getEvent()->getData('quote_item');
        $product=$observer->getEvent()->getData('product');
        $item = ( $item->getParentItem() ? $item->getParentItem() : $item );
        $product->getQty();

        $params = array(
            'product' => 2056,
            'qty' => 1
        );

        $_product = $this->_productRepository->getById(2056);
        $this->_cart->addProduct($_product,$params);
        $this->_cart->save();
    }
}

Tuy nhiên, cố gắng thêm sản phẩm bằng cách sử dụng $this->_cart->addProduct()không hoạt động. Bất cứ ai có thể xin vui lòng hướng dẫn làm thế nào điều này có thể được thực hiện? Có bất cứ điều gì tôi đang thiếu.

Bất kỳ hướng dẫn sẽ được đánh giá cao.

Câu trả lời:


8

Đối với tất cả những người có thể lãng phí ngày của họ trong tương lai, xin vui lòng lưu ý câu trả lời dưới đây sẽ hữu ích cho bạn.

Các mã trên để thêm sản phẩm vào giỏ hàng hoạt động tốt. Tuy nhiên, vấn đề là với logic. Tôi sẽ giải thích nó dưới đây.

Trước hết tôi đã cố gắng thêm một sản phẩm vào sự kiện checkout_cart_product_add_after. Sự kiện này được kích hoạt khi sản phẩm được thêm vào giỏ hàng.

Đào sâu hơn vào mã, nếu bạn thực hiện chức năng. Mã để thêm sản phẩm vào giỏ hàng là:$this->_cart->addProduct($_product,$params);

Nếu bạn kiểm tra addProductchức năng trong vendor/module-checkout/Model/Cart.phpbạn sẽ thấy đó là chức năng đang gửi checkout_cart_product_add_aftersự kiện.

Do đó, trong trường hợp của chúng tôi, điều khiển sẽ lại quay trở lại tệp quan sát viên, một lần nữa sẽ cố gắng thêm sản phẩm vào giỏ hàng. Đệ quy sẽ được tạo ra sẽ chạy cho đến khi lượng khí thải sản phẩm của chúng tôi.

Một khi số lượng đã cạn kiệt nó sẽ dừng lại. Bây giờ những gì chúng ta cần làm là, thêm một điều kiện để ngăn chặn đệ quy này. Các điều kiện có thể theo logic của bạn.

Bây giờ mỗi khi một sản phẩm được thêm vào giỏ hàng $product->getId()sẽ trả lại sản phẩm mới nhất được thêm vào. Bạn có thể sử dụng điều này để đặt điều kiện.

Cuối cùng, mã của tôi trông giống như dưới đây:

<?php
namespace MyModule\Applicationcharges\Observer;

use Magento\Framework\Event\ObserverInterface;
use Magento\Framework\App\RequestInterface;

class AddCharges implements ObserverInterface
{
    protected $_productRepository;
    protected $_cart;
    protected $formKey;

    public function __construct(\Magento\Catalog\Model\ProductRepository $productRepository, \Magento\Checkout\Model\Cart $cart, \Magento\Framework\Data\Form\FormKey $formKey){
        $this->_productRepository = $productRepository;
        $this->_cart = $cart;
        $this->formKey = $formKey;
    }
    public function execute(\Magento\Framework\Event\Observer $observer)
    {
        $item = $observer->getEvent()->getData('quote_item');
        $product = $observer->getEvent()->getData('product');
        $item = ($item->getParentItem() ? $item->getParentItem() : $item);

        // Enter the id of the prouduct which are required to be added to avoid recurrssion
        if($product->getId() != 2056){
            $params = array(
                'product' => 2056,
                'qty' => $product->getQty()
            );
            $_product = $this->_productRepository->getById(2056);
            $this->_cart->addProduct($_product,$params);
            $this->_cart->save();
        }

    }
}

Nếu người dùng cập nhật giỏ hàng thì sao? Bạn có nghĩ rằng điều này vẫn sẽ được kích hoạt?
MagePologistso

2
Ngay cả từ Magento 2.1.0, cách tiếp cận này dường như không được chấp nhận.
MagePologistso

@Dexter làm thế nào để thêm sản phẩm với tùy chọn tùy chỉnh cần thiết vào giỏ hàng?
Shell Suite

@MagePologistso làm thế nào tôi có thể biết rằng chức năng nào như bạn đang đề xuất rằng nó sẽ bị từ chối, ý tôi là (tôi đang học Magento 2) làm thế nào bạn biết điều đó. Bất kỳ tài liệu hoặc bất cứ điều gì khác, nhà phát triển Mage phải đọc trước khi chúng tôi tùy chỉnh bất kỳ chức năng nào.
inrsaurabh

$ item = $ observer-> getEvent () -> getData ('quote_item'); $ sản phẩm = $ observer-> getEvent () -> getData ('sản phẩm'); $ item = ($ item-> getParentItem ()? $ item-> getParentItem (): $ item); Nếu tôi in echo $ item-> getId (); nó là null tôi không nhận được gì ở đây
Dharmesh Hariyani

0

Tôi đã thực hiện một hình thức khác, cho khách hàng đăng nhập và giỏ hàng của khách

<?php

namespace Ysa\Core\Controller\Api;

use Magento\Framework\App\Action\Action as Action;
use Magento\Framework\App\ResponseInterface;

class Cart extends Action
{
    public function __construct(
        \Magento\Framework\App\Action\Context $context,
        \Magento\Framework\View\Result\PageFactory $resultPageFactory,
        \Magento\Catalog\Model\Product $product,
        \Magento\Quote\Api\CartRepositoryInterface $cartRepositoryInterface,
        \Magento\Store\Model\Store $store,
        \Magento\Checkout\Model\Session $session,
        \Magento\Catalog\Model\ProductFactory $productFactory,
        \Magento\Quote\Api\CartManagementInterface $quoteManagement
    ) {
        $this->resultPageFactory        = $resultPageFactory;
        $this->_cartRepositoryInterface = $cartRepositoryInterface;
        $this->_store                   = $store;
        $this->_session                 = $session;
        $this->_productFactory          = $productFactory;
        $this->_quoteManagement         = $quoteManagement;

        parent::__construct($context);
    }

    /**
     * @return ResponseInterface|\Magento\Framework\Controller\ResultInterface|void
     * @throws \Magento\Framework\Exception\LocalizedException
     */
    public function execute()
    {
        $product_id = $this->getRequest()->getParam('product');
        $product = $this->_productFactory->create();
        $product->load($product_id);

        $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
        $customerSession = $objectManager->get('Magento\Customer\Model\Session');

        if ($customerSession->isLoggedIn()) {
            $customer = $customerSession->getCustomer();
            $quoteId = $this->_quoteManagement->createEmptyCartForCustomer($customer->getId());
            $quote = $this->_cartRepositoryInterface->get($quoteId);
            $quote->addProduct($product);
            $this->_cartRepositoryInterface->save($quote);
            $quote->collectTotals();
        } else {
            $quote = $this->_session->getQuote();
            $quote->setStore($this->_store);
            $quote->setCurrency();
            $quote->addProduct($product);
            $quote->save();
            $quote->collectTotals();
            $this->_cartRepositoryInterface->save($quote);
        }
    }
}


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.