I am trying to override core interface of Customer Group.
I add my custom get and set methods to core Api interface
Vendor\magento\customer-module\Api\Data\GroupInterface.php
Where its working fine.
But when i am trying to override it its doesn't seems to be work.
Here i am sharing my module code.
ZeroCool\AdvacedReviews\Api\Data\GroupInterface.php
<?php namespace ZeroCool\AdvancedReviews\Api\Data\GroupInterface; interface GroupInterface extends ExtensibleDataInterface { const SHIPPING_METHOD = 'shipping_method'; /** * Get shipping method * * @return string */ public function getShippingMethod(); /** * Set shipping method * * @param int $shippingMethod * @return $this */ public function setShippingMethod($shippingMethod); }
ZeroCool\AdvancedReviews\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\Customer\Block\Adminhtml\Group\Edit\Form"> <plugin name="add_form_field" type="ZeroCool\AdvancedReviews\Model\Plugin\Form" sortOrder="1"/> </type> <type name="Magento\Customer\Controller\Adminhtml\Group\Save"> <plugin name="save_field" type="ZeroCool\AdvancedReviews\Model\Plugin\Form" sortOrder="1"/> </type> <preference for="Magento\Customer\Model\Data\Group" type="ZeroCool\AdvancedReviews\Model\Data\Group" /> <preference for="Magento\Customer\Api\Data\GroupInterface" type="ZeroCool\AdvancedReviews\Api\Data\GroupInterface" /> <!-- <preference for="Magento\Customer\Model\Group\Edit" type="ZeroCool\AdvancedReviews\Block\Adminhtml\Group\Edit" /> --> </config>
There's also one question available but it doesn't have any answers till now.
Thanks in advance.
I see that in your code this line is missing
use Magento\Framework\Api\ExtensibleDataInterface;
Please try below code.
<?php namespace ZeroCool\AdvancedReviews\Api\Data\GroupInterface; use Magento\Framework\Api\ExtensibleDataInterface; interface GroupInterface extends ExtensibleDataInterface { const SHIPPING_METHOD = 'shipping_method'; /** * Get shipping method * * @return string */ public function getShippingMethod(); /** * Set shipping method * * @param int $shippingMethod * @return $this */ public function setShippingMethod($shippingMethod); }
Please give Kudos if it helps and Accept it as a solution
You can use extension attributes to add your custom additional attribute in the interface.
Create extension_attributes.xml at following location
app/code/Vendor/Module/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\Customer\Api\Data\GroupInterface"> <attribute code="custom_shipping_method" type="string"/> </extension_attributes> </config>
Now you can get and set your custom shipping method using following code.
$objectManager = \Magento\Framework\App\ObjectManager::getInstance(); $groupInterface = $objectManager->create('Magento\Customer\Api\Data\GroupInterface'); $extAttributes = $groupInterface->getExtensionAttributes(); $selectedShipping = $extAttributes->getCustomShippingMethod(); //get custom_shipping_method data.
You can use extension attributes to add the custom attribute in the interface.
Create extension_attributes.xml at following location
app/code/Vendor/Module/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\Customer\Api\Data\GroupInterface"> <attribute code="custom_shipping_method" type="string"/> </extension_attributes> </config>
Now you can get and set your extension attributes using following code.
$objectManager = \Magento\Framework\App\ObjectManager::getInstance(); $groupInterface = $objectManager->create('Magento\Customer\Api\Data\GroupInterface'); $extAttributes = $groupInterface->getExtensionAttributes(); $customShippingMethod = $extAttributes->getCustomShippingMethod(); //get custom_shipping_method data.
Please find below answer which I'm using Magento\Quote\Api\Data\ShippingMethodInterface and in this interface I need to add custom description as an extension attribute.
/etc/extension_attributes.xml should be like this:
<?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\Quote\Api\Data\ShippingMethodInterface"> <attribute code="method_description" type="string" /> </extension_attributes> </config>
In the etc/di.xml file add a plugin for overriding modelToDataObject() in Magento\Quote\Model\Cart\ShippingMethodConverter as below:
<?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\Quote\Model\Cart\ShippingMethodConverter"> <plugin name="add_description_to_carrier" type="<Vendor>\<module>\Plugin\Carrier\Description" disabled="false" sortOrder="30"/> </type> </config>
The plugin file Vendor\module\Plugin\Carrier\Description.php should be like this:
<?php namespace Vendor\module\Plugin\Carrier; use Magento\Quote\Api\Data\ShippingMethodExtensionFactory; /** * Class Description * */ class Description { /** * @var ShippingMethodExtensionFactory */ protected $extensionFactory; /** * Description constructor. * @param ShippingMethodExtensionFactory $extensionFactory */ public function __construct( ShippingMethodExtensionFactory $extensionFactory ) { $this->extensionFactory = $extensionFactory; } /** * @param $subject * @param $result * @param $rateModel * @return mixed */ public function afterModelToDataObject($subject, $result, $rateModel) { $extensionAttribute = $result->getExtensionAttributes() ? $result->getExtensionAttributes() : $this->extensionFactory->create() ; $extensionAttribute->setMethodDescription($rateModel->getMethodDescription()); $result->setExtensionAttributes($extensionAttribute); return $result; } }
After all this you will get that description on fronend as below:
<div data-bind="text: method.extension_attributes.method_description"></div>
<b>Fatal error</b>: Uncaught Error: Call to undefined method Magento\Quote\Api\Data\ShippingMethodExtension::setMethodDescription() in ...
Everything is done as shown by you. Why this method is "undefined"?