Jika Anda tidak mendefinisikan atribut ini triggering_elementakan menahan tombol #value(teks yang dapat dibaca pengguna), tetapi ini tidak disarankan karena modul lain dapat mengubah nilai ini atau diubah oleh lokalisasi).
Anda dapat menggunakan $form_state['clicked_button']juga, tetapi ini sudah usang .
Anda dapat membaca info lebih lanjut di halaman dokumentasi fungsi drupal_build_form .
Saya ingin menambahkan, jika Anda membutuhkan bidang pada formulir Anda, dan mereka tidak diisi, maka Anda Drupal akan melemparkan kesalahan validasi formulir (form_submit dipanggil setelah form_validate). Anda perlu melakukan sesuatu seperti devengineering.com/best-practices/drupal/…
iStryker
Itu poin yang bagus!
user1359
5
Sementara "clicked_button" masih berfungsi, itu sudah usang di D7 dan rekomendasinya adalah menggunakan "triggering_element" sebagai gantinya. Saya ingat ada beberapa bug #ajax (saya pikir) yang hanya memengaruhi kode yang menggunakan "clicked_button", jadi itu satu lagi alasan untuk menggunakan "triggering_element". Lagi pula, itu hanya kunci yang berbeda di $ form_state.
Bojan Zivanovic
1
Sementara pendekatan ini bekerja, itu sudah usang dan rentan terhadap masalah. Lihat jawaban tunik untuk cara Drupal 7 yang benar untuk melakukan ini.
Alice Heaton
3
Bandingkan nilai-nilai ini di $form_statesaya telah lakukan di Drupal 6 dan akan sama di Drupal7
if($form_state['values']['ok']== $form_state]['clicked_button']['#value']){//Process if OK is pressed}elseif($form_state['values']['cancel']== $form_state]['clicked_button']['#value']){//Process if Cancel is pressed}
Jika saya ingat benar Drupal 6 $ form_state] ['X'] sekarang $ form_state ['X'] di Drupal 7
iStryker
Mengapa Anda perlu membandingkan kedua nilai ini?
iStryker
Jika formulir berisi beberapa tombol kirim. Perbandingan ini akan membantu membedakan tombol mana yang digunakan untuk mengirimkan formulir dalam penangan pengiriman tunggal. $ form_state ['clicked_button'] ['# value'] = t ('Ya') akan menghasilkan nilai yang berbeda pada pengaturan multibahasa.
Shoaib Nawaz
Perbandingan tunggal adalah yang terbaik untuk menghindari semua perbandingan bahasa dalam pengaturan multibahasa. :)
Shoaib Nawaz
1
@ iStryker Saya tidak yakin apa yang Anda maksud dengan komentar pertama Anda.
kiamlaluno
3
Beri nama tombol dengan #nameatribut, seperti ini:
Jadi untuk formulir dengan dua tombol kirim seperti ini: $ form ['submit'] = array ('#type' => 'submit', '#name' => 'submit-1', '#value' => t ('Kirim1'),); $ form ['submit2'] = array ('#type' => 'submit', '#name' => 'submit-2', '#value' => t ('Kirim2'),); Kita hanya perlu memeriksa $ form_state-> getTriggeringElement () ['# name'] di fungsi submitForm ()?
Gayus
3
UPDATE 2016 Drupal 8
Bagi mereka yang masih mencoba mencari cara untuk mengakses peristiwa yang dipicu di sini adalah solusi Drupal 8.
$form_state->getTriggeringElement()
Ini mengembalikan array elemen pengiriman yang memicu. Jika Anda menambahkan markup yang dipanggil #namemaka Anda akan mengaksesnya dengan cara berikut.
Alasan di balik perubahan ini adalah bahwa FormStateInterfacesekarang readOnlyfile di mana hanya kelas yang memperluas FormStateInterfacedapat mengakses variabel. Jadi, Anda harus menggunakan metode accessor seperti getTriggeringElement()untuk mengakses variabel.
Dalam Drupal 8.4.4 $form_state->getTriggeringElement()['#name'];memberi Anda nilai op. Saat Anda mencari kunci itu di array nilai bentuk keadaan, Anda mendapatkan #valuekunci elemen bentuk tombol-- dengan kata lain, string yang dilihat pengguna akhir pada tombol di halaman.
Saya tidak tahu apakah $form_state->getValues()['op']itu universal untuk semua bentuk, tapi saya mengkodekannya dalam bentuk modul.
hook_submit()
atau pengajuan formulir pendaftaran? Penangan pengajuan formulir bukan implementasi darihook_submit()
.Jawaban:
Anda harus menggunakan
triggering_element
dari$form_state['triggering_element']
.Praktik terbaik adalah mendefinisikan
#name
atribut untuk tombol Anda, sehingga Anda dapat memiliki nilai ini ditriggering_element
.Sebagai contoh:
Jika Anda tidak mendefinisikan atribut ini
triggering_element
akan menahan tombol#value
(teks yang dapat dibaca pengguna), tetapi ini tidak disarankan karena modul lain dapat mengubah nilai ini atau diubah oleh lokalisasi).Anda dapat menggunakan
$form_state['clicked_button']
juga, tetapi ini sudah usang .Anda dapat membaca info lebih lanjut di halaman dokumentasi fungsi drupal_build_form .
sumber
$form_state['clicked_button']['#value']
akan memberi tahu Anda tombol mana yang diklik pada formulir.sumber
$form_state['clicked_button']['#value']
:)Bandingkan nilai-nilai ini di
$form_state
saya telah lakukan di Drupal 6 dan akan sama di Drupal7sumber
Beri nama tombol dengan
#name
atribut, seperti ini:lalu gunakan:
sumber
UPDATE 2016 Drupal 8
Bagi mereka yang masih mencoba mencari cara untuk mengakses peristiwa yang dipicu di sini adalah solusi Drupal 8.
$form_state->getTriggeringElement()
Ini mengembalikan array elemen pengiriman yang memicu. Jika Anda menambahkan markup yang dipanggil
#name
maka Anda akan mengaksesnya dengan cara berikut.$button_clicked = $form_state->getTriggeringElement()['#name']
Alasan di balik perubahan ini adalah bahwa
FormStateInterface
sekarangreadOnly
file di mana hanya kelas yang memperluasFormStateInterface
dapat mengakses variabel. Jadi, Anda harus menggunakan metode accessor sepertigetTriggeringElement()
untuk mengakses variabel.sumber
Dalam Drupal 8.4.4
$form_state->getTriggeringElement()['#name'];
memberi Anda nilaiop
. Saat Anda mencari kunci itu di array nilai bentuk keadaan, Anda mendapatkan#value
kunci elemen bentuk tombol-- dengan kata lain, string yang dilihat pengguna akhir pada tombol di halaman.Saya tidak tahu apakah
$form_state->getValues()['op']
itu universal untuk semua bentuk, tapi saya mengkodekannya dalam bentuk modul.sumber
Drupal 8.6.7
Buat tombolnya seperti di bawah ini.
Dalam fungsi kirim Anda dapatkan nama tombol seperti kode di bawah ini.
Perbandingan dapat dilakukan seperti
# Drupal8
sumber