Per un paio di siti diversi ora, l'ho fatto usando un ctools modale, ed ecco lo schema di base di come l'ho implementato (molto semplicemente):
Crea un callback di pagina personalizzato nel hook_menu del tuo modulo () che visualizza un modulo di nodo di base per il nodo a cui vuoi fare riferimento (per un nodo 'studente', basta avere un campo nome e forse un campo anno di laurea). In quel modulo, nel callback di invio, salva il nodo usando node_save () e archivia l'ID nodo (che dovrebbe trovarsi in $ node-> nid dopo aver passato un nuovo oggetto nodo a node_save ()) nei moduli $form_state['storage']['student_id']
.
Modifica il modulo del nodo master / classe utilizzando hook_form_alter () . Devi fare alcune cose qui:
Innanzitutto, devi aggiungere javascript e funzionalità modali di ctools in modo che ctools sappia cosa fare con il tuo link speciale:
// Add in ctools modal js and functionality.
ctools_include('modal');
ctools_modal_add_js();
In secondo luogo, è necessario aggiungere un collegamento al callback della pagina creato nel passaggio 1 nel menu hook e, con quel collegamento, aggiungere la classe 'ctools-use-modal'. Quindi, per esempio:
// 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')))
);
- Nel callback della pagina personalizzata, devi fare alcune cose per farlo funzionare con o senza JavaScript e con le funzioni del modulo di ctools.
Ecco un esempio di callback:
<?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();
}
?>
In mymodule_create_student_form($form, $form_state)
, crea il modulo come faresti normalmente, quindi nella mymodule_create_student_form_submit(form, &$form_state)
funzione (invio), imposta il valore del NID del nodo studente appena creato $form_state['storage']['student_id']
. Ecco come farai in modo che ctools / AJAX restituiscano il nuovo nid al modulo di classe originale.
Nella mia situazione, stavo usando il modale per restituire un po 'di markup alla pagina originale, quindi ho passato il markup in un div segnaposto usando ajax_command_append()
, quindi ho avuto un po' di jQuery nella pagina originale per monitorare il div segnaposto e quando ho trovato contenuto in esso sposterebbe l'HTML nella posizione corretta altrove sul modulo del nodo. Nel tuo caso, dovrai popolare un campo di riferimento nodo singolo o multi-valore, che potrebbe essere un po 'più complesso. Non ho ancora avuto bisogno di farlo ... quindi non ho più consigli da offrire per quella parte dell'equazione.