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_elementdari $form_state['triggering_element'].
Praktik terbaik adalah mendefinisikan #nameatribut 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_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 .
$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_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
}else if($form_state['values']['cancel'] == $form_state]['clicked_button']['#value']) {
//Process if Cancel is pressed
}
Beri nama tombol dengan #nameatribut, 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 #namemaka Anda akan mengaksesnya dengan cara berikut.
$button_clicked = $form_state->getTriggeringElement()['#name']
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.
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().