Betten Sie ein Formular zum Hinzufügen von Knoten in eine Seite ein

19

Ich suche nach einer Möglichkeit, ein Formular zum Hinzufügen eines Knotens in eine Zielseite einzubetten. Ich habe Form Block verwendet , aber es scheint viele Fehler zu bringen, da ich eine Entwicklungs-Snapshot-Version verwendet habe.

ousneo
quelle
1
Wenn Sie bestimmte Probleme mit dem Formularblock haben, ist die Problemwarteschlange für dieses Modul möglicherweise der beste Ort, an dem Sie suchen können.
Jeremy French

Antworten:

28

Sie können verwenden:

module_load_include('inc', 'node', 'node.pages');
$form = node_add('nodetype');
print drupal_render($form);
Daniel Wehner
quelle
3
Wenn Sie eine node_add()undefinierte Fehlermeldung erhalten, sollten Sie diese if (!function_exists('node_add')) { module_load_include('inc', 'node', 'node.pages'); }am Anfang hinzufügen . Diese Informationen stammen von hier: ( kahthong.com/2012/01/embed-drupal-node-form-anywhere )
mbrakken
Gibt es eine Möglichkeit, dies in einen Block zu setzen? Oder muss dies in der tpl.php-Datei enthalten sein?
Ich kann den Code für Formulare mit Ajax-Elementen nicht verwenden (zum Beispiel: Datei-Upload). Mögliche Lösung
Dimetry
@Dimetry siehe meine Antwort für die Verwendung von Ajax-Elementen in einem eingebetteten Knotenformular .
Елин Й.
16

Obwohl die Antwort von Daniel Wehner absolut richtig ist und funktioniert, wollte ich zwei häufige Probleme hinzufügen, mit denen ich bei diesem Ansatz konfrontiert war, sowie Problemumgehungen, wie ich diese Probleme bewältige. Erst mein Code, dann die Erklärungen:

global $user;
module_load_include('inc', 'node', 'node.pages');
$node = (object) array(
  'uid' => $user->uid,
  'name' => (isset($user->name) ? $user->name : ''),
  'type' => 'YOUR_NODE_TYPE',
  'language' => LANGUAGE_NONE,
);
$form = drupal_get_form('YOUR_NODE_TYPE . '_node_form', $node);

print drupal_render($form)

Warum habe ich das so gemacht, anstatt Daniels einfach node_add?

Problem 1: Die node_add()Funktion ändert den Seitentitel in "Knotentyp erstellen" . Dies ist in der Funktion fest codiert.

Problemumgehung 1: Anstatt die node_addFunktion zu verwenden, habe ich den Code kopiert und den entfernt drupal_set_title. Der obige Code ist derselbe Code wie die node_addFunktion, mit Ausnahme dieser einen Zeile.

Problem 2: In der eingebetteten Form funktionierten einige Ajax-Funktionen nicht. Wenn Sie zum Beispiel ein Feld haben, das unbegrenzte Werte haben kann, so dass Sie eine Schaltfläche "Anderes Element hinzufügen" haben, oder wenn Sie ein Upload-Dateifeld in Ihrem Formular haben, funktionieren diese nicht.

Problemumgehung 2: Implementieren Sie in Ihrem benutzerdefinierten Modul hook_menu_alter()für Ajax-Aufrufpfade und schließen Sie ein node.pages.inc.

function YOURMODULE_menu_alter(&$items) {
  $items['file/ajax']['file path'] = drupal_get_path('module', 'node');
  $items['file/ajax']['file'] = 'node.pages.inc';
  $items['system/ajax']['file path'] = drupal_get_path('module', 'node');
  $items['system/ajax']['file'] = 'node.pages.inc';
}
Елин Й.
quelle
Wäre Inline Entityform eine Alternative? Ich habe mit dem Modul herumgespielt, konnte aber kein Formular zum Hinzufügen von Knoten im Front-End anzeigen. Nur wenn Sie einen Knoten bearbeiten, können Sie ein Entitätsreferenzfeld bereitstellen, in dem ein Formular zum Hinzufügen von Knoten angezeigt wird.
AlxVallejo
1
Inline Entityform ist für Entitätsreferenzfelder vorgesehen, was für diese Frage irrelevant ist.
Елин Й.
1
Wenn Sie hook_menu_alter () nicht für Dateiuploads usw. verwenden möchten, können Sie stattdessen das Include in eine Formularänderung für das function YOURMODULE_form_NODETYPE_node_form_alter(&$form, &$form_state) { form_load_include($form_state, 'inc', 'node', 'node.pages'); }
Knotenformular einfügen
@ ЕлинЙ. Trifft Ihre Antwort auf diese Frage zu ?
Umair
1
@Umair Bei meiner Antwort geht es nur darum, einer Seite ein Knotenformular hinzuzufügen. Es würde weder das Formular über AJAX senden noch die Ansicht aktualisieren. Sie können diese jedoch mit AJAX Framework erreichen .
Елин Й.
0

Wenn ich den akzeptierten Antwortcode verwende ...

module_load_include('inc', 'node', 'node.pages');
$form = node_add('nodetype');
print drupal_render($form);

... innerhalb einer Seitenrückruffunktion führt print drupal_render..dies zu einer völlig unmotivierten (kaputt aussehenden) Seite.

Also habe ich stattdessen einfach returnFolgendes herausgegeben $form:

module_load_include('inc', 'node', 'node.pages');
$form = node_add('program_registration');
return $form;
alec
quelle