如何在 magento2 中将自定义属性添加到运输方式
How to add custom attribute to shipping method in magento2
我正在尝试在 magento2 中创建一个模块,该模块允许向运营商或特定方法添加自定义消息。我成功地创建了带有网格和表单的管理部分。现在我正在努力在前端显示它。我已经创建了 js 和模板文件,如果数据在 estimate-shipping-methods 结果中,它们可以很好地工作。我认为最简单的方法是将此消息添加到评分模型。我创建了一个插件
<type name="Magento\Quote\Model\ShippingMethodManagement">
<plugin name="hatimeria_shippingrateinfo_add_message_to_rates"
type="Hatimeria\ShippingRateInfo\Plugin\ShippingMethodManagement"
sortOrder="10"
disabled="false"/>
</type>
它获取当前费率的消息并将它们添加到模型中。一切正常,但此数据不会输出到 json 结果。正如我发现的那样,magento 并不简单地输出模型中的所有数据,而是 returns 仅输出由 ShippingMethodInterface
定义的数据。
然后我注意到有一个叫做 extension_attributes 的东西,根据文档,这应该允许我将我的消息添加到结果中。因此,查看 docs 和 Magento_ProductVideo 模块,我完成了以下操作:
在etc/extension_attributes.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\Quote\Api\Data\ShippingMethodInterface">
<attribute code="rate_info" type="Hatimeria\ShippingRateInfo\Api\Quote\Data\ShippingMethodInterface" />
</extension_attributes>
在 etc/di.xml
我为我的界面添加了首选项
<preference for="Hatimeria\ShippingRateInfo\Api\Quote\Data\ShippingMethodInterface" type="Hatimeria\ShippingRateInfo\Model\Rate\RateInfo" />
现在classess,第一个界面在Hatimeria\ShippingRateInfo\Api\Quote\Data\ShippingMethodIntarface.php
namespace Hatimeria\ShippingRateInfo\Api\Quote\Data;
use Magento\Framework\Api\ExtensibleDataInterface;
/**
* Shipping Rate Info data interface
*
* @api
*/
interface ShippingMethodInterface extends ExtensibleDataInterface
{
const RATEINFO = 'rate_info';
/**
* Retrieve rate info message
*
* @return string
*/
public function getRateInfo();
/**
* Set rate info message
*
* @param string $rateInfo
* @return $this
*/
public function setRateInfo($rateInfo);
}
和 class 在 Hatimeria\ShippingRateInfo\Model\Rate\RateInfo.php
中实际实现了这一点
namespace Hatimeria\ShippingRateInfo\Model\Rate;
use Hatimeria\ShippingRateInfo\Api\Quote\Data\ShippingMethodInterface;
use Magento\Framework\Model\AbstractExtensibleModel;
class RateInfo extends AbstractExtensibleModel implements ShippingMethodInterface
{
/**
* Retrieve rate info message
*
* @return string
*/
public function getRateInfo()
{
return $this->getData(self::RATEINFO);
}
/**
* Set rate info message
*
* @param string $rateInfo
* @return $this
*/
public function setRateInfo($rateInfo)
{
return $this->setData(self::RATEINFO, $rateInfo);
}
}
这是行不通的。生成费率时,费率模型不会返回额外的扩展。任何帮助将不胜感激。
尝试以下步骤:
- 运行
bin/magento setup:di:compile
生成 ShippingMethodExtensionInterface
和一个 class 来实现这个(即使禁用缓存也不会在每个请求上完成)
- 在您的插件中实例化
Magento\Quote\Api\Data\ShippingMethodExtension
并将数据添加到该对象,然后将整个对象添加到具有 $entity->setExtensionAttributes($extensionModel)
的实体
我正在尝试在 magento2 中创建一个模块,该模块允许向运营商或特定方法添加自定义消息。我成功地创建了带有网格和表单的管理部分。现在我正在努力在前端显示它。我已经创建了 js 和模板文件,如果数据在 estimate-shipping-methods 结果中,它们可以很好地工作。我认为最简单的方法是将此消息添加到评分模型。我创建了一个插件
<type name="Magento\Quote\Model\ShippingMethodManagement">
<plugin name="hatimeria_shippingrateinfo_add_message_to_rates"
type="Hatimeria\ShippingRateInfo\Plugin\ShippingMethodManagement"
sortOrder="10"
disabled="false"/>
</type>
它获取当前费率的消息并将它们添加到模型中。一切正常,但此数据不会输出到 json 结果。正如我发现的那样,magento 并不简单地输出模型中的所有数据,而是 returns 仅输出由 ShippingMethodInterface
定义的数据。
然后我注意到有一个叫做 extension_attributes 的东西,根据文档,这应该允许我将我的消息添加到结果中。因此,查看 docs 和 Magento_ProductVideo 模块,我完成了以下操作:
在etc/extension_attributes.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\Quote\Api\Data\ShippingMethodInterface">
<attribute code="rate_info" type="Hatimeria\ShippingRateInfo\Api\Quote\Data\ShippingMethodInterface" />
</extension_attributes>
在 etc/di.xml
我为我的界面添加了首选项
<preference for="Hatimeria\ShippingRateInfo\Api\Quote\Data\ShippingMethodInterface" type="Hatimeria\ShippingRateInfo\Model\Rate\RateInfo" />
现在classess,第一个界面在Hatimeria\ShippingRateInfo\Api\Quote\Data\ShippingMethodIntarface.php
namespace Hatimeria\ShippingRateInfo\Api\Quote\Data;
use Magento\Framework\Api\ExtensibleDataInterface;
/**
* Shipping Rate Info data interface
*
* @api
*/
interface ShippingMethodInterface extends ExtensibleDataInterface
{
const RATEINFO = 'rate_info';
/**
* Retrieve rate info message
*
* @return string
*/
public function getRateInfo();
/**
* Set rate info message
*
* @param string $rateInfo
* @return $this
*/
public function setRateInfo($rateInfo);
}
和 class 在 Hatimeria\ShippingRateInfo\Model\Rate\RateInfo.php
namespace Hatimeria\ShippingRateInfo\Model\Rate;
use Hatimeria\ShippingRateInfo\Api\Quote\Data\ShippingMethodInterface;
use Magento\Framework\Model\AbstractExtensibleModel;
class RateInfo extends AbstractExtensibleModel implements ShippingMethodInterface
{
/**
* Retrieve rate info message
*
* @return string
*/
public function getRateInfo()
{
return $this->getData(self::RATEINFO);
}
/**
* Set rate info message
*
* @param string $rateInfo
* @return $this
*/
public function setRateInfo($rateInfo)
{
return $this->setData(self::RATEINFO, $rateInfo);
}
}
这是行不通的。生成费率时,费率模型不会返回额外的扩展。任何帮助将不胜感激。
尝试以下步骤:
- 运行
bin/magento setup:di:compile
生成ShippingMethodExtensionInterface
和一个 class 来实现这个(即使禁用缓存也不会在每个请求上完成) - 在您的插件中实例化
Magento\Quote\Api\Data\ShippingMethodExtension
并将数据添加到该对象,然后将整个对象添加到具有$entity->setExtensionAttributes($extensionModel)
的实体