Untuk beberapa situs berbeda sekarang, saya telah melakukan ini menggunakan modal ctools, dan inilah garis besar dasar bagaimana saya mengimplementasikannya (sangat sederhana):
Buat panggilan balik halaman khusus di hook_menu () modul Anda yang menampilkan bentuk simpul dasar untuk simpul yang ingin Anda rujuk (untuk simpul 'pelajar', cukup isi bidang nama dan mungkin bidang tahun kelulusan). Pada formulir itu, di dalam panggilan balik Anda, simpan simpul menggunakan node_save () , dan simpan ID simpul (yang seharusnya berada di $ node-> nid setelah Anda meneruskan objek simpul baru ke node_save ()) di formulir itu $form_state['storage']['student_id'].
Ubah bentuk master / Class node menggunakan hook_form_alter () . Anda perlu melakukan beberapa hal di sini:
Pertama, Anda perlu menambahkan javascript dan fungsi modal ctools agar ctool tahu apa yang harus dilakukan dengan tautan khusus Anda:
// Add in ctools modal js and functionality.
ctools_include('modal');
ctools_modal_add_js();
Kedua, Anda perlu menambahkan tautan ke halaman panggilan balik yang Anda buat pada langkah 1 di menu kait, dan dengan tautan itu, tambahkan kelas 'ctools-use-modal'. Jadi, misalnya:
// Add link to custom student form callback with ctools modal.
$form['add_student_link'] = array(
'#markup' => l(t('Add Student'), 'mymodule/add-student', array('attributes' => array('class' => array('ctools-use-modal')))
);
- Di panggilan balik halaman khusus Anda, Anda perlu melakukan beberapa hal untuk membuatnya berfungsi dengan atau tanpa JavaScript, dan dengan fungsi formulir ctools.
Berikut ini contoh panggilan balik:
<?php
function mymodule_student_form_callback($js = FALSE) {
// Make sure $js (set by ctools) is TRUE/loaded.
if ($js) {
// Add in ctools modal form stuff.
ctools_include('modal');
ctools_include('ajax');
$form_state = array(
'ajax' => TRUE,
'title' => t('Create a Student'),
);
$output = ctools_modal_form_wrapper('mymodule_create_student_form', $form_state);
}
else {
return 'Javascript must be enabled for this feature to work.';
// Or, if we wanted to load the form normally...
// return drupal_get_form('mymodule_create_student_form');
}
// If the form is executed, dismiss the form and reload the page.
if ($form_state['executed']) {
$commands = array();
// Close the frame.
$commands[] = ctools_modal_command_dismiss();
// Use one of the ajax framework commands to place the returned
// student node nid into the proper form value, placholder div, etc.
// See: http://api.drupal.org/api/drupal/includes%21ajax.inc/group/ajax_commands/7
$commands[] = ajax_command_append('#student-id-placeholder', $form_state['storage']['student_id']);
$output = $commands;
}
// Render the output.
print ajax_render($output);
exit();
}
?>
Di mymodule_create_student_form($form, $form_state), buat formulir Anda seperti biasanya, dan kemudian dalam fungsi mymodule_create_student_form_submit(form, &$form_state)(kirim), setel nilai NID simpul siswa yang baru dibuat di $form_state['storage']['student_id']. Ini adalah bagaimana Anda akan mendapatkan ctools / AJAX untuk mengembalikan nid baru ke bentuk Kelas asli Anda.
Dalam situasi saya, saya menggunakan modal untuk meludah kembali beberapa markup ke halaman asli, jadi saya melewati markup ke dalam placeholder div menggunakan ajax_command_append(), kemudian saya punya beberapa jQuery di halaman asli memonitor div placeholder, dan ketika menemukan konten di itu, itu akan memindahkan HTML ke tempat yang tepat di tempat lain pada bentuk simpul. Dalam kasus Anda, Anda harus mengisi bidang referensi simpul tunggal atau multi-nilai, yang mungkin sedikit lebih kompleks. Saya belum perlu melakukan itu ... jadi saya tidak punya saran lagi untuk ditawarkan untuk bagian dari persamaan.