配送方法への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のデータは、APIからデータを取得するjsrates()から取得されます。

<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ではそれが可能でした。M2が不可能だったとしたら、それはおかしいでしょう。

これが可能な理由はたくさんあります。たとえば、複数の店舗のドロップダウンまたは同様の方法で、店舗での受け取り方法を作成したい場合などです。


こんにちは、あなたが解決策を手に入れたら、共有していただけませんか?
konika

さて、これに対する解決策はありますか?
Piyush Dangre 2017

私はこの答えを待っています。
Diego Queiroz、2018年

回答:


5

これを行うには、以下のように説明を拡張属性として追加する必要があります。

/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

1

彼が\ Magento \ Quote \ Model \ Quote \ Address \ Rateクラス内に "description"値を設定するのを忘れたため、最高評価の回答は機能しません。このクラスに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>

[ベンダー] / [モジュール] /Plugin/Carrier/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;
    }
}

そして最後に:

[ベンダー] / [モジュール] /Plugin/Quote/Address/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( 'Your Custom Description Here')または$ method-> setData( 'description'、 'Your custom Description Here')を使用することを忘れないでください(元の質問を見て参照)。


-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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.