Saya sedang membangun Tipe Konten Panel CTools (yaitu, hal yang Anda masukkan ke panel ketika menambahkan konten, bukan tipe node) dan saya mencoba menggunakan #ajax
atribut item formulir untuk menetapkan beberapa nilai default. Lihat kode di bawah ini.
my_module_content_type_edit_form($form, &$form_state)
Ngomong-ngomong, ini semua di dalam panggilan jenis konten .
$form['link_type'] = array(
'#type' => 'radios',
'#title' => t('Link Type'),
'#ajax' => array(
'callback' => 'my_module_set_target'
),
'#default_value' => empty($conf['link_type']) ? '_blank' : $conf['link_type'],
'#options' => array('none'=>t('No Link'), 'internal'=>t('Internal Link'), 'external'=>t('External Link'), 'document'=>t('Document Link')),
);
Callback saya adalah sebagai berikut.
function my_module_set_target($form, $form_state) {
watchdog("Test", "Testing callback", array(), WATCHDOG_ALERT);
$form['link_target']['#default_value'] = '_parent';
return $form['link_target']['#default_value'];
}
Terlepas dari apakah pengembalian yang saya sarankan benar-benar berfungsi, watchdog()
bahkan tidak berhasil.
Saya tahu CTools melakukan beberapa hal aneh dengan AJAX, tetapi tidak mungkin itu aneh. Apakah Anda tahu bagaimana saya akan melakukan apa yang ingin saya lakukan?
Terima kasih!
Atau: Bagaimana cara menetapkan nilai default berdasarkan nilai opsi formulir sebelumnya?
Saya menemukan cara untuk melakukan ini, tapi ini sedikit gila - Anda membuat bidang formulir baru untuk setiap garpu ketergantungan. Anda kemudian bisa menggabungkan nilai-nilai bersama hook_content_type_edit_form_submit()
, menggunakan mana yang sesuai dengan nilai yang dipilih untuk komponen yang awalnya bercabang semuanya.
Saya membiarkan pertanyaan terbuka karena saya (dan, sejujurnya, setiap programmer yang bekerja dengan saya) benar-benar menginginkan cara yang baik untuk menggunakan AJAX di dalam formulir edit tipe konten Panel ini.
Pembaruan: Tampaknya Anda tidak dapat melakukan hal-hal dengan #attached.
$form['link'][$i] = array(
'#type' => 'fieldset',
'#title' => t('Link #@num', array('@num' => $i)),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
'#attached' => array(
'js' => array(
'alert("Yay.");', 'inline'
),
)
);
sumber
ctools_add_js();
ataudrupal_add_js();
di akhirhook_content_type_edit_form();
. Jika Anda hanya melakukan hal-hal sederhana yang berhubungan dengan UI, sepertinya itu adalah panggilan terbaik (Setidaknya sampai seseorang menjawab pertanyaan ini dengan benar).Jawaban:
Jawaban singkat: Anda harus menggunakan #ajax ['path'].
Jawaban panjang:
Memiliki panggilan balik ajax tidak membantu karena ctools membuat bentuknya berbeda. Callback yang dilakukan oleh sistem / ajax tidak dapat menemukan definisi formulir yang lengkap sehingga tidak dapat menemukan elemen untuk memproses permintaan ajax. Menggunakan #ajax [path] hanya memicu item menu.
Anda dapat memeriksa sendiri dengan membuang formulir saat menggunakan #ajax [panggilan balik]
Saya telah memodifikasi format simplecontext_content_type_edit_form dengan menambahkan widget autocomplete pengguna dan bidang Anda yang berfungsi :)
Karena sekarang Anda menggunakan jalur #ajax Anda perlu menambahkan item menu seperti yang saya suka
Nittpick tentang #attached [js]: inline js harus berupa nilai key => seperti:
Saya telah menggunakan Firebug untuk memeriksa nilai yang dihasilkan bukan efek yang dihasilkan. Jadi saya harap ini membantu memperbaiki masalah Anda.
sumber
Saya memiliki masalah yang sama, di mana saya ingin memasukkan tipe elemen Media ke dalam plugin tipe konten CTools, yang juga menggunakan ajax untuk memilih gambar.
Ia menggunakan pengaturan 'jalur' ajax sendiri, alih-alih pengaturan 'panggil balik', tetapi saat memilih gambar, formulir itu dibuat kembali tanpa elemen media sepenuhnya.
Saya melacak ini ke fakta bahwa drupal_rebuild_form tidak dapat menemukan fungsi pembungkus bentuk CTools, maupun fungsi bentuk pengaturan aktual. Jadi saya memperbaikinya dengan menambahkan baris kode ini ke formulir pengaturan ctools:
Mungkin saya kehilangan sesuatu yang jelas mengapa file yang disertakan tidak dimuat, tetapi termasuk mereka secara manual memperbaiki masalah bagi saya.
sumber
di pihak saya, saya harus menulis fungsi pembungkus formulir dalam file .module dan untuk memasukkan panel secara manual (di mana konten bentuk asli didefinisikan) seperti itu:
Sekarang, selama panggilan ajax, Drupal dapat mengambil formulir saya sehingga saya dapat menggunakan API formulir AJAX standar.
sumber