Bisakah saya menggunakan ajax untuk menargetkan beberapa elemen formulir dari satu input?

8

Saya mencoba menggunakan ajax untuk memperbarui dua bagian yang berbeda dari bentuk drupal dari hanya satu input blur.

Saya memiliki barang-barang ajax standar pada masukan saya:

$my_form['my_input']['#ajax'] = array(
  'callback' => 'my_callback',
  'wrapper' => 'my_target_div',
  'event' => 'blur',
);

Ini berfungsi dengan baik, menukar div saya ketika input diperbarui ... namun saya juga ingin memperbarui input formulir lain di tempat lain dalam bentuk dengan kode yang berbeda sebagai akibat kabur pada input asli saya.

Apakah ini mungkin, ada ide?

Sunting: Untuk kejelasan, inilah contoh dunia nyata saya:

  • Jenis konten 'film'
  • Bidang yang ditambahkan 'primary_title'
  • Ketika 'primary_title' diperbarui, panggilan balik ajax saya memeriksa string yang sama dan mengembalikan html.
  • Html dari panggil balik dimasukkan ke dalam div kosong.

    Bagian itu bekerja dengan baik!

Saya mencoba juga memodifikasi input 'judul' simpul standar, memberikan nilai 'primary_title' setelah saya melakukan beberapa regex untuk merapikan string (menghapus "The" atau "A" dari awal dll) Hasilnya akan menjadi dua bidang judul, satu dengan judul lengkap 'primary_title' dan satu lagi 'judul' yang akan berguna untuk menyortir dan menampilkan catatan.

Rick
sumber

Jawaban:

13

Tampaknya Anda dapat menargetkan bagian-bagian berbeda dari suatu formulir menggunakan perintah ajax, namun Anda harus memilih untuk mengembalikan hanya satu saja dari salah satu:

  • HTML atau

  • Array yang dapat diulang atau

  • Array perintah AJAX

Dalam situasi yang awalnya saya tulis, saya mencoba mengembalikan array perintah AJAX dan array yang dapat di render, yang sepertinya tidak mungkin.

Kode dalam modul contoh menunjukkan penargetan bagian-bagian berbeda dari suatu formulir menggunakan larik perintah AJAX:

function ajax_example_advanced_commands_html_callback($form, $form_state) {
  $text = $form_state['values']['html_command_example'];

  $commands = array();
  $commands[] = ajax_command_html('#html_div', $text);
  $commands[] = ajax_command_replace("#html_status", "<div id='html_status'>Updated html_command_example with text=$text;  " . date('r') . "</div>");
  return array('#type' => 'ajax', '#commands' => $commands);
}

Dalam contoh kode ini, #html_div mendapatkan $ text, dan secara terpisah #html_status mendapatkan "Updated html_command_example dengan text = $ text;". tanggal ('r'). ""

Dua lokasi berbeda pada formulir dengan dua informasi berbeda dari panggilan balik ajax!

Melihat lagi apa yang sedang saya kerjakan, saya menyadari bahwa saya tidak perlu mengembalikan bidang judul simpul sama sekali. Ini hanya akan menjadi bidang utilitas, yang digunakan untuk menyortir data dalam daftar.

Saya telah menyembunyikan bidang pada formulir node dan dihuni kedua kali formulir saya dibangun ketika panggilan balik ajax asli saya dipicu.

Rick
sumber
0

Saya cukup baru untuk Drupal tetapi sejauh ini saya menemukan kerangka kerja Ajax agak tidak fleksibel. Ini berfungsi dengan baik selama Anda menggunakannya seperti yang dimaksudkan. Jadi, dalam contoh Anda jika Anda tahu beberapa JS yang terbaik adalah membuat skrip itu sendiri, itu harus sangat ringan.

Semoga berhasil!

sutra sutera
sumber
Terima kasih atas sarannya :) Saya menyadari bahwa saya tidak perlu mengembalikan bidang judul simpul sama sekali karena hanya digunakan sebagai bidang utilitas untuk mengatur daftar. Itu akan diisi ketika formulir saya dibangun kembali sebagai hasil dari panggilan balik ajax saya yang ada.
Rick
0

Pilihan lain, dari drupal.org :

Anda dapat dengan mudah mengganti seluruh formulir jika itu yang paling mudah. Cukup tambahkan #prefix dan #suffix ke seluruh form array, lalu tetapkan itu sebagai #ajax ['wrapper']. (Ini akan memungkinkan Anda untuk mengubah beberapa elemen formulir melalui satu panggilan ajax.) Satu-satunya alasan untuk tidak melakukan ini adalah prosesnya lebih cepat jika lebih sedikit informasi yang ditransfer.

Fungsi panggilan balik Anda dapat sesederhana:

function _callback($form, $form_state) {
  return $form;
}

Itu harus dipanggil dari #ajaxarray pada elemen formulir ( field_whateveruntuk contoh di bawah ini) didefinisikan dalam hook_form_FORM_ID_alter()(atau semacam $form_statepengubah bentuk) di mana Anda juga menguji dan membuat perubahan pada $formarray, seperti:

 if (isset($form_state['values']['field_whatever'])){
     $form['field_something']['#disabled'] = TRUE;
     $form['field_something_else']['#disabled'] = FALSE;
 } else {
     $form['field_something']['#disabled'] = FALSE;
     $form['field_something_else']['#disabled'] = TRUE;
 }
cdmo
sumber