it-swarm-id.com

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

Saya mencoba menggunakan ajax untuk memperbarui dua bagian 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.

8
Rick

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

  • HTML atau

  • Array yang dapat diulang atau

  • Array AJAX perintah

Dalam situasi yang saya tulis sebelumnya, saya mencoba mengembalikan array perintah AJAX dan array yang dapat diulang , yang sepertinya tidak mungkin.

Kode dalam modul contoh menunjukkan penargetan bagian yang berbeda dari suatu formulir menggunakan array 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.

13
Rick

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 array #ajax Pada elemen form (field_whatever Untuk contoh di bawah ini) yang didefinisikan dalam hook_form_FORM_ID_alter() (atau semacam kait perubahan bentuk) tempat Anda juga uji untuk $form_state dan buat perubahan pada array $form, 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;
 }
0
cdmo

Saya cukup baru untuk Drupal tetapi sejauh ini saya menemukan kerangka 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 menjadi sangat ringan.

Semoga berhasil!

0
silkAdmin