Ubah $ form_state dalam panggilan balik AJAX

16

Saya membuat formulir yang menggunakan '#ajax'atribut API bentuk , dan saya perlu membuat perubahan $form_stateketika tombol yang diaktifkan AJAX ditekan. Inilah yang saya punya:

Di dalam fungsi form builder saya:

...
$form['some_fieldset']['add_more'] = array(
      '#type' => 'button',
      '#value' => t('Add more rows'),
      '#ajax' => array(
        'wrapper' => 'some-fieldset',
        'callback' => 'my_module_settings_ajax',
        'method' => 'replace',
        'effect' => 'fade',
      ),
    );

...

Dan inilah fungsi callback:

function my_module_settings_ajax($form, $form_state) { 
  // Make a change to $form_state
  if ($form_state['some_fieldset']['add_more']) {
    $form_state['values']['some_fieldset']['table'][] = array('first_field' => '',
                                                                'second_field' => '');
  }

  return $form['some_fieldset'];
}

Perubahan yang saya buat $form_statetampaknya hilang begitu panggilan balik selesai. Apakah ada cara untuk melakukan perubahan $form_statepada fungsi ini, atau ada fungsi lain yang harus saya gunakan untuk ini?

EDIT

Ternyata, panggilan balik adalah tempat yang salah untuk melakukan logika ini. Sebagai gantinya, di bagian atas fungsi pembuat formulir, saya menambahkan ini:

// Respond to AJAX-triggger:
// Add new row
if ($form_state['triggering_element']['#name'] == 'add_more') {
  $form_state['values']['some_fieldset']['table'][] = array('first_field' => '',
                                                                'second_field' => '');
}

Tentu saja, saya harus memberi tombol nama:

$form['some_fieldset']['add_more'] = array(
  '#type' => 'button',
  '#name' => 'add_more', // <-- Right here
  '#value' => t('Add more rows'),
  '#ajax' => array(
    'wrapper' => 'some-fieldset',
    'callback' => 'my_module_settings_ajax',
    'method' => 'replace',
    'effect' => 'fade',
  ),
);

Dan sekarang berhasil!

MW.
sumber

Jawaban:

3

Anda harus lulus $form_statesebagai referensi; fungsi AJAX perlu didefinisikan seperti pada contoh berikut:

function mymodule_settings_ajax($form, &$form_state) { /* … */ } 
bergizi
sumber
Untuk memperjelas, Anda membutuhkan & untuk melewati referensi daripada nilai. Tanpanya Anda hanya memodifikasi salinan $ form_state.
Malks
Ya, jika Anda tidak melakukan ini, Anda hanya memodifikasi variabel lokal.
nourcy
1
Tentu saja, tidak memikirkan itu. Sayangnya, itu tidak memiliki efek apa pun - perubahan apa pun yang dilakukan ke $ form_state diabaikan dalam pembuat formulir, dan pada saat panggilan AJAX dibuat, $ form_state dikembalikan. Mungkinkah formulir sudah dibuat pada saat callback dieksekusi? Apakah ada cara untuk menjalankan custom-handler kustom untuk tombol ini?
MW.
Cobalah untuk mengubah jenis dari tombol untuk mengirim
nourcy
0

Saya tidak yakin bahwa itu adalah jawaban langsung untuk pertanyaan Anda, tetapi mungkin berfungsi untuk Anda menggunakan case: Alih-alih mengubah nilai tambah $ form_state ke $ form Anda. Jika Anda tidak ingin mereka tampil, gunakan saja #hidden.

Malks
sumber