Magento 2 data tambahan untuk metode pengiriman

10

Saya sedang membuat metode pengiriman baru dan saya perlu menambahkan kolom baru untuk checkout tarif pengiriman. Data akan datang dari pengaturan metode pengiriman kustom, misalnya deskripsi metode. Atau beberapa bidang input tempat pelanggan dapat menambahkan info (data mungkin akan disimpan dalam kutipan dan kemudian dalam urutan).

Mungkin yang paling mudah dari semuanya adalah menerapkan template dengan menggunakan

Magento_Checkout/web/template/shipping.html

Hanya butuh ini

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

Masalahnya adalah saya tidak tahu cara menambahkan data khusus. Tidak cukup menambahkan ini:

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

Data untuk html berasal dari tingkat js (), yang mendapat data dari 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>

Setelah ini ada banyak langkah sementara sesuatu benar-benar dikumpulkan. saya menemukan

Magento \ Penawaran \ Model \ Keranjang \ PengirimanMethodConverter modelToDataObject ()

yang terlihat paling menjanjikan tetapi jika saya mencoba menambahkan atribut saya ke sana, tidak ada yang terjadi.

Jadi pertanyaan saya adalah, apakah sebenarnya ada cara untuk menambahkan data baru ke tarif pengiriman? Di M1 itu mungkin. Akan gila kalau M2 itu tidak mungkin.

Ada banyak alasan mengapa ini harus dimungkinkan. Sebagai contoh jika saya ingin melakukan penjemputan dalam metode toko dengan beberapa toko drop-down atau yang serupa.

Artis Z
sumber
Hai, Jika Anda punya solusinya, bisakah Anda berbagi?
konika
Nah, ada solusi untuk ini?
Piyush Dangre
Saya menunggu jawaban ini.
Diego Queiroz

Jawaban:

5

Anda perlu melakukan ini dengan menambahkan deskripsi sebagai atribut ekstensi seperti di bawah ini:

/etc/extension_attributes.xml harus seperti ini:

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

Dalam file etc / di.xml tambahkan sebuah plugin untuk mengganti modelToDataObject () di Magento \ Quote \ Model \ Cart \ ShippingMethodConverter seperti di bawah ini:

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

File plugin Vendor \ module \ Plugin \ Carrier \ Description.php harus seperti ini:

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

Setelah semua ini, Anda akan mendapatkan deskripsi tentang fronend seperti di bawah ini:

<div data-bind="text: method.extension_attributes.method_description"></div>
VIPIN A ROY
sumber
Ini tidak bekerja.
Dhaduk Mitesh
1

Jawaban berperingkat teratas tidak berfungsi karena ia lupa menetapkan nilai "deskripsi" di dalam kelas \ Magento \ Penawaran \ Model \ Penawaran \ Alamat \ Kelas. Jika kita tidak membuat Plugin untuk mengatur nilai Deskripsi pada kelas ini, maka $ rateModel-> getMethodDescription () akan selalu kembali kosong. Ini adalah versi solusi yang berfungsi penuh:

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

[Penjual] / [Modul] /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>

[Vendor] / [Module] / 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;
    }
}

Dan akhirnya:

[Penjual] / [Modul] / Plugin / Kutipan / Alamat / 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;
    }
}

Jangan lupa untuk menjalankan pengaturan bin / magento: di: compile, jika tidak atribut yang diperluas tidak akan dihasilkan.

Anda dapat mengikat data ke templat Anda menggunakan ini:

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

Atau sebagai komentar, seperti ini:

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

Juga jangan lupa untuk menggunakan $ method-> setDescription ('Deskripsi Kustom Anda Di Sini') atau $ method-> setData ('deskripsi', 'Deskripsi kustom Anda Di Sini') di dalam ekstensi Carrier kustom Anda (lihat pertanyaan asli untuk referensi).

Andresa Martins
sumber
-1

Anda perlu mendeklarasikan nama metode dalam file antarmuka, jalur untuk file ini adalah

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

Contoh:
Nyatakan konstan di atas

const KEY_DESCRIPTION = 'description';  

kemudian tentukan metode sebagai berikut

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

Maka Anda perlu menetapkan nilai ke file berikut

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

sebagai berikut

public function getDescription()
{
  return $this->_get(self::KEY_DESCRIPTION);
}
public function setDescription($desc)
{
  return $this->setData(self::KEY_DESCRIPTION, $desc);
}   
Ranjith Kumar
sumber
Menambahkan metode ke api publik (vendor / magento / module-quote / Api / Data / ShippingMethodInterface.php) ??? Tidak pernah melakukannya.
Pete Jaworski