Contoh Modul Magento 2 dengan Model Kondisi dan Fieldset (Bagian 2)
Diterbitkan: 2019-12-16Pada artikel sebelumnya, kami melihat kode yang memungkinkan kami membuat model Aturan dengan antarmuka di Panel Admin. Itu adalah bagian penting dari modul, yang tidak berguna dengan sendirinya jika Anda tidak mempelajari cara menggunakannya di frontend. Jadi, inilah saatnya untuk mengetahui pentingnya aturan dan kondisi di dalamnya.
Setiap model validasi mewarisi kondisi yang membantu memvalidasi objek. Hasilnya, berdasarkan pemeriksaan validasi ini, kami dapat melakukan aktivitas tertentu. Dalam contoh kita, kita akan membuat aturan yang memungkinkan untuk menentukan apakah ada item dengan nilai atribut `heavy_weight` yang sama dengan 1 (benar) di keranjang belanja. Jika barang tersebut ditemukan, kami akan menampilkan blok dengan pesan berikut 'Anda memiliki beberapa barang kelas berat di keranjang Anda, silakan hubungi kami untuk mendiskusikan pengiriman.' di halaman keranjang belanja.
*Sangat penting untuk memahami bahwa cara kami memuat model Aturan kami tidak akan sesuai dengan kasus kehidupan nyata 100%. Karena alasan inilah kami akan dengan rapi menentukan aturan yang harus memuat ID Aturan . Berdasarkan itu, kami akan memvalidasi objek yang diketahui dengan item dari alamat pengiriman keranjang. Dalam modul yang belum dibuat sebagai contoh, objek Aturan harus dimuat sebagai kelas khusus, yang akan memvalidasinya terhadap kompatibilitasnya dengan lingkungan saat ini, yaitu toko, pelanggan dan grupnya, waktu, tanggal, dll. Kami pasti akan membahas masalah ini dalam serangkaian artikel terkait lebih lanjut. *
Catatan sampingan penting:
Sekarang, kode modul tersedia secara gratis di repositori publik di github.com. Dengan demikian, tidak ada lagi kode copy-paste dari postingan blog kita. Semua kode yang diperlukan tersedia dengan mudah di sini.
Pertama, mari buat aturan baru di Panel Admin, yang akan membantu menemukan produk dengan nilai atribut yang ditentukan sebagai heavy_weight:
*Jika Anda tidak melihat atribut Anda dalam daftar atribut dalam kondisi, pastikan untuk memeriksa konfigurasi atribut ini terlebih dahulu. Ini harus dilakukan untuk memastikan opsi Gunakan Untuk Ketentuan Aturan Promo tidak dinonaktifkan untuk itu.
Untuk melakukannya, buka Toko > Atribut > Produk. Kemudian, pilih atribut Anda dari daftar > Storefront Properties >. Penggunaan untuk Ketentuan Aturan Promo harus ditetapkan sebagai 'Ya'. Silakan, lihat tangkapan layar di bawah ini untuk lebih jelasnya:
Aturan saya memiliki ID 1. Selanjutnya, saya akan menggunakannya untuk memudahkan proses loading. Sekarang, mari perbarui tata letak halaman keranjang dengan menambahkan blok baru kita yang menampilkan pesan baru ke dalamnya.
`app/code/Vendor/Rules/view/frontend/layout/checkout_cart_index.xml` ```xml <?xml version="1.0"?> <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd"> <body> <referenceContainer name="checkout.cart.form.before"> <block class="Vendor\Rules\Block\Cart\RuleExample" name="custom_block_with_rules" template="Vendor_Rules::cart/example.phtml"/> </referenceContainer> </body> </page> ```
Seperti yang mungkin Anda perhatikan dari tata letak, kita akan membutuhkan 2 file lagi: blok dan template. Mari kita buat mereka:
`app/code/Vendor/Rules/view/frontend/templates/cart/example.phtml` ```php <?php /** @var \Vendor\Rules\Block\Cart\RuleExample $block */ ?> <?= $block->getMessage();?> ```
Semuanya dibuat sederhana dalam template, yaitu, hanya output pesan. Jika diperlukan, Anda dapat menambahkan tata letak sesuai kebutuhan.
Perlu diingat bahwa saat menggunakan templat seperti itu pada halaman cache satu halaman penuh, hasilnya juga akan di-cache. Pendekatan yang berbeda harus digunakan untuk halaman tersebut, yang dijelaskan secara rinci dalam dokumen resmi dev Magento.
Saatnya menambahkan kelas utama dari contoh. Berikut kelas bloknya:
heckout\Model\Session as CheckoutSession; use Magento\Framework\Exception\LocalizedException; use Magento\Framework\View\Element\Template; use Magento\Quote\Model\Quote\Address as QuoteAddress; use Vendor\Rules\Model\Rule; use Vendor\Rules\Model\ResourceModel\Rule\CollectionFactory as RulesCollectionFactory; /** * Class RuleExample */ class RuleExample extends Template { /** * @var RulesCollectionFactory */ private $rulesCollectionFactory; /** * @var string */ private $message; /** * @var CheckoutSession */ private $checkoutSession; /** * RuleExample constructor. * * @param Template\Context $context * @param RulesCollectionFactory $rulesCollectionFactory * @param CheckoutSession $checkoutSession * @param array $data */ public function __construct( Template\Context $context, RulesCollectionFactory $rulesCollectionFactory, CheckoutSession $checkoutSession, array $data = [] ) { $this->rulesCollectionFactory = $rulesCollectionFactory; $this->checkoutSession = $checkoutSession; $this->message = ''; parent::__construct($context, $data); } /** * @return string */ public function getMessage(): string { if ($this->message) { return $this->message; } $shippingAddress = $this->getShippingAddress(); if (!$shippingAddress) { return $this->message; } $rule = $this->getRule(); if ($rule && $rule->validate($shippingAddress)) { $this->message = __( 'You have some heavy weight items in your cart, please contact us to discuss delivery.' ); } return $this->message; } /** * @return Rule|null */ private function getRule(): ?Rule { /** @var \Vendor\Rules\Model\ResourceModel\Rule\Collection $rulesCollection */ $rulesCollection = $this->rulesCollectionFactory->create(); $rulesCollection->addFilter('rule_id', 1); /** @var Rule|null $rule */ $rule = $rulesCollection->getFirstItem(); return $rule; } /** * @return QuoteAddress|null */ private function getShippingAddress(): ?QuoteAddress { /** @var \Magento\Quote\Model\Quote $quote */ try { $quote = $this->checkoutSession->getQuote(); } catch (LocalizedException $exception) { return null; } if (!$quote) { return null; } return $quote->getIsVirtual() ? $quote->getBillingAddress() : $quote->getShippingAddress(); } } ```
Mari kita membahas kelas ini sedikit karena di situlah validasi disembunyikan. Ini hanya memiliki satu metode publik yang kami gunakan dalam template kami. Ini adalah metode `getMessage()`. Di dalam metode, aturan yang benar akan ditentukan (itu akan memvalidasi keranjang kami), serta alamat pengiriman (akan digunakan untuk validasi).
Kami mendapatkan alamat pengiriman menggunakan fungsionalitas frontend standar, yaitu dengan memintanya dari sesi checkout. Kami mengisi aturan dari koleksi dengan menggunakan filter yang didasarkan pada ID. (Seperti yang saya sebutkan di awal posting ini, itu bukan cara terbaik dan hanya dapat digunakan sebagai contoh. Pastikan untuk menjelaskan metode mendapatkan aturan dengan cara yang paling cocok untuk Anda). Saat memiliki 2 objek wajib di blok kita, kita tinggal memeriksa metode `$rule->validate($shippingAddress)` dari aturan kita yang akan dikembalikan, yaitu benar atau salah. Berdasarkan hasil, buat (atau tidak) pesan yang akan ditampilkan pada halaman keranjang di template kita. Di dalam model aturan, ini berfungsi sebagai berikut:
```php /** * Validate rule conditions to determine if rule can run * * @param \Magento\Framework\DataObject $object * @return bool */ public function validate(\Magento\Framework\DataObject $object) { return $this->getConditions()->validate($object); } ```
Metode ini sudah ada di kelas abstrak `Magento\Rule\Model\AbstractModel`, yang darinya aturan kelas `Vendor\Rules\Model\Rule` kami diwarisi. Jika Anda memerlukan validasi khusus, selalu mungkin untuk menambahkan metode `validate` sendiri ke aturan kelas dengan atau tanpa memanggil metode induk.
Inilah yang akan kita dapatkan sebagai hasilnya di frontend:
*Nilai atribut heavy_weight dari produk T1 Blue sama dengan 1:
![Produk yang valid dalam keranjang]
*Nilai atribut heavy_weight dari produk T1 Red sama dengan 0:
![Produk yang valid dalam keranjang]
Seperti yang Anda lihat di tangkapan layar, pesan kami dari blok ditampilkan untuk produk T1 Blue di bawah label keranjang. Untuk yang merah, sebaliknya, pesannya tidak ditampilkan. Ini berarti bahwa aturan bekerja dengan benar.
Terima kasih semua telah meluangkan waktu untuk membaca artikel. Jika Anda memiliki pertanyaan, jangan ragu untuk membagikannya di komentar di bawah. Saya akan dengan senang hati membantu.