Showing posts with label add product programmatically. Show all posts
Showing posts with label add product programmatically. Show all posts

Wednesday, March 18, 2020

Display custom options in admin side in sales order details which created by programmatically

In the previous post, I explain how to create custom options by programmatically. Now I saw you how to display it in admin order details.
Here I saw you how to display custom options at admin sales order details which are created by programmatically.





Now created code in this manner.

\Czargroup\Addtocart\registration.php


<?php
\Magento\Framework\Component\ComponentRegistrar::register(
    \Magento\Framework\Component\ComponentRegistrar::MODULE,
    'Czargroup_Addtocart',
    __DIR__
);



\Czargroup\Addtocart\etc\module.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
    <module name="Czargroup_Addtocart" setup_version="1.0.1" />
</config>



\Czargroup\Addtocart\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="sales_model_service_quote_submit_before">
        <observer name="unique_name" instance="Czargroup\Addtocart\Observer\OrderItemAdditionalOptions" />
    </event>
</config>



\Czargroup\Addtocart\etc\frontend\routes.xml

<?xml version="1.0" ?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">
    <router id="standard">
        <route frontName="addtocart" id="addtocart">
            <module name="Czargroup_Addtocart"/>
        </route>
    </router>
</config>



\Czargroup\Addtocart\Controller\Index\Index.php

<?php
namespace Czargroup\Addtocart\Controller\Index;
use Magento\Framework\App\Action\Action;
use Magento\Framework\App\Action\Context;
use Magento\Framework\Data\Form\FormKey;
use Magento\Checkout\Model\Cart;
use Magento\Catalog\Model\Product;
use Magento\Framework\View\Result\PageFactory;

class Index extends \Magento\Framework\App\Action\Action
{
    protected $formKey;  
    protected $cart;
    protected $product;
    protected $_pageFactory;
    protected $_session;
    protected $serializer;
    protected $ProductRepository;

    protected $_responseFactory;

    public function __construct(
    \Magento\Framework\App\Action\Context $context,
    \Magento\Framework\Data\Form\FormKey $formKey,
    \Magento\Checkout\Model\Cart $cart,
    \Magento\Catalog\Model\Product $product,
    \Magento\Catalog\Model\ProductRepository $ProductRepository,
    \Magento\Customer\Model\Session $session,
    \Magento\Framework\Serialize\SerializerInterface $serializer,
    \Magento\Framework\View\Result\PageFactory $PageFactory,
    \Magento\Framework\App\ResponseFactory $responseFactory,
    array $data = []) {
        $this->_responseFactory = $responseFactory;

        $this->formKey = $formKey;
        $this->_pageFactory = $PageFactory;
        $this->cart = $cart;
        $this->serializer = $serializer;
        $this->product = $product;
        $this->ProductRepository = $ProductRepository;
        $this->_session = $session;   
        parent::__construct($context);
    }

    public function execute()
    {
      $page = $this->_pageFactory->create();
      $productId =1;
      $id = $this->_session->getId();
      $additionalOptions['firstnamesku'] = [
                'label' => 'First Name',
                'value' => 'chirag',
            ];
      $additionalOptions['lnamesku'] = [
                'label' => 'Last Name',
                'value' => 'parmar',
            ];
      $additionalOptions['emailidsku'] = [
                'label' => 'Email ID',
                'value' => 'chirag@gmail.com',
            ];
      $additionalOptions['phonenosku'] = [
                'label' => 'Phone No',
                'value' => '1234567890',
            ];
    
      if(!$this->_session->isLoggedIn()){
      $params = array(
                    'form_key' => $this->formKey->getFormKey(),
                    'product' => $productId, //product Id
                    'qty'   =>1 //quantity of product
            );  
       }else{
            $params = array(
                    'form_key' => $this->formKey->getFormKey(),
                    'product' => $productId, //product Id
                    'qty'   =>1, //quantity of product
                    'customer_id'   =>$id
            );
    }          
    //Load the product based on productID  
    $_product = $this->ProductRepository->getById($productId);
    $_product->addCustomOption('additional_options', $this->serializer->serialize($additionalOptions));
    $this->cart->addProduct($_product, $params)->getParentItem();
    $this->cart->save();
    //return $page;
    $message = "Product have been successfully added to your Shopping Cart.";
    $this->messageManager->addSuccess($message);
    $accUrl = $this->_url->getUrl('checkout/cart/');
    $this->_responseFactory->create()->setRedirect($accUrl)->sendResponse();
    $this->setRefererUrl($accUrl);
  }
}



\Czargroup\Addtocart\Observer\OrderItemAdditionalOptions.php

<?php
namespace Czargroup\Addtocart\Observer;

use \Magento\Framework\Event\ObserverInterface;
use \Magento\Framework\Unserialize\Unserialize;
use \Magento\Framework\Serialize\Serializer\Json;

class OrderItemAdditionalOptions implements ObserverInterface
{
    /**
     * @param \Magento\Framework\Event\Observer $observer
     */
    protected $Unserialize;
    protected $Serializer;

    public function __construct(
        Unserialize $Unserialize,
        Json $Json
    ){
        $this->Unserialize = $Unserialize;
        $this->Serializer = $Json;
    }

    public function execute(\Magento\Framework\Event\Observer $observer)
    {
        try {
            $quote = $observer->getQuote();
            $order = $observer->getOrder();
            $quoteItems = [];

            // Map Quote Item with Quote Item Id
            foreach ($quote->getAllVisibleItems() as $quoteItem) {
                $quoteItems[$quoteItem->getId()] = $quoteItem;
            }

            foreach ($order->getAllVisibleItems() as $orderItem) {
                $quoteItemId = $orderItem->getQuoteItemId();
                $quoteItem = $quoteItems[$quoteItemId];
                $additionalOptions = $quoteItem->getOptionByCode('additional_options');
                // Get Order Item's other options
                $options = $orderItem->getProductOptions();
                // Set additional options to Order Item
                if($this->isSerialized($additionalOptions->getValue())){
                    $options['options'] = $this->Unserialize->unserialize($additionalOptions->getValue());
                }else{
                    $options['options'] = $this->Serializer->unserialize($additionalOptions->getValue());
                }
                    $orderItem->setProductOptions($options);
            }
        }

        catch (\Exception $e) {
            // catch error if any
            echo $e->getMessage();
        }
    }
    private function isSerialized($value)
    {
        return (boolean) preg_match('/^((s|i|d|b|a|O|C):|N;)/', $value);
    }
}
?>

Now run commands : 

php bin/magento setup:upgrade
php bin/magento setup:di:compile
php bin/magento setup:static-content:deploy -f
php bin/magento c:f


now hit url like this:
yourwebsite.com/addtocart
You will get this window and message:


Now click on Proceed to Checkout. Place order successfully.

Go to admin->sales-> order details page
You can see this data.


Thursday, March 5, 2020

magento 2 add product to cart programmatically with custom options

Hello

Here I explain to you how to add product to cart programmatically with custom options.

First, create custom options from the Magento admin.


 Now go to app->code->Czar->Cart


 registration.php

<?php
\Magento\Framework\Component\ComponentRegistrar::register(
    \Magento\Framework\Component\ComponentRegistrar::MODULE,
    'Czar_Cart',
    __DIR__
);


etc -> module.xml

 <?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
    <module name="Czar_Cart" setup_version="1.0.0">
    </module>
</config>


etc -> routes.xml

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">
    <router id="standard">
        <route id="add" frontName="add">
            <module name="Czar_Cart"/>
        </route>
    </router>
</config>


Controller->Index->Index.php


<?php
namespace Czar\Cart\Controller\Index;

use Magento\Framework\App\Action\Action;
use Magento\Framework\App\Action\Context;
use Magento\Framework\Data\Form\FormKey;
use Magento\Checkout\Model\Cart;
use Magento\Catalog\Model\Product;

class Index extends Action
{
protected $formKey;  
protected $cart;
protected $product;
protected $_pageFactory;
protected $_session;
protected $serializer;
protected $ProductRepository;

protected $_responseFactory;

public function __construct(
\Magento\Framework\App\Action\Context $context,
\Magento\Framework\Data\Form\FormKey $formKey,
\Magento\Checkout\Model\Cart $cart,
\Magento\Catalog\Model\Product $product,
 \Magento\Catalog\Model\ProductRepository $ProductRepository,
\Magento\Customer\Model\Session $session,
\Magento\Framework\Serialize\SerializerInterface $serializer,
\Magento\Framework\View\Result\PageFactory $PageFactory,
\Magento\Framework\App\ResponseFactory $responseFactory,
array $data = []) {
    $this->_responseFactory = $responseFactory;

    $this->formKey = $formKey;
    $this->_pageFactory = $PageFactory;
    $this->cart = $cart;
    $this->serializer = $serializer;
    $this->product = $product;
    $this->ProductRepository = $ProductRepository;
    $this->_session = $session;   
    parent::__construct($context);
}

public function execute()
 {

  $page = $this->_pageFactory->create();
  $productId =1;
  $id = $this->_session->getId();
  $additionalOptions['firstnamesku'] = [
            'label' => 'First Name',
            'value' => 'chirag',
        ];
  $additionalOptions['lnamesku'] = [
            'label' => 'Last Name',
            'value' => 'parmar',
        ];
  $additionalOptions['emailidsku'] = [
            'label' => 'Email ID',
            'value' => 'chirag@czargroup.net',
        ];
  $additionalOptions['phonenosku'] = [
            'label' => 'Phone No',
            'value' => '1234567890',
        ];

  if(!$this->_session->isLoggedIn()){
  $params = array(
                'form_key' => $this->formKey->getFormKey(),
                'product' => $productId, //product Id
                'qty'   =>1 //quantity of product
                             
            );  
   }else{
           $params = array(
                'form_key' => $this->formKey->getFormKey(),
                'product' => $productId, //product Id
                'qty'   =>1, //quantity of product
                'customer_id'   =>$id
                               
            );
   }          
    //Load the product based on productID  
    $_product = $this->ProductRepository->getById($productId);
   
    $_product->addCustomOption('additional_options', $this->serializer->serialize($additionalOptions));
    $this->cart->addProduct($_product, $params);
    $this->cart->save();
    //return $page;
    $message = "Product have been successfully added to your Shopping Cart.";
    $this->messageManager->addSuccess($message);
    $accUrl = $this->_url->getUrl('checkout/cart/');
    $this->_responseFactory->create()->setRedirect($accUrl)->sendResponse();
    $this->setRefererUrl($accUrl);
  }
}

Now run commands : 

php bin/magento setup:upgrade
php bin/magento setup:di:compile
php bin/magento setup:static-content:deploy -f
php bin/magento c:f


now hit url like this:
yourwebsite.com/add

It will display result like this:-