如何在magento2中为运输方法添加自定义属性


How to add custom attribute to shipping method in magento2

我正在尝试在magento2中创建一个模块,该模块将允许向载体或特定方法添加自定义消息。我成功地用网格和表单创建了管理部分。现在我正在前端显示它。我已经创建了js和模板文件,如果数据在估计运输方法的结果中,它会很好地工作。我认为最简单的方法是将此消息添加到费率模型中。我创建了一个插件

<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并不是简单地输出模型中的所有数据,而是只返回ShippingMethodInterface定义的数据。然后我注意到有一种叫做extension_attributes的东西,根据文档,这应该允许我将消息添加到结果中。因此,通过查看文档和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" />

现在是无类的,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);
}

以及在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);
    }
}

这是行不通的。当生成费率时,费率模型不会返回额外的扩展。任何帮助都将不胜感激。

尝试以下步骤:

  1. 运行bin/magento setup:di:compile以生成ShippingMethodExtensionInterface和实现此功能的类(即使在禁用缓存的情况下,也不会对每个请求执行此操作)
  2. 在您的插件中,实例化Magento'Quote'Api'Data'ShippingMethodExtension并将数据添加到该对象中,然后使用$entity->setExtensionAttributes($extensionModel)将整个对象添加到实体中