0

I tried to add the products to cart by using code. I tried with below code

class Producttocart extends \Magento\Framework\App\Action\Action {

    protected $formKey;
    protected $cart;
    protected $product;
    protected $pageFactory;

    public function __construct(
    \Magento\Framework\App\Action\Context $context, \Magento\Framework\Data\Form\FormKey $formKey, \Magento\Checkout\Model\Cart $cart, \Magento\Framework\View\Result\PageFactory $pageFactory, \Magento\Catalog\Model\Product $product, array $data = []
    ) {
    $this->formKey = $formKey;
    $this->cart = $cart;
    $this->product = $product;
    $this->pageFactory = $pageFactory;
    parent::__construct($context);
    }

    public function execute()
{
$minQty = 3;
    $cart_product = $this->getRequest()->getParams();
//echo "<pre>";print_r($cart_product);die("here");
foreach ($cart_product as $selecttid => $optionid) {
        if (strpos($selecttid, 'options') !== false) {
            $productoptions[$selecttid] = $optionid;
        }
    }
//echo "<pre>";print_r($productoptions);die("here");
    //$cart_product = $this->_productFactory->getCollection()->addAttributeToFilter('entity_id',array('product_id1','product_id2'));
    if ($cart_product) {
        foreach ($cart_product as $key => $value) {
            if($value > 0){
        $product = $this->_productFactory->create()->load($key);
        $customOptions = $this->_objectManager->create('Magento\Catalog\Model\Product\OptionFactory')->create()->getProductOptionCollection($product);
        $qty = $this->stockItem->getStockQty($product->getId(), $product->getStore()->getWebsiteId());

// echo $qty;die("here"); if ($value < $minQty) $value = $minQty; if ($value > $qty) { $this->messageManager->addError(__('The requested quantity for "%s" is not available.' . $product->getName())); }else{ if($customOptions){ $matches = array(); foreach ($productoptions as $selecttid => $optionid) { if (strpos($selecttid, $product->getId() . 'options') !== false && is_numeric($optionid) && stripos($selecttid, $product->getId() . 'options')==0) { $selecttid1 = str_replace($product->getId() . 'options', "", $selecttid); $matches[$selecttid1] = $optionid;

                            }
                        }
            //echo "<pre>";print_r($matches);die("here");
            $this->addCartProductwithOptions($product->getId(), $value, $matches);
        }else{
             $this->addCartProduct($key, $value);
        }
        }
            }
        }
        $this->_cart->save();
    }
    $this->_redirect("checkout/cart/add/form_key/");
}

public function addCartProduct($productID, $productQty)
{
    $product = $this->_productFactory->create()->load($productID);
    $info = new \Magento\Framework\DataObject(
        [
            'form_key' => $this->formKey->getFormKey(),
            'product_id' => $productID,
            'qty' => $productQty
        ]
    );
    return $this->_cart->addProduct($product, $info);
}
public function addCartProductwithOptions($productID, $productQty, $options)
{
//echo "<pre>";print_r($options);die("here");
    $product = $this->_productFactory->create()->load($productID);
    $info = new \Magento\Framework\DataObject(
        [
            'form_key' => $this->formKey->getFormKey(),
            'product_id' => $productID,
            'qty' => $productQty,
    'options' => $options
        ]
    );
    return $this->_cart->addProduct($product, $info);
}

In this $params value is array like

Array
(
    [form_key] => D6a4V5hbr9XO26zk
    [1] => 1  //here [productid] => qty
    [2] => 1  //here [productid] => qty
    [Add_to_Cart] => Add to Cart
)

Here $productoptions value is like this Array ( [1_options_3] => 3 [2_options_4] => None ) $matches value is like this Array ( [3] => 3 ) product is added to cart but its qty is double is after added to cart is double like below screnshot http://prntscr.com/lty4h9

when qty>0 and is_numeric($productId) product need to add to cart but above code is only one product is added to cart. how can i solve this issue?

Radha Krishna
  • 536
  • 4
  • 24

2 Answers2

1
<?php

namespace Demo\Addtocart\Controller\Index;
use Magento\Framework\App\Action\Context;

class Customaddtocart extends \Magento\Framework\App\Action\Action
{
    protected $checkoutSession;
    protected $_productloader;
    protected $cartRepository;

    public function __construct(Context $context,
        \Magento\Catalog\Model\ProductFactory $_productloader,
        \Magento\Checkout\Model\Session $checkoutSession,
        \Magento\Quote\Api\CartRepositoryInterface $cartRepository,
        array $data = [])
    {

        $this->checkoutSession = $checkoutSession;
        $this->cartRepository = $cartRepository;
        $this->_productloader = $_productloader;
        parent::__construct($context);
    }

    public function execute()
    {
        $post = $this->getRequest()->getPost();
        $addtocartid = $post['addtocartid'];
        $qty = $post['qty'];

        $addtocartid=explode(",", $addtocartid);
        $qty=explode(",", $qty);
        $quote = $this->checkoutSession->getQuote();
        for($j = 0; $j < count($addtocartid); $j++)
        {
            $_product = $this->_productloader->create()->load($addtocartid[$j]);
            $quote->addProduct($_product, (int)$qty[$j]);
        }
        $this->cartRepository->save($quote);
        $this->checkoutSession->replaceQuote($quote)->unsLastRealOrderId();
    }
}
Kushal Dani
  • 2,114
  • 2
  • 17
  • 49
0

You need to change your addProduct() function's param. Follow my below answer and add in your controller :

class Producttocart extends \Magento\Framework\App\Action\Action {

    protected $formKey;
    protected $_productFactory;
    protected $_cart;
    protected $messageManager;
    public function __construct(
        Context $context,
        \Magento\Framework\Data\Form\FormKey $formKey,
        \Magento\Framework\Message\ManagerInterface $managerInterface,
        \Magento\Catalog\Model\ProductFactory $productFactory,
        \Magento\Checkout\Model\Cart $cart
    ) {
        parent::__construct($context);
        $this->formKey = $formKey;
        $this->_productFactory = $productFactory;
        $this->_cart = $cart;
        $this->messageManager = $managerInterface;
    }

    public function execute()
    {
        //$cart_product = your product data collection or 
        //$cart_product = $this->_productFactory->getCollection()->addAttributeToFilter('entity_id',array('product_id1','product_id2'));
        if ($cart_product) {
            foreach ($cart_product as $key => $value) {
                if($value['qty'] > 0){
                  $custom_option_value = '';
                  if (isset($value['super_attribute']) || !empty($value['super_attribute'])) {
                       $custom_option_value = $value['super_attribute'];
                   }
                   $this->addCartProduct($value['id'], $value['qty'],$custom_option_value);
                }
            }
            $this->_cart->save();
        }
        $this->_redirect("checkout/cart/add/form_key/");
    }

    public function addCartProduct($productID, $productQty,$custom_option_val)
    {
        $product = $this->_productFactory->create()->load($productID);
        $info = new \Magento\Framework\DataObject(
            [
                'form_key' => $this->formKey->getFormKey(),
                'product_id' => $productID,
                'qty' => $productQty,
                'super_attribute' => $custom_option_val
            ]
        );
        return $this->_cart->addProduct($product, $info);
    }
}
Rohan Hapani
  • 17,388
  • 9
  • 54
  • 96