1

I am adding product to cart from ajax by passing product id

Here is my controller code.

use Magento\Framework\Controller\ResultFactory;
use Magento\Framework\App\Action\Action;
use Magento\Framework\App\Action\Context;
class AddItems extends \Magento\Framework\App\Action\Action
{

protected $formKey;   
protected $cart;
protected $product;
protected $_resource;
protected $checkoutSession;

public function __construct(
    \Magento\Framework\App\Action\Context $context,
    \Magento\Framework\Data\Form\FormKey $formKey,
    \Magento\Checkout\Model\Cart $cart,
    \Magento\Catalog\Model\ProductFactory $product,
    \Magento\Framework\App\ResourceConnection $resource,
    \Magento\Checkout\Model\Session $checkoutSession,
    array $data = []
) {
    $this->formKey = $formKey;
    $this->cart = $cart;
    $this->product = $product;     
    $this->_resource = $resource;
    $this->checkoutSession = $checkoutSession;   
    parent::__construct($context);
}

public function execute()
{ 
   $selectedItems = $this->getRequest()->getPost('selectedItems');      
    $selectedItems = explode(",",$selectedItems);
    try{
    $connection = $this->getConnection();
    foreach ($selectedItems as $key => $selectedItem) {

        $params = array(
            'form_key' => $this->formKey->getFormKey(),
            'product_id' => $selectedItem, //product Id
            'qty'   =>1 //quantity of product                
        );
        $_product = $this->product->create()->load($selectedItem);       
         $item = $this->cart->getQuote()->getItemByProduct($_product );
        if($item){          
            $quote = $this->cart->getQuote();                   
            $quote->updateItem($item->getId(), array( 'qty' => 1));
            $quote->save();
        }else{                  
            $this->cart->addProduct($_product , $params);
        }
      $customPrice = 1000;
      $quote = $this->cart->getQuote();
      $quoteId = $quote->getId();   
      $productItem = $this->getProductQuote($_product );                
      $productItem->setCustomPrice($customPrice);
      $productItem->setOriginalCustomPrice($customPrice);
      $productItem->getProduct()->setIsSuperMode(true);     
     $insertProductSql = "INSERT INTO custom_table (quote_id, product_id) VALUES ('$quoteId', '$_product->getId()')";
        $connection->query($insertProductSql);
    }
        $this->cart->save();
        $status = 1;
    } catch (\Magento\Framework\Exception\LocalizedException $e) {
        $this->messageManager->addException($e,__('%1', $e->getMessage()));
        $status = 0;
    } catch (\Exception $e) {
        $this->messageManager->addException($e, __('error.'));
        $status = 0;
    }
    $result = array();
    $result['status'] = $status;
    $resultJson = $this->resultFactory->create(ResultFactory::TYPE_JSON);
    $resultJson->setData($result);
    return $resultJson;
    }
   public function getConnection()
   {
    $connection = $this->_resource->getConnection(\Magento\Framework\App\ResourceConnection::DEFAULT_CONNECTION);
    return $connection;
    }
  public function getProductQuote($product) {
    $quote = $this->checkoutSession->getQuote();        
    $cartItems = $quote->getItemByProduct($product);        
    return $cartItems;
   }
 }

Quote id is not getting retrieved for me, always it is empty.

I need to add both the items to the cart with insert query for custom table,

products are adding to the cart successfully,but quote id storing as null inside my custom table

Note: I am setting custom price for each product.

Can anyone look into this, where i am wrong please?

Any help would be appreciated. Thanks

  • print your sql query (echo $insertProductSql ) in browser and then check if you are getting the quote id in your insert query or not. – Dinesh Yadav May 13 at 12:00
  • @DineshYadav, not its not returned quoteid after printing it. – jafar pinjar May 13 at 12:16
  • Paste your query here which you printed in the browser. – Dinesh Yadav May 13 at 12:22
  • @DineshYadav, here is my result, INSERT INTO custom_table (quote_id, product_id) VALUES ('','3') – jafar pinjar May 13 at 12:25
  • Have you tried this? $this->cart->save(); $quote = $this->cart->getQuote(); $quoteId = $quote->getId(); – Dinesh Yadav May 13 at 12:30
1

you can use same logic as magento doing for related product

if you see below file

https://github.com/magento/magento2/blob/2.3-develop/app/code/Magento/Checkout/Controller/Cart/Add.php#L105
if (!empty($related)) {
            $this->cart->addProductsByIds(explode(',', $related));
        }

if you check that model

https://github.com/magento/magento2/blob/2.3-develop/app/code/Magento/Checkout/Model/Cart.php#L419


foreach ($productIds as $productId) {
            $productId = (int)$productId;
            if (!$productId) {
                continue;
            }
            $product = $this->_getProduct($productId);
            if ($product->getId() && $product->isVisibleInCatalog()) {
                try {
                    $this->getQuote()->addProduct($product);
                } catch (\Exception $e) {
                    $allAdded = false;
                }
            } else {
                $allAvailable = false;
            }
        }

        if (!$allAvailable) {
            $this->messageManager->addError(__("We don't have some of the products you want."));
        }
        if (!$allAdded) {
            $this->messageManager->addError(__("We don't have as many of some products as you want."));
        }
    }

you need to use same logic for you.

for you:-

 $selectedItems = explode(",",$selectedItems);
foreach ($selectedItems as $key=>$selectedItem) {
    $productId = (int)$productId;
    if (!$productId) {
        continue;
    }
    $product = $this->_getProduct($selectedItem);
    if ($product->getId() && $product->isVisibleInCatalog()) {
        $this->cart->getQuote()->addProduct($product);
    } 
}

$this->cart->save();
  • hi @Sunil Patel, is it possible to update for my question, that will be more helpful – jafar pinjar May 14 at 7:38
  • @jafarpinjar updated answer. – Sunil Patel May 14 at 7:47
  • what is $this->getQuote() here? need to inject any class?, then i am setting custom price for each item, – jafar pinjar May 14 at 7:50
  • @jafarpinjar updated – Sunil Patel May 14 at 7:56
  • hi @Sunil, so i need to replace only this line, $this->cart->addProduct($_product , $params); to $this->cart->getQuote()->addProduct($_product ,$params) – jafar pinjar May 14 at 8:00
0

I think you need to save the quote after adding product into the cart.

  $quote = $this->cart->getQuote();

after this line you can save the quote $quote->save(); then you can get the $quote->getId()

  • hi @Keyur shaw, no if used that code, two products will not add to cart – jafar pinjar May 10 at 13:42
  • What If you use $this->cart->save(); after $this->cart->addProduct as Magento is also using the same @jafarpinjar – Keyur Shah May 10 at 13:44
  • shaw, did you try the code, if used like that two products will not add to the cart – jafar pinjar May 10 at 13:50
  • because, i am setting custom price for each product, cart->save() used inside for each means, price for second product getting as 0 – jafar pinjar May 10 at 14:02
  • price 0 means? you are getting quote id or not? – Keyur Shah May 10 at 15:14
0

Try with this function:

public function execute()
{
    $selectedItems = $this->getRequest()->getPost('selectedItems');
    $selectedItems = explode(",", $selectedItems);
    try {

        $this->cart->save();
        $connection = $this->getConnection();
        foreach ($selectedItems as $key => $selectedItem) {

            $params = array(
                'form_key' => $this->formKey->getFormKey(),
                'product_id' => $selectedItem, //product Id
                'qty' => 1 //quantity of product                
            );
            $_product = $this->product->create()->load($selectedItem);
            $item = $this->cart->getQuote()->getItemByProduct($_product);
            if ($item) {
                $this->cart->updateItem($item->getId(), array('qty' => 1));
            } else {
                $this->cart->addProduct($_product, $params);
            }
            $customPrice = 1000;
            $quote = $this->cart->getQuote();
            $quoteId = $quote->getId();
            $productItem = $this->getProductQuote($_product);
            $productItem->setCustomPrice($customPrice);
            $productItem->setOriginalCustomPrice($customPrice);
            $productItem->getProduct()->setIsSuperMode(true);
            $insertProductSql = "INSERT INTO custom_table (quote_id, product_id) VALUES ('$quoteId', '$_product->getId()')";
            $connection->query($insertProductSql);
        }
        $this->cart->save();
        $status = 1;
    } catch (\Magento\Framework\Exception\LocalizedException $e) {
        $this->messageManager->addException($e, __('%1', $e->getMessage()));
        $status = 0;
    } catch (\Exception $e) {
        $this->messageManager->addException($e, __('error.'));
        $status = 0;
    }
    $result = array();
    $result['status'] = $status;
    $resultJson = $this->resultFactory->create(ResultFactory::TYPE_JSON);
    $resultJson->setData($result);
    return $resultJson;
}
  • @Daneil, yes tried it, if $this->cart->save(); is used inside foreach, the custom price for next product is set to 0, that is why i used save() outside for each. – jafar pinjar May 14 at 7:17
  • I have just updated the answer, please try again – Daniel Truong May 14 at 8:35

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.