it-swarm-id.com

Bagaimana saya bisa tahu tombol mana yang diklik?

Saya memiliki formulir dengan tombol "Kirim" dan "Batalkan". Dalam hook_submit(), bagaimana saya tahu tombol mana yang diklik?

12
user1359

Anda harus menggunakan $form_state->getTriggeringElement().

Praktik terbaik adalah mendefinisikan atribut #name Untuk tombol Anda, sehingga Anda dapat memiliki nilai ini di triggering_element.

Sebagai contoh:

$form['delete'] = array(
  '#type' => 'submit',
  '#value' => t('Delete'),
  '#name' => 'delete',
);

Dalam contoh ini: $form_state->getTriggeringElement()['#name'] akan mengembalikan "delete" ketika dipanggil di dalam public function submitForm(&$form, $form_state)

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 lebih banyak info di drupal_build_form halaman dokumentasi fungsi.

23
sanzante

$form_state['clicked_button']['#value'] akan memberi tahu Anda tombol mana yang diklik pada formulir.

7
iStryker

Bandingkan nilai-nilai ini dalam $form_state Saya telah melakukan 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
}
3
Shoaib Nawaz

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.
3
user13097

PEMBARUAN 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 disebut #name Maka Anda akan mengaksesnya dengan cara berikut.

$button_clicked = $form_state->getTriggeringElement()['#name']

Alasan di balik perubahan ini adalah bahwa FormStateInterface sekarang menjadi file readOnly di mana hanya kelas yang memperpanjang FormStateInterface yang dapat mengakses variabel. Jadi, Anda harus menggunakan metode accessor seperti getTriggeringElement() untuk mengakses variabel.

3
Neoaptt

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

0
Yogesh Kushwaha

Di Drupal 8.4.4 $form_state->getTriggeringElement()['#name']; memberi Anda nilai op. Saat Anda mencari kunci itu di array nilai-nilai status formulir, Anda mendapatkan #value Kunci elemen form button-- dengan kata lain, string yang dilihat pengguna akhir pada tombol di halaman.

Saya tidak tahu apakah $form_state->getValues()['op'] bersifat universal untuk semua bentuk, tapi saya mengkodekannya dalam bentuk modul saya.

0
user1359