Saya memiliki formulir dengan tombol "Kirim" dan "Batalkan". Di hook_submit()
, bagaimana saya tahu tombol mana yang diklik?
Saya memiliki formulir dengan tombol "Kirim" dan "Batalkan". Di hook_submit()
, bagaimana saya tahu tombol mana yang diklik?
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 di triggering_element
.
Sebagai contoh:
$form['delete'] = array(
'#type' => 'submit',
'#value' => t('Delete'),
'#name' => 'delete',
);
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 .
$form_state['clicked_button']['#value']
akan memberi tahu Anda tombol mana yang diklik pada formulir.
$form_state['clicked_button']['#value']
:)
Bandingkan nilai-nilai ini di $form_state
saya 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
}else if($form_state['values']['cancel'] == $form_state]['clicked_button']['#value']) {
//Process if Cancel is pressed
}
Beri nama tombol dengan #name
atribut, seperti ini:
$form['delete'] = array(
'#type' => 'submit',
'#value' => t('Delete'),
'#name' => 'delete',
);
lalu gunakan:
$values = $form_state['input'];
if (isset($values['delete'])) // 'delete' button was pressed.
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
sekarang readOnly
file di mana hanya kelas yang memperluas FormStateInterface
dapat 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 #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.
Drupal 8.6.7
Buat tombolnya seperti di bawah ini.
$form['my_button'] = [
'#type' => 'button',
'#value' => t('Custom Button'),
'#name' => t('customButton'),
'#weight' => 0,
'#attributes' => [
'class' => ['populate-bib-button', 'btn', 'btn-primary'],
],
];
Dalam fungsi kirim Anda dapatkan nama tombol seperti kode di bawah ini.
$input = $form_state->getUserInput();
print $input['_triggering_element_name']; // customButton
Perbandingan dapat dilakukan seperti
if ($input['_triggering_element_name'] == 'customButton') {
// Do something.
}
# Drupal8
hook_submit()
atau pengajuan formulir pendaftaran? Penangan pengajuan formulir bukan implementasi darihook_submit()
.