Question

I am calling ajax request and performing add to cart functionality.

Here is my controller code,

use Magento\Framework\App\Action\Action;
use Magento\Framework\App\Action\Context;
use Magento\Framework\Controller\ResultFactory;
class UpgradeMember extends \Magento\Framework\App\Action\Action
{
    protected $formKey;   
    protected $cart;
    protected $product;
    protected $customerSession;
    private $productRepository;
    private $logger;
    public $_storeManager;
    protected $checkoutSession;
    protected $messageManager;
    protected $productFactory;

    public function __construct(
    \Magento\Framework\App\Action\Context $context,
    \Magento\Framework\Data\Form\FormKey $formKey,
    \Magento\Checkout\Model\Cart $cart,
    \Psr\Log\LoggerInterface $logger,
    \Magento\Catalog\Model\Product $product,
    \Magento\Checkout\Model\Session $checkoutSession,
    \Magento\Catalog\Api\ProductRepositoryInterface $productRepository,
    \Magento\Store\Model\StoreManagerInterface $storeManager,
    \Magento\Customer\Model\Session $customerSession,
    \Magento\Framework\Message\ManagerInterface $messageManager,
    \Magento\Catalog\Model\ProductFactory $productFactory
    ) {         
        $this->formKey = $formKey;
        $this->cart = $cart;
        $this->_storeManager = $storeManager;
        $this->product = $product;      
        $this->customerSession = $customerSession;
        $this->productRepository = $productRepository;
        $this->logger = $logger;
        $this->checkoutSession = $checkoutSession;
        $this->messageManager = $messageManager;
        $this->productFactory = $productFactory;
        parent::__construct($context);
    }

public function execute()
{
    $productData = $this->getRequest()->getPost('product_data');  //this is array of SKU  
    $productData = unserialize(base64_decode($productData));
    $customCoulmn = $this->getRequest()->getPost('custom_column');

    try{

        foreach ($productData as $productSku) : 
            $productId = $this->product->getIdBySku($productSku);
            $params = array(
                    'form_key' => $this->formKey->getFormKey(),
                    'product_id' => $productId, //product Id
                    'qty'   => 1 //quantity of product                      
                    );

            $_product = $this->productFactory->create()->load($productId); 
            $item = $this->cart->getQuote()->getItemByProduct($_product);
            if($item){
                $quote = $this->cart->getQuote();                   
                $quote->updateItem($item->getId(), array( 'qty' => 1));
                $quote->setData('custom_column', $customData); // Fill your custom data
                $quote->save();
            }else{                  
                $this->cart->addProduct($_product, $params);
                $quote = $this->cart->getQuote();
                $quote->setData('custom_column', $customData); // Fill your custom data
                $quote->save();
            }

            //$this->cart->addProduct($_product, $params);
        endforeach;
            $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;
}

}

Here I have created custom_column in quote_item table, so when this controller is hitting, I am adding the product to the cart, it is working fine, but I am not finding how can we update the value for my custom column,

Can anyone help me to achieve this please, Thanks for the help!!

Était-ce utile?

La solution

You can add the custom column data in your quote table by adding below code in your controller.

$quote->setData('custom_column', $customData); // Fill your custom data

EDIT:

Updated controller code

use Magento\Framework\App\Action\Action;
use Magento\Framework\App\Action\Context;
use Magento\Framework\Controller\ResultFactory;
class UpgradeMember extends \Magento\Framework\App\Action\Action
{
    protected $formKey;   
    protected $cart;
    protected $product;
    protected $customerSession;
    private $productRepository;
    private $logger;
    public $_storeManager;
    protected $checkoutSession;
    protected $messageManager;
    protected $productFactory;
    protected $quoteRepository;

    public function __construct(
    \Magento\Framework\App\Action\Context $context,
    \Magento\Framework\Data\Form\FormKey $formKey,
    \Magento\Checkout\Model\Cart $cart,
    \Psr\Log\LoggerInterface $logger,
    \Magento\Catalog\Model\Product $product,
    \Magento\Checkout\Model\Session $checkoutSession,
    \Magento\Catalog\Api\ProductRepositoryInterface $productRepository,
    \Magento\Store\Model\StoreManagerInterface $storeManager,
    \Magento\Customer\Model\Session $customerSession,
    \Magento\Framework\Message\ManagerInterface $messageManager,
    \Magento\Catalog\Model\ProductFactory $productFactory,
    \Magento\Quote\Model\QuoteRepository $quoteRepository
    ) {         
        $this->formKey = $formKey;
        $this->cart = $cart;
        $this->_storeManager = $storeManager;
        $this->product = $product;      
        $this->customerSession = $customerSession;
        $this->productRepository = $productRepository;
        $this->logger = $logger;
        $this->checkoutSession = $checkoutSession;
        $this->messageManager = $messageManager;
        $this->productFactory = $productFactory;
        $this->quoteRepository = $quoteRepository;
        parent::__construct($context);
    }

    public function execute()
    {
        $productData = $this->getRequest()->getPost('product_data');  //this is array of SKU  
        $productData = unserialize(base64_decode($productData));
        $customCoulmn = $this->getRequest()->getPost('custom_column');

        try{

            foreach ($productData as $productSku) : 
                $productId = $this->product->getIdBySku($productSku);
                $params = array(
                        'form_key' => $this->formKey->getFormKey(),
                        'product_id' => $productId, //product Id
                        'qty'   => 1 //quantity of product                      
                        );

                $_product = $this->productFactory->create()->load($productId); 
                $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);
                }

                $this->updateQuoteData($this->cart->getQuote()->getId(), $societyName, $societyCode, $instituteName, $instituteCode);
                //$this->cart->addProduct($_product, $params);
            endforeach;

            $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 updateQuoteData($quoteId, $societyName, $societyCode, $instituteName, $instituteCode)
    {
        $quote = $this->quoteRepository->get($quoteId); // Get quote by id
        foreach($quote->getAllVisibleItems() as $item){
            $item->setData('local_society', $societyName);
            $item->setData('society_code', $societyCode);
            $item->setData('local_institute', $instituteName);
            $item->setData('institute_code', $instituteCode);
            $item->save();
        }
    }

}

Hope it helps!!!

Autres conseils

There is an event to save custom column value in quote table try below method

Vendor/Module/etc/events.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
    <event name="checkout_cart_product_add_after">
        <observer name="add_custom_column_to_quote" instance="Vendor\Module\Observer\SaveToQuote" />
    </event>
</config>

Vendor\Module\Observer\SaveToQuote.php

<?php
namespace Vendor\Module\Observer;

use Magento\Framework\Event\ObserverInterface;

class saveRentalToQuote implements ObserverInterface {

    /**
     * @param \Magento\Framework\Event\Observer $observer
     * saves rental fields to quote items
     */
    public function execute(\Magento\Framework\Event\Observer $observer) {
        $item = $observer->getEvent()->getData('quote_item');
        $item->setData('custom_column', 'value');            
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top