Теперь для пары разных сайтов, я сделал это с помощью модальности ctools, и вот основная схема того, как я это реализовал (очень просто):
Создайте пользовательский обратный вызов страницы в hook_menu () вашего модуля, который отображает базовую форму узла для узла, на который вы хотите сослаться (для «студенческого» узла просто есть поле имени и, возможно, поле года выпуска). В этой форме в вашем обратном вызове submit сохраните узел с помощью node_save () и сохраните идентификатор узла (который должен быть равен $ node-> nid после передачи нового объекта узла в node_save ()) в форме $form_state['storage']['student_id']
.
Измените форму узла Master / Class, используя hook_form_alter () . Вам нужно сделать несколько вещей здесь:
Во-первых, вам нужно добавить модальный javascript и функциональность ctools, чтобы ctools знал, что делать с вашей специальной ссылкой:
// Add in ctools modal js and functionality.
ctools_include('modal');
ctools_modal_add_js();
Во-вторых, вам нужно добавить ссылку на обратный вызов страницы, который вы создали на шаге 1 в меню ловушек, и с этой ссылкой добавить класс 'ctools-use-modal'. Так, например:
// 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')))
);
- В вашем пользовательском обратном вызове страницы вам нужно сделать несколько вещей, чтобы он работал с JavaScript или без него, а также с функциями форм ctools.
Вот пример обратного вызова:
<?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();
}
?>
В mymodule_create_student_form($form, $form_state)
, создайте свою форму, как обычно, и затем в функции mymodule_create_student_form_submit(form, &$form_state)
(submit) установите значение NID вновь созданного студенческого узла в $form_state['storage']['student_id']
. Вот как вы получите ctools / AJAX для передачи нового nid в вашу исходную форму класса.
В моей ситуации я использовал модал, чтобы выплевывать некоторую разметку на исходную страницу, поэтому я передал разметку в div-заполнитель, используя ajax_command_append()
, затем у меня было несколько jQuery на исходной странице, отслеживающих div-заполнитель, и когда он находил контент в это, это переместило бы HTML в надлежащее место в другом месте формы узла. В вашем случае вам нужно будет заполнить одно-или многозначное поле ссылки на узел, которое может быть немного сложнее. Мне еще не нужно было этого делать ... поэтому у меня нет больше советов, чтобы предложить эту часть уравнения.