Mengatur Batasan Pengiriman Lanjutan di Magento 2
Diterbitkan: 2017-05-17Dalam artikel ini, kami akan menjelaskan cara menyembunyikan metode pengiriman saat kondisi tertentu diterapkan.
Dalam beberapa skenario, pemilik toko mungkin ingin membatasi opsi pengiriman karena:
- suatu produk memiliki dimensi dan berat yang besar, sehingga tidak dapat dikirim dengan cara standar apa pun,
- kondisi penyimpanan penyimpanan beku tidak memungkinkan untuk mengirimkan produk tepat waktu
- pengiriman dibatasi karena lokasi pelanggan (negara, wilayah, kota )
- C art Total tidak mengizinkan pembelanja memenuhi syarat untuk penawaran pengiriman apa pun,
- dll.
Pilihan default opsi pengiriman Magento tidak menawarkan banyak fleksibilitas. Ini hanya mungkin untuk membatasi pengiriman untuk negara dan wilayah tertentu atau ketika Total Keranjang kurang dari jumlah yang ditetapkan.
Jika Anda berpikir bahwa ini tidak cukup, baca terus.
Saya akan memberi tahu Anda cara membuat plugin Anda sendiri yang memungkinkan Anda membatasi opsi pengiriman sesuai dengan model, sasaran, dan ketentuan bisnis Anda.
CATATAN
Saya tidak akan melalui langkah-langkah khusus yang diperlukan untuk membuat ekstensi untuk Magento 2. Anda dapat melihat cara melakukannya di sini atau di sini.
Untuk menonaktifkan metode pengiriman apa pun secara dinamis, kami memerlukan satu set kelas baru di ekstensi kami – ini adalah 2 plugin . Yang pertama akan bertanggung jawab atas validasi metode pengiriman, sedangkan yang kedua akan memfilternya.
Singkatnya, setiap metode yang tidak lolos validasi akan ditandai sebagai “ is_disabled “, dan pada langkah berikutnya, semua metode “ is_disabled ” difilter dan dihapus dari daftar utama.
Mari kita berguling.
* Karena pendekatan yang akan saya jelaskan didasarkan pada prinsip-prinsip yang digunakan dalam ekstensi Shipping Suite , saya akan menggunakan nama vendor 'Mageworx' dan nama ekstensi 'ShippingRules'. CATATAN! Untuk menghindari kesalahan, Anda perlu menggantinya dengan nama Anda sendiri!
Pertama, mari kita buat plugin (kelas) yang akan digunakan untuk memfilter. Berikut adalah caranya:
> MageWorx\ShippingRules\Model\Plugin\Shipping\Rate\Result\Append
namespace MageWorx\ShippingRules\Model\Plugin\Shipping\Rate\Result; kelas Tambahkan { /** * @var \Magento\Checkout\Model\Session|\Magento\Backend\Model\Session\Quote */ $sesi yang dilindungi; /** * @param \Magento\Checkout\Model\Session $checkoutSession * @param \Magento\Backend\Model\Session\Quote $backendQuoteSession * @param \Magento\Framework\App\State $state * @param internal Sesi $sesi */ fungsi publik __konstruksi( \Magento\Checkout\Model\Session $checkoutSession, \Magento\Backend\Model\Session\Quote $backendQuoteSession, \Magento\Framework\App\State $state ) { if ($state->getAreaCode() == \Magento\Framework\App\Area::AREA_ADMINHTML) { $this->session = $backendQuoteSession; } kalau tidak { $this->session = $checkoutSession; } } /** * Validasi setiap metode pengiriman sebelum menambahkan. * Terapkan tindakan aturan jika validasi berhasil. * Dapat menandai beberapa aturan sebagai dinonaktifkan. Aturan yang dinonaktifkan akan dihapus di kelas * @lihat MageWorx\ShippingRules\Model\Plugin\Shipping\Rate\Result\GetAllRates * dengan memeriksa nilai tanda ini di objek tarif. * * CATATAN: Jika Anda memiliki beberapa masalah dengan aturan dan metode pengiriman, mulai debug dari sini. * * @param \Magento\Shipping\Model\Rate\Result $subject * @param \Magento\Quote\Model\Quote\Address\RateResult\AbstractResult|\Magento\Shipping\Model\Rate\Result $result * @return array */ fungsi publik beforeAppend($subject, $result) { if (!$result instanceof \Magento\Quote\Model\Quote\Address\RateResult\Method) { kembali [$hasil]; } $filtableMethods = [ 'flat_flatrate', 'ups_XDM', 'ups_XPR', 'up_WXS', 'metode_pembawa', // ... tambahkan di sini kode metode Anda ]; $methodCode = $result->getCarrier() . '_' . $hasil->getMethod(); if (!in_array($methodCode, $filtableMethods)) { kembali [$hasil]; } /** @var \Magento\Quote\Model\Quote $quote */ $quote = $this->session->getQuote(); $quoteItems = $quote->getAllItems(); $heavyWeightFlag = salah; foreach ($quoteItems sebagai $item) { if ($item->getWeight() > 100) { $heavyWeightFlag = benar; melanjutkan; } } if ($heavyWeightFlag == benar) { $result->setIsDisabled(true); } kembali [$hasil]; } }
Kami menjalankan 3 pemeriksaan di badan plugin kami:
1.
!$result instanceof \Magento\Quote\Model\Quote\Address\RateResult\Method
– memastikan bahwa pada titik masuk kita mendapatkan apa yang kita butuhkan: itu adalah contoh dari metode pengiriman. Jika tidak, kami hanya mengembalikannya apa adanya.
2.
!in_array($methodCode, $filtableMethods)
– selanjutnya, kita periksa apakah metode saat ini masuk dalam daftar metode untuk penyaringan. Jika tidak, kami mengembalikannya apa adanya.
3.
$heavyWeightFlag == benar
– adalah pemeriksaan terakhir dan utama. Jika flag diterapkan ke nilai sebenarnya, metode saat ini akan dinonaktifkan: $result->setIsDisabled(true);
Kami akan mencoba memfilter setidaknya satu produk yang ditambahkan ke keranjang dan memiliki berat lebih dari 100 unit standar (pon atau kilo).
Metode yang tersedia untuk pemfilteran adalah 'flatrate_flatrate','ups_XDM','ups_XPR','ups_WXS','carrier_method' . Mereka di-hard-code dan disimpan dalam array $filtableMethods .
Kami beroperasi pada kode menggunakan seluruh kode metode pengiriman yang, sebagai suatu peraturan, terdiri dari kode operator ($result->getCarrier()) dan kode metode itu sendiri ($result->getMethod()) yang terhubung dengan “ _” .
Produk yang dibutuhkan untuk cek diambil langsung dari kutipan klien saat ini.
CATATAN
Sepotong kecil kode dalam konstruktor kelas array akan memungkinkan Anda menentukan kutipan baik di frontend maupun di backend (menyediakan pesanan dibuat di panel Admin).
Menggunakan \Magento\Framework\App\State kita dapat memeriksa di area mana kita berada saat ini, dan memilih kutipan yang diperlukan:
1. \Magento\Backend\Model\Session\Quote untuk Admin
2. \Magento\Checkout\Model\Session untuk Frontend
Itu dia!
Sekarang kami dapat memvalidasi metode pengiriman dan dapat melanjutkan ke tahap berikutnya – membuat plugin untuk menonaktifkan metode pengiriman yang tidak valid (sesuai dengan ketentuan kami).
Ini adalah cara untuk:
> MageWorx\ShippingRules\Model\Plugin\Shipping\Rate\Result\GetAllRates
/** * Hak Cipta 2016 MageWorx. Seluruh hak cipta. * Lihat LICENSE.txt untuk detail lisensi. */ namespace MageWorx\ShippingRules\Model\Plugin\Shipping\Rate\Result; kelas GetAllRates { /** * Nonaktifkan tarif pengiriman yang ditandai. * * CATATAN: Jika Anda tidak dapat melihat beberapa tarif pengiriman, mulailah men-debug dari sini. Pada awalnya, centang 'is_disabled' * param di objek tarif pengiriman. * * @param \Magento\Shipping\Model\Rate\Result $subject * @param array $hasil * @return array */ fungsi publik afterGetAllRates($subject, $result) { foreach ($hasil sebagai $key => $rate) { if ($rate->getIsDisabled()) { tidak disetel($hasil[$kunci]); } } kembali $hasil; } }
Plugin ini digunakan untuk mengambil semua data metode pengiriman yang tersedia dan memeriksanya masing-masing. Jika beberapa metode memiliki tanda “is_disabled” , kami hanya mengecualikannya dari daftar, yang memungkinkan kami untuk melihat hanya metode yang sesuai dengan kondisi yang dibuat di validator. Metode ini dikecualikan di halaman mana pun di situs web, baik itu perkiraan blok pengiriman di keranjang belanja, atau halaman checkout.
Sekarang, untuk memeriksa cara kerja plugin, kita perlu mendaftarkannya di file:
> MageWorx/ShippingRules/etc/di.xml
<?xml versi="1.0"?> <config xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> <type name="Magento\Shipping\Model\Rate\Result"> <nama plugin="mageworx_shippingrules_update_rate_result" type="MageWorx\ShippingRules\Model\Plugin\Shipping\Rate\Result\Append" sortOrder="10" dinonaktifkan="salah"/> <nama plugin="mageworx_shippingrules_update_disabled_or_enabled_rates" type="MageWorx\ShippingRules\Model\Plugin\Shipping\Rate\Result\GetAllRates" sortOrder="11" dinonaktifkan="salah"/> </jenis> </config>
CATATAN
Untuk alasan deskriptif, plugin dibagi menjadi 2 kelas yang berbeda. Dalam skenario biasa, Anda dapat menggunakan hanya 1 kelas untuk memodifikasi 2 metode berbeda dari kelas Magento\Shipping\Model\Rate\Result.
Mengapa cara kerjanya seperti ini?
Magento\Shipping\Model\Rate\Result adalah kelas utama Magento 2 yang bertanggung jawab untuk prosesi metode pengiriman. Metode getAllRates -nya digunakan untuk mengambil daftar metode pengiriman.
Sedangkan penambahan metode pengiriman biasanya dilakukan dengan bantuan metode 'tambah'. Setelah memvalidasi metode saat menambahkan, dan mengecualikannya dari koleksi, kita bisa mendapatkan daftar metode yang valid.
Validasi itu sendiri juga dapat dimodifikasi.
Ekstensi kami memiliki kelas khusus besar yang menyimpan kumpulan filter khusus dengan kondisi berbeda (seperti store_id, customer_group_id, tanggal dari/ke, hari dalam seminggu, dll . ). itu juga memiliki kelas terpisah dengan kumpulan tindakan yang harus diterapkan pada metode pengiriman (misalnya mengaktifkan atau menonaktifkannya, menulis ulang biayanya sesuai dengan kondisi yang berbeda, menambahkan biaya atau diskon tambahan, dll. )
Hasil plugin pertama di debug terlihat seperti ini (untuk produk dengan berat 1 unit):
Begini tampilannya di keranjang belanja (ups_WXS masih tersedia, karena batas berat tidak terlampaui):
Namun, jika Anda mengubah berat produk menjadi 101, metode pengiriman ini menjadi tidak tersedia:
Itu akan tersedia lagi jika Anda mengecualikannya dari daftar:
Di kasir:
CATATAN
Anda bisa mendapatkan daftar semua metode pengiriman sistem yang tersedia langsung dalam kode dengan cara berikut:
/** * Kembalikan array operator. * Jika $isActiveOnlyFlag disetel ke true, hanya akan mengembalikan operator aktif * * @param bool $isActiveOnlyFlag * @return array */ fungsi publik getAvailableMethods($isActiveOnlyFlag = false) { $carriers = $this->shippingConfig->getAllCarriers(); foreach ($carrier sebagai $carrierCode => $carrierModel) { if (!$carrierModel->isActive() && (bool)$isActiveOnlyFlag === true) { melanjutkan; } $carrierMethods = $carrierModel->getAllowedMethods(); if (!$carrierMethods) { melanjutkan; } foreach ($carrierMethods sebagai $methodCode => $methodTitle) { $metode[] = $carrierCode . '_' . $metodeKode; } } kembali !kosong($metode) ? $metode : []; }
Di mana `$this->shippingConfig` adalah turunan dari kelas `Magento\Shipping\Model\Config` . Dengan menggunakan kode ini, Anda dapat membuat model sumber untuk pemilih metode pengiriman di pengaturan ekstensi (dengan demikian, Anda tidak perlu melakukan hard-code di plugin).
Dan yang terakhir namun tidak kalah pentingnya.
Jika Anda tidak ingin membuat ekstensi sendiri untuk menonaktifkan metode pengiriman, Anda dapat menggunakan solusi Shipping Suite kami untuk Magento 2 .
Ekstensi memungkinkan Anda mengecualikan metode pengiriman apa pun kapan pun diperlukan hanya dengan beberapa klik mouse.
1. Buat aturan pengiriman baru dengan ketentuan sebagai berikut:
2. Pilih tindakan Sembunyikan Metode Pengiriman pada daftar, dan pilih metode mana yang harus dinonaktifkan:
CATATAN
Jika Anda tidak menemukan atribut 'weight' pada daftar ketentuan, periksa apakah atribut tersebut diaktifkan untuk digunakan dalam aturan promo:
Jika Anda memiliki pertanyaan atau ide tentang cara meningkatkan ekstensi kami lebih lanjut, silakan bagikan pendapat Anda di bagian komentar di bawah.