Hi everyone,
I wrote a plugin followed with the "magento2 sample/sample-external-link" to add a "custom_test_attribute" on the product , here is "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_test_attribute" type="string" /> </extension_attributes> </config>
di.xml and plugin code:
<?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\Catalog\Api\ProductRepositoryInterface">
<plugin name="ProductExtensionAttributeOperations" type="zasi\ExtensionRest\plugin\AddReviewAttributes" disabled="false"/>
</type>
</config><?php
namespace zasi\ExtensionRest\plugin;
use Magento\Catalog\Api\Data\ProductExtensionInterface;
use Magento\Catalog\Api\Data\ProductInterface;
use Magento\Catalog\Api\Data\ProductExtensionFactory;
class AddReviewAttributes
{
private $extensionFactory;
public function __construct(ProductExtensionFactory $extensionFactory)
{
$this->extensionFactory = $extensionFactory;
}
public function afterGetList
(
\Magento\Catalog\Api\ProductRepositoryInterface $subject,
\Magento\Framework\Api\SearchResults $searchResult
) {
/** @var \Magento\Catalog\Api\Data\ProductInterface $product */
foreach ($searchResult->getItems() as $product) {
$this->addExternalLinksToProduct($product);
}
return $searchResult;
}
public function afterGet
(
\Magento\Catalog\Api\ProductRepositoryInterface $subject,
\Magento\Catalog\Api\Data\ProductInterface $product
) {
$this->addExternalLinksToProduct($product);
return $product;
}
private function addExternalLinksToProduct(\Magento\Catalog\Api\Data\ProductInterface $product)
{
$extensionAttributes = $product->getExtensionAttributes();
if (empty($extensionAttributes)) {
$extensionAttributes = $this->productExtensionFactory->create();
}
$extensionAttributes->setCustomTestAttribute('test');
$product->setExtensionAttributes($extensionAttributes);
return $this;
}
}When I use postman to get the response via "rest/V1/products" router, I got an error , it said :
Fatal Error: 'Uncaught TypeError: Argument 1 passed to Magento\\Catalog\\Api\\Data\\ProductExtension::setCustomTestAttribute() must be an instance of number, string given,
I found the methods genrated by magento incorrectly:
ProductExtensionInterface.php:
<?php
namespace Magento\Catalog\Api\Data;
/**
* ExtensionInterface class for @see \Magento\Catalog\Api\Data\ProductInterface
*/
interface ProductExtensionInterface extends \Magento\Framework\Api\ExtensionAttributesInterface
{
........
/**
* @return number|null
*/
public function getCustomTestAttribute();
/**
* @param number $customTestAttribute
* @return $this
*/
public function setCustomTestAttribute(\number $customTestAttribute);
}the setCustomTestAttribute paramters is "\number $customTestAttribute" , I have to correct it manually.
This problem stuck me a whole day , can you guys help me to fix it? what's wrong with my codes?
(magento CE 2.3.3 , Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips PHP/7.3.12)
Thanks you verrrrrry much!!
Solved! Go to Solution.
update my problem:
I add a new extension attribute in the xml file , but the it does not appear in generate code.
I remembered that at first I set the 'custom_test_attribute' type is 'number' , so I guest is that the code generator use some cache template
I disable all caches and upgrade again . it works ![]()
update my problem:
I add a new extension attribute in the xml file , but the it does not appear in generate code.
I remembered that at first I set the 'custom_test_attribute' type is 'number' , so I guest is that the code generator use some cache template
I disable all caches and upgrade again . it works ![]()