Para un par de sitios diferentes ahora, he hecho esto usando un modal ctools, y aquí está el resumen básico de cómo lo implementé (muy simple):
Cree una devolución de llamada de página personalizada en el hook_menu () de su módulo que muestre un formulario de nodo básico para el nodo al que desea hacer referencia (para un nodo 'estudiante', solo tenga un campo de nombre y quizás un campo de año de graduación). En ese formulario, en su devolución de llamada de envío, guarde el nodo usando node_save () y almacene el ID del nodo (que debe estar en $ node-> nid después de pasar un nuevo objeto de nodo a node_save ()) en el formulario $form_state['storage']['student_id']
.
Modifique la forma del nodo maestro / clase usando hook_form_alter () . Necesita hacer algunas cosas aquí:
Primero, debe agregar el javascript y la funcionalidad modal de ctools para que ctools sepa qué hacer con su enlace especial:
// Add in ctools modal js and functionality.
ctools_include('modal');
ctools_modal_add_js();
En segundo lugar, debe agregar un enlace a la devolución de llamada de la página que creó en el paso 1 en el menú de enlace, y con ese enlace, agregue la clase 'ctools-use-modal'. Así por ejemplo:
// 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')))
);
- En la devolución de llamada de su página personalizada, debe hacer algunas cosas para que funcione con o sin JavaScript, y con las funciones de formulario de ctools.
Aquí hay un ejemplo de devolución de llamada:
<?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();
}
?>
En mymodule_create_student_form($form, $form_state)
, cree su formulario como lo haría normalmente, y luego, en la función mymodule_create_student_form_submit(form, &$form_state)
(enviar), establezca el valor del NID del nodo de estudiante recién creado $form_state['storage']['student_id']
. Así es como obtendrá ctools / AJAX para devolver el nuevo nid a su formulario de clase original.
En mi situación, estaba usando el modal para escupir algo de marcado a la página original, así que pasé el marcado a un marcador de posición usando ajax_command_append()
, luego tuve un jQuery en la página original monitoreando el marcador de posición div, y cuando encontró contenido en , movería el HTML al lugar apropiado en otro lugar del formulario de nodo. En su caso, deberá completar un campo de referencia de nodo único o de valores múltiples, que puede ser un poco más complejo. Todavía no he necesitado hacer eso ... así que no tengo más consejos que ofrecer para esa parte de la ecuación.