Para alguns sites diferentes agora, eu fiz isso usando um modal ctools, e aqui está o esboço básico de como eu o implementei (muito simplesmente):
Crie um retorno de chamada de página personalizada no hook_menu () do seu módulo que exiba um formulário básico de nó para o nó que você deseja referenciar (para um nó 'aluno', basta ter um campo de nome e talvez um campo de ano de graduação). Nesse formulário, em seu retorno de chamada de envio, salve o nó usando node_save () e armazene o ID do nó (que deve estar em $ node-> nid depois de passar um novo objeto de nó para node_save ()) nos formulários $form_state['storage']['student_id']
.
Altere o formulário do nó mestre / classe usando hook_form_alter () . Você precisa fazer algumas coisas aqui:
Primeiro, você precisa adicionar o javascript e a funcionalidade modal do ctools para que o ctools saiba o que fazer com o seu link especial:
// Add in ctools modal js and functionality.
ctools_include('modal');
ctools_modal_add_js();
Segundo, você precisa adicionar um link ao retorno de chamada da página criado na etapa 1 no menu hook e, com esse link, adicionar a classe 'ctools-use-modal'. Então, por exemplo:
// 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')))
);
- No retorno de chamada da página personalizada, é necessário fazer algumas coisas para que funcione com ou sem JavaScript e com as funções de formulário do ctools.
Aqui está um exemplo de retorno de chamada:
<?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();
}
?>
Em mymodule_create_student_form($form, $form_state)
, crie seu formulário como faria normalmente e, na função mymodule_create_student_form_submit(form, &$form_state)
(enviar), defina o valor do NID do nó do aluno recém-criado $form_state['storage']['student_id']
. É assim que você fará com que o ctools / AJAX repasse o novo nid para o seu formulário de classe original.
Na minha situação, eu estava usando o modal para cuspir algumas marcações na página original, então passei a marcação para uma divisão de espaço reservado usando ajax_command_append()
, então eu tinha algum jQuery na página original monitorando a divisão de espaço reservado e, quando encontrou conteúdo em moveria o HTML para o local apropriado em outro lugar no formulário do nó. No seu caso, você precisará preencher um campo de referência de nó único ou com vários valores, o que pode ser um pouco mais complexo. Ainda não precisei fazer isso ... então não tenho mais conselhos a oferecer para essa parte da equação.