Skip to main content
added 1297 characters in body
Source Link
Amit Bera
  • 77.8k
  • 21
  • 127
  • 240
  • Create plugin on Magento\Sales\Api\OrderRepositoryInterface on get() an d save () for expose that custom field to order ip.

Update,

AndAs you want to expose that rest/V1/orders/items Api point then you have to create a good example isplugin on Magento_GiftMessageMagento\Sales\Model\Order\ProductOption::add()

Here the plugin Class:

<?php declare(strict_types=1); namespace {VendrNameVendorName}\{ModuleName}\Plugin\Magento\Sales\Api; class OrderRepositoryInterface {\Plungin;  privateuse $orderExtensionFactory;Magento\Sales\Api\Data\OrderItemInterface;  public function __construct(  \Magento\Sales\Api\Data\OrderExtensionFactoryclass $orderExtensionFactory,ProductOption  ) { $this->orderExtensionFactory = $orderExtensionFactory;  } /** * Get gift message * * @param \Magento\Sales\Api\OrderRepositoryInterface $subject * @param \Magento\Sales\Api\Data\OrderInterface@var $resultOrder\Magento\Sales\Api\Data\OrderItemExtensionFactory * @return \Magento\Sales\Api\Data\OrderInterface/   *private @SuppressWarnings(PHPMD.UnusedFormalParameter)$orderItemExtensionFactory;  */ public function afterGet__construct(   \Magento\Sales\Api\OrderRepositoryInterface $subject,  \Magento\Sales\Api\Data\OrderInterface\Magento\Sales\Api\Data\OrderItemExtensionFactory $resultOrder$orderItemExtensionFactory ) {     $resultOrder = $this->getOrderItemActivationCodes($resultOrder); >orderItemExtensionFactory return= $resultOrder;$orderItemExtensionFactory; }     privatepublic function getOrderItemActivationCodes(\Magento\Sales\Api\Data\OrderInterface $order) {  $orderItems = $order->getItemsbeforeAdd();     if (null !== $orderItems) { \Magento\Sales\Model\Order\ProductOption $subject,   /** @var \Magento\Sales\Api\Data\OrderItemInterfaceOrderItemInterface $orderItem */   foreach ($orderItems as $orderItem) {   $extensionAttributes = $orderItem->getExtensionAttributes();   if ($extensionAttributes &&null=== $extensionAttributes->getCustomField()) { continue; }    /** @var \Magento\Sales\Api\Data\OrderItemExtension $orderItemExtension */ $orderItemExtension = $extensionAttributes ? $extensionAttributes :$extensionAttributes= $this->orderItemExtensionFactory->create();   }  $orderItemExtension$extensionAttributes->setCustomField($order->getCustomField());   $orderItem->setExtensionAttributes($orderItemExtension$extensionAttributes); }   } return $order; }  } 
  • Create plugin on Magento\Sales\Api\OrderRepositoryInterface on get() an d save () for expose that custom field to order ip.

And a good example is Magento_GiftMessage

<?php declare(strict_types=1); namespace {VendrName}\{ModuleName}\Plugin\Magento\Sales\Api; class OrderRepositoryInterface {  private $orderExtensionFactory;  public function __construct(  \Magento\Sales\Api\Data\OrderExtensionFactory $orderExtensionFactory,  ) { $this->orderExtensionFactory = $orderExtensionFactory;  } /** * Get gift message * * @param \Magento\Sales\Api\OrderRepositoryInterface $subject * @param \Magento\Sales\Api\Data\OrderInterface $resultOrder * @return \Magento\Sales\Api\Data\OrderInterface   * @SuppressWarnings(PHPMD.UnusedFormalParameter)  */ public function afterGet(   \Magento\Sales\Api\OrderRepositoryInterface $subject,  \Magento\Sales\Api\Data\OrderInterface $resultOrder ) {   $resultOrder = $this->getOrderItemActivationCodes($resultOrder);  return $resultOrder; }     private function getOrderItemActivationCodes(\Magento\Sales\Api\Data\OrderInterface $order) {  $orderItems = $order->getItems();     if (null !== $orderItems) {    /** @var \Magento\Sales\Api\Data\OrderItemInterface $orderItem */   foreach ($orderItems as $orderItem) {   $extensionAttributes = $orderItem->getExtensionAttributes();   if ($extensionAttributes && $extensionAttributes->getCustomField()) { continue; }    /** @var \Magento\Sales\Api\Data\OrderItemExtension $orderItemExtension */ $orderItemExtension = $extensionAttributes ? $extensionAttributes : $this->orderItemExtensionFactory->create(); $orderItemExtension->setCustomField($order->getCustomField());   $orderItem->setExtensionAttributes($orderItemExtension); }   } return $order; }  } 

Update,

As you want to expose that rest/V1/orders/items Api point then you have to create a plugin on Magento\Sales\Model\Order\ProductOption::add()

Here the plugin Class:

<?php namespace {VendorName}\{ModuleName}\Plungin; use Magento\Sales\Api\Data\OrderItemInterface; class ProductOption { /** * @var \Magento\Sales\Api\Data\OrderItemExtensionFactory */ private $orderItemExtensionFactory; public function __construct( \Magento\Sales\Api\Data\OrderItemExtensionFactory $orderItemExtensionFactory ) {    $this->orderItemExtensionFactory = $orderItemExtensionFactory; } public function beforeAdd( \Magento\Sales\Model\Order\ProductOption $subject, OrderItemInterface $orderItem ) { $extensionAttributes = $orderItem->getExtensionAttributes(); if(null=== $extensionAttributes){ $extensionAttributes= $this->orderItemExtensionFactory->create();   }  $extensionAttributes->setCustomField($order->getCustomField()); $orderItem->setExtensionAttributes($extensionAttributes); } } 
added 2464 characters in body
Source Link
Amit Bera
  • 77.8k
  • 21
  • 127
  • 240
  • Create plugin on Magento\Sales\Api\OrderRepositoryInterface on get() an d save () for expose that custom field to order ip.

And a good example is Magento_GiftMessage

<?php declare(strict_types=1); namespace {VendrName}\{ModuleName}\Plugin\Magento\Sales\Api; class OrderRepositoryInterface { private $orderExtensionFactory; public function __construct( \Magento\Sales\Api\Data\OrderExtensionFactory $orderExtensionFactory, ) { $this->orderExtensionFactory = $orderExtensionFactory; } /** * Get gift message * * @param \Magento\Sales\Api\OrderRepositoryInterface $subject * @param \Magento\Sales\Api\Data\OrderInterface $resultOrder * @return \Magento\Sales\Api\Data\OrderInterface * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ public function afterGet( \Magento\Sales\Api\OrderRepositoryInterface $subject, \Magento\Sales\Api\Data\OrderInterface $resultOrder ) { $resultOrder = $this->getOrderItemActivationCodes($resultOrder); return $resultOrder; } private function getOrderItemActivationCodes(\Magento\Sales\Api\Data\OrderInterface $order) { $orderItems = $order->getItems(); if (null !== $orderItems) { /** @var \Magento\Sales\Api\Data\OrderItemInterface $orderItem */ foreach ($orderItems as $orderItem) { $extensionAttributes = $orderItem->getExtensionAttributes(); if ($extensionAttributes && $extensionAttributes->getCustomField()) { continue; } /** @var \Magento\Sales\Api\Data\OrderItemExtension $orderItemExtension */ $orderItemExtension = $extensionAttributes ? $extensionAttributes : $this->orderItemExtensionFactory->create(); $orderItemExtension->setCustomField($order->getCustomField()); $orderItem->setExtensionAttributes($orderItemExtension); } } return $order; } } 
  • Create plugin on Magento\Sales\Api\OrderRepositoryInterface on get() an d save () for expose that custom field to order ip.

And a good example is Magento_GiftMessage

<?php declare(strict_types=1); namespace {VendrName}\{ModuleName}\Plugin\Magento\Sales\Api; class OrderRepositoryInterface { private $orderExtensionFactory; public function __construct( \Magento\Sales\Api\Data\OrderExtensionFactory $orderExtensionFactory, ) { $this->orderExtensionFactory = $orderExtensionFactory; } /** * Get gift message * * @param \Magento\Sales\Api\OrderRepositoryInterface $subject * @param \Magento\Sales\Api\Data\OrderInterface $resultOrder * @return \Magento\Sales\Api\Data\OrderInterface * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ public function afterGet( \Magento\Sales\Api\OrderRepositoryInterface $subject, \Magento\Sales\Api\Data\OrderInterface $resultOrder ) { $resultOrder = $this->getOrderItemActivationCodes($resultOrder); return $resultOrder; } private function getOrderItemActivationCodes(\Magento\Sales\Api\Data\OrderInterface $order) { $orderItems = $order->getItems(); if (null !== $orderItems) { /** @var \Magento\Sales\Api\Data\OrderItemInterface $orderItem */ foreach ($orderItems as $orderItem) { $extensionAttributes = $orderItem->getExtensionAttributes(); if ($extensionAttributes && $extensionAttributes->getCustomField()) { continue; } /** @var \Magento\Sales\Api\Data\OrderItemExtension $orderItemExtension */ $orderItemExtension = $extensionAttributes ? $extensionAttributes : $this->orderItemExtensionFactory->create(); $orderItemExtension->setCustomField($order->getCustomField()); $orderItem->setExtensionAttributes($orderItemExtension); } } return $order; } } 
Source Link
Amit Bera
  • 77.8k
  • 21
  • 127
  • 240

You have to make your Custom Attribute attribute as extension attribute for Magento\Sales\Api\Data\OrderItemInterface

create extension_attributes.xml at your modules app/code/{Vendorname}/{ModuleName}/etc.

<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Api/etc/extension_attributes.xsd"> <extension_attributes for="Magento\Sales\Api\Data\OrderItemInterface"> <attribute code="{Your_Custom_Field}" type="string" /> </extension_attributes> </config> 

I assume that your field as varchar that why I have add type as string type variable (type="string").