Hello i have to add extension attributes to
Magento\Catalog\Api\Data\ProductInterface
So i added this one to extension_attrributes.xml:
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Api/etc/extension_attributes.xsd">
<extension_attributes for="Magento\Catalog\Api\Data\ProductInterface">
<attribute code="custom_attribute" type="int"/>
</extension_attributes>
</config>
And to di.xml added:
<type name="Magento\Framework\EntityManager\Operation\ExtensionPool">
<arguments>
<argument name="extensionActions" xsi:type="array">
<item name="Magento\Catalog\Api\Data\ProductInterface" xsi:type="array">
<item name="read" xsi:type="array">
<item name="customAttributeReader" xsi:type="string">Vendor\Custom\Model\Product\CustomAttribute\ReadHandler</item>
</item>
<item name="create" xsi:type="array">
<item name="customAttributeCreator" xsi:type="string">Vendor\Custom\Model\Product\CustomAttribute\SaveHandler</item>
</item>
<item name="update" xsi:type="array">
<item name="customAttributeSaver" xsi:type="string">Vendor\Custom\Model\Product\CustomAttribute\SaveHandler</item>
</item>
</item>
</argument>
</arguments>
</type>
So it`s work fine. When i get product entity using ProductRepository or load() function in Product model, all my extension attributes loads successful. But i have some issue when i work with Collection:
When i do something like:
$productCollection->addFieldToFilter('custom_attribute', 2);My code don't wok and it's expected because my model not contains this attribute.
So i have a question. How i can filter by my extension attribute using collection ?
Also if i do:
$productCollection->getFirstItem()->getExtensionAttributes()
I get empty array.
So i need your help. I'll be very grateful!!!
I am not sure this is fit for your requirement. but i think you have to go through this.
The system uses a join directive to add external attributes to a collection and to make the collection filterable. The join element in the extension_attributes.xml file defines which object fields and the database table/column to use as the source of a search.
In the following example, an attribute named stock_item of type Magento\CatalogInventory\Api\Data\StockItemInterface is being added to the Magento\Catalog\Api\Data\ProductInterface.
<extension_attributes for="Magento\Catalog\Api\Data\ProductInterface">
<attribute code="stock_item" type="Magento\CatalogInventory\Api\Data\StockItemInterface">
<join reference_table="cataloginventory_stock_item" reference_field="product_id" join_on_field="entity_id">
<field>qty</field>
</join>
</attribute>
</extension_attributes>When getList() is called, it returns a list of ProductInterfaces. When it does this, the code populates the stock_item with a joined operation in which the StockItemInterface’s qty property comes from the cataloginventory_stock_item table where the Product’s entity_Id is joined with the cataloginventory_stock_item.product_id column.
I hope it helps!
@Patel_Chirag Thank for your answer.
Using getList() of repository is well and work pretty nice. But i have to get list of ProductInterfaces via Magento\Catalog\Model\ResourceModel\Product\Collection.
So when i do:
$productCollection->getItems();
I get products items but my extension attributes are empty.
So how i can populate them when i work with collection?
Did you get a solution for above problem? I also want to know if magento is providing anything to achieve this otherwise I think we need to use plugin for that.