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.
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.
Antworten:
Sie können verwenden:
module_load_include('inc', 'node', 'node.pages');
$form = node_add('nodetype');
print drupal_render($form);
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 )
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_add
Funktion zu verwenden, habe ich den Code kopiert und den entfernt drupal_set_title
. Der obige Code ist derselbe Code wie die node_add
Funktion, 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';
}
function YOURMODULE_form_NODETYPE_node_form_alter(&$form, &$form_state) { form_load_include($form_state, 'inc', 'node', 'node.pages'); }
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 return
Folgendes herausgegeben $form
:
module_load_include('inc', 'node', 'node.pages');
$form = node_add('program_registration');
return $form;