How to add custom data in the output of GET API to get children of configurable product in Magento 2.3?
-
22-02-2021 - |
質問
To get children of Configurable Product, I'm using following API
/V1/configurable-products/{{SKU}}/children
I'm getting following output:
[
{
"id": 3234,
"sku": "ABC1006",
"name": "ABC Config Product",
"attribute_set_id": 4,
"price": 2400,
"status": 1,
"type_id": "simple",
"created_at": "2018-12-17 13:27:58",
"updated_at": "2018-12-18 11:06:28",
"weight": 1,
"product_links": [],
"tier_prices": [],
"custom_attributes": [
{
"attribute_code": "tax_class_id",
"value": "2"
},
{
"attribute_code": "required_options",
"value": "0"
},
{
"attribute_code": "category_ids",
"value": [
"173"
]
},
{
"attribute_code": "has_options",
"value": "0"
},
{
"attribute_code": "brand",
"value": "399"
},
{
"attribute_code": "short_description",
"value": "<ul></ul>"
},
{
"attribute_code": "image",
"value": "/h/a/hamster-ball-32cm_7.png"
},
{
"attribute_code": "small_image",
"value": "/h/a/hamster-ball-32cm_7.png"
},
{
"attribute_code": "thumbnail",
"value": "/h/a/hamster-ball-32cm_7.png"
},
{
"attribute_code": "swatch_image",
"value": "/h/a/hamster-ball-32cm_7.png"
},
{
"attribute_code": "url_key",
"value": "savic-hamster-ball-extra-large"
},
{
"attribute_code": "msrp_display_actual_price_type",
"value": "0"
},
{
"attribute_code": "size_swatch",
"value": "213"
}
]
}
]
I want to add one more key pair (type=string) in the above json output. Where should I make changes to get the results.
解決
You may add an attribute with its value using extension attribute model as follows.
Add attribute code to extension attribute set by creating following file
Vendor\YourModule\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\Catalog\Api\Data\ProductInterface">
<attribute code="custom_attr_code" type="string" />
</extension_attributes>
</config>
Now set your custom value by overriding
Magento\ConfigurableProduct\Model\LinkManagement
using dependency injection
Vendor\YourModule\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">
<preference for="Magento\ConfigurableProduct\Model\LinkManagement" type="Vendor\YourModule\Model\LinkManagement" />
</config>
Rewriting GetChildren method with your custom value
Vendor\YourModule\Model\LinkManagement.php
public function getChildren($sku)
{
/** @var \Magento\Catalog\Model\Product $product */
$product = $this->productRepository->get($sku);
if ($product->getTypeId() != \Magento\ConfigurableProduct\Model\Product\Type\Configurable::TYPE_CODE) {
return [];
}
/** @var \Magento\ConfigurableProduct\Model\Product\Type\Configurable $productTypeInstance */
$productTypeInstance = $product->getTypeInstance();
$productTypeInstance->setStoreFilter($product->getStoreId(), $product);
$childrenList = [];
/** @var \Magento\Catalog\Model\Product $child */
foreach ($productTypeInstance->getUsedProducts($product) as $child) {
$attributes = [];
foreach ($child->getAttributes() as $attribute) {
$attrCode = $attribute->getAttributeCode();
$value = $child->getDataUsingMethod($attrCode) ?: $child->getData($attrCode);
if (null !== $value) {
$attributes[$attrCode] = $value;
}
}
$attributes['store_id'] = $child->getStoreId();
/** @var \Magento\Catalog\Api\Data\ProductInterface $productDataObject */
$productDataObject = $this->productFactory->create();
$this->dataObjectHelper->populateWithArray(
$productDataObject,
$attributes,
\Magento\Catalog\Api\Data\ProductInterface::class
);
//Start of custom code
$extensionAttributes = $productDataObject->getExtensionAttributes();
$extensionAttributes->setCustomAttrCode('customValue');
$productDataObject->setExtensionAttributes($extensionAttributes);
//End of custom code
$childrenList[] = $productDataObject;
}
return $childrenList;
}
所属していません magento.stackexchange