Erstellen von Knoten und referenzierten Knoten gleichzeitig

7

Ich habe eine Situation, in der ich gleichzeitig Knoten und referenzierte Knoten erstellen möchte. Gibt es dafür Lösungen, die dafür gut funktionieren?

Um zu verdeutlichen, wovon ich spreche, betrachten Sie die folgende Situation ( zur Erklärung stark vereinfacht):

Es gibt eine Klasse vom Inhaltstyp mit dem knotenbezogenen Feld Student . Ich möchte, dass Benutzer gleichzeitig Klassen- und Studentenknoten erstellen können. Ich möchte auch, dass sie die normale Knotenreferenz verwenden können, um einen Schüler auszuwählen, der zufällig bereits existiert.

Im Idealfall möchte ich, dass all dies von einer einzigen Seite aus funktioniert und auch innerhalb der Grenzen des Drupal-Berechtigungssystems, damit ich verschiedene Rollen und Berechtigungen haben kann.

Ja, ich weiß, dass Student in diesem Fall am besten als Benutzer (und nicht als Knoten) dient, aber Klasse und Student sollen nur die Situation veranschaulichen. Das reale Szenario benötigt wirklich Knotenreferenzen.

Es gibt eine ähnliche Frage: Erstellen von referenzierten Knoten zusammen mit dem übergeordneten Knoten , aber ich bin speziell nur an Drupal 7-Lösungen interessiert.

BEARBEITEN:

Nicht nur nach vorhandenen Modulen suchen, sondern auch nach benutzerdefiniertem Code suchen.

mpdonadio
quelle
In Drupal 7 habe ich einen benutzerdefinierten Code geschrieben, um dies für meine Websites zu tun, einfach weil es noch keine modulbasierten Lösungen gibt, an die ich denken kann. Sie können sogar ein Formular zum Erstellen des Schülerknotens in ein ctools-Modal werfen und dann die nid mithilfe von ajax_command_data () oder einer anderen Ajax-Datenübergabefunktion an das ursprüngliche Knotenformular zurückgeben.
Geerlingguy
@geerlingguy, wenn Sie dies als Antwort aufschreiben (insbesondere einen Vorsprung für das AJAX-Modul nid passback), wird dies ernsthaft als Antwort betrachtet.
mpdonadio
Wird in ein wenig tun.
Geerlingguy

Antworten:

4

Ich verwende das Dialogfeld "Referenzen", in dem vorhandene Referenzfelder mit einem kleinen "+" versehen werden, damit der Benutzer einen neuen Schüler direkt aus dem Bearbeitungsformular für Klassenknoten erstellen kann .

Letharion
quelle
Hat jemand dieses Modul benutzt? Ich würde gerne Feedback zu den Alpha-Versionen hören.
David John Smith
Zu Ihrer Information Ich habe gerade dieses Modul installiert und es scheint perfekt zu passen.
David John Smith
8

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.

geerlingguy
quelle
2

Folgende Module können in Drupal 7 verwendet werden:

  1. https://drupal.org/project/noderefcreate
  2. https://drupal.org/project/nodeconnect
  3. https://drupal.org/project/entityconnect
  4. https://drupal.org/project/inline_entity_form

Noderefcreate erstellt einen neuen Knoten nur, wenn er nicht vorhanden ist. Verwenden Sie dazu den Assistenten für die automatische Vervollständigung. Nodeconnect und Entityconnect bieten eine Schaltfläche zum Hinzufügen / Bearbeiten an der Knotenreferenz, wenn der Assistent für die automatische Vervollständigung verwendet wird. Nodeconnect stellt es nur als Knotenreferenz bereit, während Entityconnect es als Knotenreferenz, Entitätsreferenz, Termreferenz und Benutzerreferenz bereitstellt.

Inline_entity_form bietet zwei zusätzliche Widgets als Entitätsreferenz (nur).

Sumanchalki
quelle
0

Wenn dies dem Schulszenario wirklich ähnlich ist und Ihre Schüler mehreren Klassen beitreten können, würde ich Folgendes verwenden:

  • 3 Inhaltstypen: Schüler (* -1) Anwesenheit (1- *) Klasse
  • Formularblock zur direkten Eingabe von Schülerdaten in einen Block;
  • Blick Feld eine Ansicht mit einer Liste von Studenten angezeigt werden eine Klasse besuchen;

Dies würde auch die Verwendung von Token erfordern , das Filtern der Ansicht in Abhängigkeit von der Klassen-ID und das Einrichten eines Standardwerts für das Referenzfeld des Anwesenheitsknotens als aktuelle Klassen-ID.

Schließlich können Sie Ihren Student-Inhaltstyp dem Benutzer mit einer Benutzerreferenz zuordnen.

Refineo
quelle
Meine Inhaltstypen sind bereits vorhanden und die Website funktioniert. Das Hinzufügen eines Zwischentyps würde viel Nacharbeit erfordern.
mpdonadio