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.


No comments:

Post a Comment