Magento 2运送方式的其他数据


10

我正在制定新的送货方式,我需要在结帐运费中添加新列。数据将来自自定义的运输方法设置,例如方法说明。或客户可以在其中添加信息的某些输入字段(数据可能会保存在报价中,然后再按顺序保存)。

最简单的部分可能是通过使用

Magento_Checkout/web/template/shipping.html

它只需要这个

<div data-bind="text: method.description"></div>

问题是我不知道如何添加自定义数据。仅添加以下内容还不够:

public function collectRates(RateRequest $request)
{
    if (!$this->isActive()) return false;

    $method = $this->rateMethodFactory->create();
    $method->setData('carrier', $this->getCarrierCode());
    $method->setData('carrier_title', $this->getConfigData('title'));
    $method->setData('method_title', $this->getConfigData('title'));
    $method->setData('method', $this->getCarrierCode());
    $method->setPrice($this->_price);
    $method->setData('cost', $this->_price);

    // custom
    $method->setData('description', $this->getConfigData('description'));

    $result = $this->rateResultFactory->create();
    $result->append($method);

    return $result;
}

html的数据来自js rates(),后者从API获取数据:

<route url="/V1/carts/:cartId/shipping-methods" method="GET">
    <service class="Magento\Quote\Api\ShippingMethodManagementInterface" method="getList"/>
    <resources>
        <resource ref="Magento_Cart::manage" />
    </resources>
</route>

在此之后,有许多步骤实际上要收集一些东西。我发现

Magento \ Quote \ Model \ Cart \ ShippingMethodConverter modelToDataObject()

看起来最有前途,但是如果我尝试向其中添加属性,则什么也没有发生。

所以我的问题是,是否真的有办法向运费中添加新数据?在M1中,这是可能的。如果不可能的话,那将是疯狂的。

有许多原因使之成为可能。例如,如果我想在有多个商店下拉菜单或类似内容的商店方法中进行提货。


嗨,如果您有解决方案,可以请您分享吗?
konika

那么,对此有什么解决方案吗?
Piyush Dangre

我正在等待这个答案。
迭戈·奎罗斯

Answers:


5

为此,您需要通过将description作为扩展属性添加如下:

/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\Quote\Api\Data\ShippingMethodInterface">
        <attribute code="method_description" type="string" />
    </extension_attributes>
</config>

在etc / di.xml文件中,添加一个用于覆盖Magento \ Quote \ Model \ Cart \ ShippingMethodConverter中的modelToDataObject()的插件,如下所示:

<?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>

插件文件Vendor \ module \ Plugin \ Carrier \ Description.php应如下所示:

<?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;
    }
}

完成所有这些之后,您将在fronend上获得以下描述:

<div data-bind="text: method.extension_attributes.method_description"></div>

这是行不通的。
Dhaduk Mitesh

2

评分最高的答案不起作用,因为他忘记在\ Magento \ Quote \ Model \ Quote \ Address \ Rate类中设置“描述”值。如果我们不创建用于在此类上设置Description值的插件,则$ rateModel-> getMethodDescription()将始终返回空。这是该解决方案的完整版本:

[供应商] / [模块] /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\Quote\Api\Data\ShippingMethodInterface">
        <attribute code="description" type="string" />
    </extension_attributes>
</config>

[供应商] / [模块] /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\Quote\Model\Cart\ShippingMethodConverter">
        <plugin name="add_description_to_method" type="<Vendor>\<module>\Plugin\Carrier\Description" disabled="false" sortOrder="30"/>
    </type>

<type name="Magento\Quote\Model\Quote\Address\Rate">
        <plugin name="add_description_to_method_rate" type="<Vendor>\<module>\Plugin\Quote\Address\Rate" disabled="false" sortOrder="3"/>
    </type>
</config>

[供应商] / [模块] /插件/运营商/Description.php

<?php

namespace Vendor\module\Plugin\Carrier;

use Magento\Quote\Api\Data\ShippingMethodExtensionFactory;


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->setDescription($rateModel->getDescription());
        $result->setExtensionAttributes($extensionAttribute);
        return $result;
    }
}

最后:

[供应商] / [模块] /插件/报价/地址/Rate.php

<?php
namespace <Vendor>\<Module>\Plugin\Quote\Address;

class Rate
{
    /**
     * @param \Magento\Quote\Model\Quote\Address\AbstractResult $rate
     * @return \Magento\Quote\Model\Quote\Address\Rate
     */
    public function afterImportShippingRate($subject, $result, $rate)
    {
        if ($rate instanceof \Magento\Quote\Model\Quote\Address\RateResult\Method) {
            $result->setDescription(
                $rate->getDescription()
            );
        }

        return $result;
    }
}

不要忘记运行bin / magento setup:di:compile,否则将不会生成扩展属性。

您可以使用以下方法将数据绑定到模板:

<div data-bind="text: method.extension_attributes.description"></div>

或作为评论,像这样:

<!-- ko text: $data.extension_attributes.description --><!-- /ko -->

另外,请不要忘记在自定义运营商扩展程序中使用$ method-> setDescription('您的自定义描述此处')$ method-> setData('description','您的自定义描述此处')(请参阅原始问题)参考)。


-1

您需要在接口文件中声明方法名称,该文件的路径为

vendor/magento/module-quote/Api/Data/ShippingMethodInterface.php 

示例:
在顶部声明常量

const KEY_DESCRIPTION = 'description';  

然后定义方法如下

public function getDescription();
public function setDescription($desc);

然后,您需要将值分配给以下文件

vendor/magento/module-quote/Model/Cart/ShippingMethod.php 

如下

public function getDescription()
{
  return $this->_get(self::KEY_DESCRIPTION);
}
public function setDescription($desc)
{
  return $this->setData(self::KEY_DESCRIPTION, $desc);
}   

将方法添加到公共api(vendor / magento / module-quote / Api / Data / ShippingMethodInterface.php)??? 绝对不要那样做。
Pete Jaworski '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.