Bagaimana cara menambahkan penangan validasi khusus ke formulir yang ada (atau bidang formulir) di Drupal 8?
Saya memiliki formulir yang belum saya buat. Saya ingin menambahkan aturan validasi saya sendiri pada beberapa bidang ketika formulir dikirimkan.
Untuk Drupal 7, validasi khusus untuk formulir? menjelaskan untuk mengimplementasikan hook_form_alter()
dan kemudian menambahkan penangan validasi Anda] [1] ke $form['#validate']
array, tetapi dalam Drupal 8 form adalah kelas. Validasi dilakukan melalui validateForm()
metode dan saya tidak tahu cara memasukkan kode saya ke dalamnya.
Jawaban:
The
#validate
properti masih digunakan di Drupal 8. (Dengan solusi Adi Anda akan menimpa validator yang ada)Jika Anda ingin menambahkan validator khusus Anda sebagai tambahan pada default, Anda harus menambahkan sesuatu seperti ini di hook_form_FORM_ID_alter (atau serupa):
sumber
#validate
(tautan Anda), Anda tidak boleh menggunakan$form_state
sebagai array (cara D7), tetapi sebagai objek yang mengimplementasikanFormStateInterface
(cara D8). Dengan kata lain, kode di validator khusus Anda harus analog dengan kode yang Anda temukan dalamvalidateForm()
metode asli .Berdir memberikan jawaban yang benar, bahwa kendala adalah cara yang benar untuk menambahkan validasi ke bidang di Drupal 8. Berikut adalah contohnya.
Dalam contoh di bawah ini, saya akan bekerja dengan simpul tipe
podcast
, yang memiliki bidang nilai tunggalfield_podcast_duration
. Nilai untuk bidang ini perlu diformat sebagai HH: MM: SS (jam, menit dan detik).Untuk membuat batasan, dua kelas perlu ditambahkan. Yang pertama adalah definisi kendala, dan yang kedua adalah validator kendala. Keduanya adalah plugin, di namespace of
Drupal\[MODULENAME]\Plugin\Validation\Constraint
.Pertama, definisi kendala. Perhatikan bahwa ID plugin diberikan sebagai 'PodcastDuration', dalam anotasi (komentar) kelas. Ini akan digunakan lebih jauh ke bawah.
Selanjutnya, kita perlu menyediakan validator kendala. Nama kelas ini akan menjadi nama kelas dari atas, dengan
Validator
menambahkannya:Akhirnya, kita perlu memberitahu Drupal menggunakan kendala kami pada
field_podcast_duration
padapodcast
jenis node. Kami melakukan ini dihook_entity_bundle_field_info_alter()
:sumber
$item = $items->first();
dan mengembalikan NULL jika tidak ada di sana atau Anda akan mendapatkan kesalahan fatal saat mengedit bidang: TypeError: Argumen 2 diteruskan ke Drupal \ Component \ Utility \ NestedArray :: getValue () harus dari jenis array, null diberikan, dipanggil di /data/app/core/lib/Drupal/Core/Field/WidgetBase.php pada baris 407 di Drupal \ Component \ Utility \ NestedArray :: getValue () (baris 69 core / lib / Drupal / Component /Utility/NestedArray.php).Cara yang benar untuk melakukan ini untuk entitas konten seperti simpul adalah mendaftarkannya sebagai kendala.
Lihat
forum_entity_bundle_field_info_alter()
dan yang sesuai?ForumLeaf
kendala validasi (perhatikan bahwa ada dua kelas yang diperlukan).Itu sedikit lebih rumit pada awalnya, tetapi keuntungannya adalah ia diintegrasikan ke dalam API validasi, sehingga validasi Anda tidak terbatas pada sistem formulir tetapi dapat, misalnya, juga bekerja dengan node yang dikirimkan melalui REST API.
sumber
hook_entity_bundle_field_info_alter()
(seperti dijelaskan di sini ) tetapi tidak pernah berhasil ... Tampaknya ada masalah yang terdokumentasi dengan kait ini: drupal.org/node/2346347 .Saya ingin menambahkan sedikit lebih banyak tentang masalah ini. Penambahan validasi persis sama seperti sebelumnya: di hook_form_alter:
Penggunaan objek nilai di dalam $ form_state dalam fungsi validasi sedikit berbeda. misalnya:
Jadi tidak dengan akses langsung ke objek variabel pribadi, melainkan dengan fungsi pengambil.
untuk info lebih lanjut, Anda dapat melihat contoh lengkapnya di github saya: https://github.com/flesheater/drupal8_modules_experiments/blob/master/webham_formvalidation/webham_formvalidation.module
tepuk tangan!
sumber
Ini sangat mirip dengan di D7. Contoh lengkap:
mymodule.module :
sumber
hook_form_FORM_ID_alter
perlu form ID. Anda dapat memiliki fungsi validasi khusus menjadi apa pun yang Anda inginkan. Juga, ikuti panduan API di sini untuk parameter yang tepat.Sebagai pelengkap dari jawaban baik ini saya akan menambahkan:
Ini adalah cara memanggil metode kelas jauh untuk validasi formulir. Saya pikir lebih baik memanggil fungsi di atas dalam file modul seperti pada contoh yang diberikan.
sumber
Anda dapat menggunakan modul Validasi Clientside . Beberapa detail lebih lanjut tentang hal ini (dari halaman proyeknya):
sumber