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.
sumber
Jawaban:
Anda perlu melakukan ini dengan menambahkan deskripsi sebagai atribut ekstensi seperti di bawah ini:
/etc/extension_attributes.xml harus seperti ini:
Dalam file etc / di.xml tambahkan sebuah plugin untuk mengganti modelToDataObject () di Magento \ Quote \ Model \ Cart \ ShippingMethodConverter seperti di bawah ini:
File plugin Vendor \ module \ Plugin \ Carrier \ Description.php harus seperti ini:
Setelah semua ini, Anda akan mendapatkan deskripsi tentang fronend seperti di bawah ini:
sumber
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
[Penjual] / [Modul] /etc/di.xml
[Vendor] / [Module] / Plugin/Carrier/Description.php
Dan akhirnya:
[Penjual] / [Modul] / Plugin / Kutipan / Alamat / Rate.php
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:
Atau sebagai komentar, seperti ini:
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).
sumber
Anda perlu mendeklarasikan nama metode dalam file antarmuka, jalur untuk file ini adalah
Contoh:
Nyatakan konstan di atas
kemudian tentukan metode sebagai berikut
Maka Anda perlu menetapkan nilai ke file berikut
sebagai berikut
sumber