I am trying to use extension_attributes in order to add a field in the orders. The thing is, I want that field to appear when we get the orders with API calls (http://monsite.fr/soap/default?services=salesOrderRepositoryV1
) and I can't get this to work.
For now I altered the tables sales_order
and sales_order_grid
with the Setup of my module (InstallSchema) to add a field "file_name" and declared extension_attributes.xml
in 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\OrderInterface">
<attribute code="file_name" type="string"/>
</extension_attributes>
</config>
I've got the generated class in vendor with the methods getFileName and setFileName, but that's it, when I try the url
http://monsite.fr/soap/default?services=salesOrderRepositoryV1
I still have the ordinary attributes (entityId, createdAt, incrementId, etc.), there is not a fileName attribute (not even in extension_attributes node, of course).
Is there someone who knows how to get an extension attribute to appear with API ?
EDIT
Okay, now I get the field "fileName" in the <extensionAttributes>
of the SOAP response, but it doesn't retrieve the values in database...
I added a plugin in di.xml :
<type name="Magento\Sales\Api\OrderRepositoryInterface">
<plugin name="get_file_name" type="Company\Module\Model\Plugin\FileGet"/>
and I implemented a function afterGet()
where I have access to the extension attributes ($orderInterface->getExtensionAttributes()
) and call the generated methods getFileName()
and setFileName()
, but getFileName() return null...
One more thing, I also tried with an Observer on the event <event name="sales_order_load_after">
, and here I can call getData('file_name') to have database values, but it is done without passing by extension attributes, I'm a little bit confuse, here.
To summ it up :
-with the plugin on OrderRepositoryInterface
and the function afterGet()
, I have acces to the extension_attributes
of my order, and can call getFileName()
and setFileName()
methods (generated in OrderExtensionInterface
), but doing so doesn't seem to affect the database;
-with the Observer
: on the event sales_order_load_after
, I can use getdata('file_name')
as if file_name were a basic attribute and not an extension_atributes, and it does retrieve the value in database, but then it is not present in the SOAP response.
I don't know if I am clear enough, feel free to ask more questions, or sample code if needed.
EDIT
It appears that even if we don't have auto-implementation for it, it is possible to call getData('file_name')
through the $resultOrder
(class OrderInterface
) of the afterGet
method of the plugin. Now I have to do a similar work in order to set the value with a SOAP request.
I hope that this monologue of mine can help someone^^". feel free to post a question if you also have some trouble with extension_attributes, I'll help if I can.