Pour quelques sites différents maintenant, je l'ai fait en utilisant un modal ctools, et voici l'aperçu de base de la façon dont je l'ai implémenté (très simplement):
Créez un rappel de page personnalisé dans votre module hook_menu () qui affiche une forme de nœud de base pour le nœud que vous souhaitez référencer (pour un nœud `` étudiant '', ayez simplement un champ de nom et peut-être un champ d'année de fin d'études). Sur ce formulaire, dans votre rappel de soumission, enregistrez le nœud à l'aide de node_save () et stockez l'ID de nœud (qui devrait être à $ node-> nid après avoir passé un nouvel objet de nœud à node_save ()) dans le formulaire $form_state['storage']['student_id']
.
Modifiez la forme du nœud maître / classe à l'aide de hook_form_alter () . Vous devez faire quelques choses ici:
Tout d'abord, vous devez ajouter le javascript modal et les fonctionnalités de ctools pour que ctools sache quoi faire avec votre lien spécial:
// Add in ctools modal js and functionality.
ctools_include('modal');
ctools_modal_add_js();
Deuxièmement, vous devez ajouter un lien vers le rappel de page que vous avez créé à l'étape 1 du menu hook, et avec ce lien, ajoutez la classe «ctools-use-modal». Ainsi, par exemple:
// 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')))
);
- Dans votre rappel de page personnalisé, vous devez faire quelques choses pour le faire fonctionner avec ou sans JavaScript, et avec les fonctions de formulaire de ctools.
Voici un exemple de rappel:
<?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();
}
?>
Dans mymodule_create_student_form($form, $form_state)
, créez votre formulaire comme vous le feriez normalement, puis dans la fonction mymodule_create_student_form_submit(form, &$form_state)
(soumettre), définissez la valeur du NID du nœud étudiant nouvellement créé dans $form_state['storage']['student_id']
. C'est ainsi que vous obtiendrez ctools / AJAX pour renvoyer le nouveau nid à votre formulaire de classe d'origine.
Dans ma situation, j'utilisais le modal pour cracher du balisage à la page d'origine, j'ai donc passé le balisage dans un div d'espace réservé à l'aide ajax_command_append()
, puis j'ai eu jQuery sur la page d'origine en surveillant le div d'espace réservé, et quand il a trouvé du contenu dans il, il déplacerait le HTML à la bonne place ailleurs sur la forme du nœud. Dans votre cas, vous devrez remplir un champ de référence de nœud à valeur unique ou multiple, qui peut être un peu plus complexe. Je n'ai pas encore eu besoin de faire ça ... donc je n'ai plus de conseils à offrir pour cette partie de l'équation.