2009-11-05 3 views
5

Ich möchte ein Eingabeformular für registrierte Benutzer, getrennt von Admin Inhaltserstellungsformular erstellen. Jede Einreichung erstellt mehrere Knoten. Um den Fall zu veranschaulichen, verwende ich den Inhaltstyp Projekt und Review.Drupal Custom Node Formular

Projekt: Titel, Beschreibung, Besitzer, Rating.

Bewertung: Titel, Bewerter, Projekt, Schwierigkeit

Ich habe Setup die Inhaltstypen zusammen mit ihren Feldern CCK-Modulen. Ich möchte ein Eingabeformular erstellen, das für registrierte Mitglieder (Nicht-Admin) angezeigt werden soll. Sein Gebiet umfasst Projektnamen, Beschreibung, Besitzer, Bewertung, Bewertung, Schwierigkeit.

Wenn das Formular abgeschickt wird, Projektname, Beschreibung, Besitzer und Rating Wert geht in neue Projekt Knoten, wo der Rest in neue Bewertung Knoten geht.

Eine weitere Anpassung, die Ich mag würde Rating und Schwierigkeit Eingabefeld zu tun ist, für star rating input zu verwenden.

Was wäre der beste Weg, dies zu erreichen? Soll ich ein benutzerdefiniertes Modul und ein benutzerdefiniertes Formular erstellen (Kann mir jemand zeigen, wie das geht)? Oder gibt es irgendwelche Module, die ich verwenden könnte?

Dank

Antwort

8

Es gibt mehrere Möglichkeiten, dies zu tun:

  1. alles von Grund auf Sie: Das ist, was theunravelers suggestion (+1) läuft darauf hinaus, - bauen Sie das Formular selbst, Ihre eigene Validierung hinzufügen und Handler einreichen und auf Senden, erstellen Sie zwei Knotenobjekte und speichern Sie sie.Du wirst die volle Kontrolle/Flexibilität haben, aber es ist ziemlich viel Arbeit und du musst ein gutes Verständnis von Drupals Innenleben haben, um es richtig zu machen.

  2. 'Überladen' Sie einen Ihrer Inhaltstypen mit den Feldern, die von den anderen benötigt werden, und optimieren Sie die überladenen Inhaltstypen, um den anderen Inhaltstyp aus den zusätzlichen Feldern zu erstellen (und teilweise auszublenden) Sie werden auf dem 'Überladenen' angezeigt und bearbeitet. Sie können find an article describing this approach here. Dies ist ein wesentlich einfacherer Ansatz als # 1, aber ich würde es aufgrund der Definition des Inhaltstyps im Vergleich zu einer Nichtübereinstimmung der Darstellung als etwas "hackisch" betrachten.

  3. Eine weniger "hackische" Variante von # 2 wäre, Ihre Inhaltstypen normal einzurichten und den Bearbeitungs- und Übergabeprozess einfach über hook_form_alter() zu bearbeiten. Sie würden mehr oder weniger dasselbe wie bei Ansatz 2 tun, aber statt einen Knoten mit den zusätzlichen Feldern im Voraus zu überladen, würden Sie sie einfach in das Bearbeitungsformular direkt auf hook_form_alter (entweder von Grund auf neu oder durch Laden der editiere das Formular des anderen Knotens im Hintergrund und kopiere die relevanten Felddefinitionen daraus. Beim Senden von Formularen entfernen Sie diese zusätzlichen Felder, während Sie sie zum Erstellen Ihres anderen Knotens verwenden. Dies erfordert ein wenig mehr Arbeit und Wissen als # 2, sollte aber ein wenig stabiler und einfacher anzupassen/zu warten sein, da Sie sich nicht mit einer Inhaltsartdefinition im Gegensatz zu einer Display-Diskrepanz befassen müssen.

Auch Sie nicht angeben, wie Sie mit dem Bearbeiten von vorhandenen Knoten umgehen wollen - ich würde vorschlagen, eine Nodereference zu einem des Knoten hinzugefügt Spur ihrer Verbindung zu halten. Auf diese Weise können Sie auch die Logik hinzufügen, um beide Knoten aus einem Formular zu bearbeiten, sowie das Löschen auf Wunsch.

+0

Ich mag # 2 viel, aber würde vielleicht sagen, um einen dritten Inhaltstyp zu erstellen, der im Wesentlichen eine Fusion der beiden ist. Jedes Mal, wenn Sie die beiden bearbeiten möchten, bearbeiten Sie einfach die dritte und die Änderungen werden ausgegeben. Das könnte genauso einfach sein wie # 2, aber ein bisschen weniger hackisch. – theunraveler

4

Das klingt wie ein Auftrag für mich. Sie können das Formular Form API in Ihrem Modul verwenden. Sehen Sie sich so ziemlich jedes andere Modul an, um Beispiele dafür zu sehen, wie die Form-API funktioniert. Dann sollten Sie ein $ node-Objekt aus allen Werten dieser Felder erstellen und node_submit() und node_save() verwenden, um die verschiedenen Knoten tatsächlich zu erstellen.

Ich würde vorschlagen, vielleicht auf das Webform-Modul für die Verwendung der Form-API und Hijacking der Übermittlungsvorgang, um es erstellen diese beiden Knotentypen.

2

Option # 3, wobei eine der jugendlichen Lösungen beim Erstellen eines CCK-Nodeleferenzfelds verwendet wird, das auf einen nicht vorhandenen Knoten verweisen kann, und es beim Senden erstellen.

Node Reference Create sieht aus wie eines der stabileren dieser Projekte.

Node Reference Auto-create und Node Reference Field scheinen mehr Wert hinzugefügt zu haben, um Werte im neuen Knoten zu bestimmen.

Dies hat einen sekundären Vorteil beim Erstellen einer Nodereferenz zwischen den Modulen, mit denen Sie die Knoten beim Rendern integrieren, Ansichten erstellen und mehr erstellen können.