I have problem with save value of order custom attribute via Rest API in Magento 2.3.3. I get only "Internal Error", with log:
Property "GremiOrderId" does not have accessor method "getGremiOrderId" in class "Magento\Sales\Api\Data\OrderInterface"
Below you can see our code from custom module:
Gremi/OrderAttributes/etc/di.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<type name="Magento\Sales\Api\OrderRepositoryInterface">
<plugin name="gremi_orderattributes_add_order_extension_attribute"
type="Gremi\OrderAttributes\Plugin\OrderRepositoryPlugin" />
</type>
</config>
Gremi/OrderAttributes/etc/extension_attributes.xml
<?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\OrderInterface">
<attribute code="gremi_order_id" type="Gremi\OrderAttributes\Api\Data\GremiOrderIdInterface" />
</extension_attributes>
</config>
Gremi/OrderAttributes/Api/Data/GremiOrderIdInterface.php:
<?php
namespace Gremi\OrderAttributes\Api\Data;
/**
* Gremi OrderAttributes block interface.
* @api
* @since 100.0.2
*/
interface GremiOrderIdInterface extends \Magento\Sales\Api\Data\OrderInterface
{
/**#@+
* Constants for keys of data array. Identical to the name of the getter in snake case
*/
const GREMI_ORDER_ID = 'gremi_order_id';
/**
* Get GREMI_ORDER_ID
*
* @return string|null
*/
public function getGremiOrderId();
/**
* Set GREMI_ORDER_ID
*
* @param string $gremiOrderId
* @return $this
*/
public function setGremiOrderId($gremiOrderId);
}
Gremi/OrderAttributes/Plugin/OrderRepositoryPlugin.php:
<?php
namespace Gremi\OrderAttributes\Plugin;
use Magento\Sales\Api\Data\OrderExtensionFactory;
use Magento\Sales\Api\Data\OrderExtensionInterface;
use Magento\Sales\Api\Data\OrderInterface;
use Magento\Sales\Api\Data\OrderSearchResultInterface;
use Magento\Sales\Api\OrderRepositoryInterface;
use Magento\Framework\Exception\CouldNotSaveException;
/**
* Class OrderRepository
*/
class OrderRepositoryPlugin
{
const FIELD_GREMI_ORDER_ID = 'gremi_order_id';
/**
* Order Extension Attributes Factory
*
* @var OrderExtensionFactory
*/
protected $extensionFactory;
/**
* OrderRepositoryPlugin constructor
*
* @param OrderExtensionFactory $extensionFactory
*/
public function __construct(OrderExtensionFactory $extensionFactory)
{
$this->extensionFactory = $extensionFactory;
}
/**
* Add "gremi_order_id" extension attribute to order data object to make it accessible in API data
*
* @param OrderRepositoryInterface $subject
* @param OrderInterface $order
*
* @return OrderInterface
*/
public function afterGet(OrderRepositoryInterface $subject, OrderInterface $order)
{
$gremiOrderId = $order->getData(self::FIELD_GREMI_ORDER_ID);
$extensionAttributes = $order->getExtensionAttributes();
$extensionAttributes = $extensionAttributes ? $extensionAttributes : $this->extensionFactory->create();
$extensionAttributes->setGremiOrderId($gremiOrderId);
$order->setExtensionAttributes($extensionAttributes);
return $order;
}
/**
* Add "gremi_order_id" extension attribute to order data object to make it accessible in API data
*
* @param OrderRepositoryInterface $subject
* @param OrderSearchResultInterface $searchResult
*
* @return OrderSearchResultInterface
*/
public function afterGetList(OrderRepositoryInterface $subject, OrderSearchResultInterface $searchResult)
{
$orders = $searchResult->getItems();
foreach ($orders as &$order) {
$gremiOrderId = $order->getData(self::FIELD_GREMI_ORDER_ID);
$extensionAttributes = $order->getExtensionAttributes();
$extensionAttributes = $extensionAttributes ? $extensionAttributes : $this->extensionFactory->create();
$extensionAttributes->setGremiOrderId($gremiOrderId);
$order->setExtensionAttributes($extensionAttributes);
}
return $searchResult;
}
public function beforeSave(OrderRepositoryInterface $subject, OrderInterface $resultOrder)
{
foreach (['gremi_order_id'] as $field) {
$value = $resultOrder->getData($field);
$resultOrder->setData($field, $value);
}
}
}What I should do it, to works correctly?
hi @x_xx
could you please try first using type="string" in extension attribute type instead of a class.
This may help you.
Thanks!
Thank you for reply, but still not working. The same error in log.
Can you try moving your di file in app/code/<namespeace>/<module>/etc/webapi_rest folder. In my case, i have added di file in above folder.
Tr to flush cache and run di:compile after that.
Yes, it done. Still the same error.
Hi,
yes. Here you can find my complete module:
Hi,
did you see the code? Do you have any ideas to solve my problem?
Hi @x_xx ,
Yes, i checked the code and found that observer file is missing. Is it in the code which you shared with me or in the module itself. Could you please check once.
I have done the below changes in the webapi_rest/di.xml and found that our custom attribute is occurring in api call. Could you please try with this.
Are you able to solve this i am also getting this same issue