Für ein paar verschiedene Sites habe ich dies jetzt mit einem ctools-Modal gemacht, und hier ist die grundlegende Beschreibung, wie ich es implementiert habe (sehr einfach):
Erstellen Sie im hook_menu () Ihres Moduls einen benutzerdefinierten Seitenrückruf, der eine grundlegende Knotenform für den Knoten anzeigt, auf den Sie verweisen möchten (für einen 'Studenten'-Knoten haben Sie nur ein Namensfeld und möglicherweise ein Abschlussjahresfeld). Speichern Sie in diesem Formular in Ihrem Rückruf zum Senden den Knoten mit node_save () und speichern Sie die Knoten-ID (die sich bei $ node-> nid befinden sollte, nachdem Sie ein neues Knotenobjekt an node_save () übergeben haben) im Formular $form_state['storage']['student_id']
.
Ändern Sie das Master- / Klassenknotenformular mit hook_form_alter () . Sie müssen hier einige Dinge tun:
Zuerst müssen Sie das modale Javascript und die Funktionalität von ctools hinzufügen, damit ctools weiß, was mit Ihrem speziellen Link zu tun ist:
// Add in ctools modal js and functionality.
ctools_include('modal');
ctools_modal_add_js();
Zweitens müssen Sie einen Link zu dem Seitenrückruf hinzufügen, den Sie in Schritt 1 im Hook-Menü erstellt haben, und mit diesem Link die Klasse 'ctools-use-modal' hinzufügen. Also zum Beispiel:
// 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')))
);
- In Ihrem benutzerdefinierten Seitenrückruf müssen Sie einige Schritte ausführen, damit er mit oder ohne JavaScript und mit den Formularfunktionen von ctools funktioniert.
Hier ist ein Beispiel für einen Rückruf:
<?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)
, bauen Sie Ihre Form wie gewohnt, und dann in der mymodule_create_student_form_submit(form, &$form_state)
(abschicken) Funktion, in den Wert des NID des neu geschaffenen Studenten Knoten gesetzt $form_state['storage']['student_id']
. Auf diese Weise erhalten Sie ctools / AJAX, um die neue NID an Ihre ursprüngliche Klassenform zurückzugeben.
In meiner Situation habe ich das Modal verwendet, um ein Markup auf die Originalseite zurückzuspucken. Daher habe ich das Markup mithilfe von ajax_command_append()
jQuery auf der Originalseite an ein Platzhalter-Div übergeben. Dabei wurde das Platzhalter-Div überwacht und der Inhalt wurde gefunden es würde den HTML-Code an die richtige Stelle an einer anderen Stelle im Knotenformular verschieben. In Ihrem Fall müssen Sie ein ein- oder mehrwertiges Knotenreferenzfeld ausfüllen, das möglicherweise etwas komplexer ist. Ich musste das noch nicht tun ... also habe ich für diesen Teil der Gleichung keine weiteren Ratschläge.