Sto cercando un modo per incorporare un modulo "aggiungi nodo" in una pagina di destinazione. Stavo usando Form Block , ma sembra portare molti errori perché stavo usando una versione dello snapshot di sviluppo.
Sto cercando un modo per incorporare un modulo "aggiungi nodo" in una pagina di destinazione. Stavo usando Form Block , ma sembra portare molti errori perché stavo usando una versione dello snapshot di sviluppo.
Risposte:
Puoi usare:
module_load_include('inc', 'node', 'node.pages');
$form = node_add('nodetype');
print drupal_render($form);
node_add()
non definito, ti consigliamo di aggiungerlo if (!function_exists('node_add')) { module_load_include('inc', 'node', 'node.pages'); }
all'inizio. Questa informazione proviene da qui: ( kahthong.com/2012/01/embed-drupal-node-form-anywhere )
Sebbene la risposta di Daniel Wehner sia assolutamente corretta e funzioni, volevo aggiungere due problemi comuni che ho dovuto affrontare con questo approccio e soluzioni alternative per superare tali problemi. Prima il mio codice, poi le spiegazioni:
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)
Perché l'ho fatto in questo modo, invece che in quello di Daniel node_add
?
Problema 1: la node_add()
funzione modifica il titolo della pagina in Crea 'tipo nodo' , questo è codificato nella funzione.
Soluzione 1: invece di utilizzare la node_add
funzione, ho copiato il codice e rimosso il drupal_set_title
. Il codice sopra è lo stesso codice della node_add
funzione, ad eccezione di questa riga.
Problema 2: nella forma incorporata alcune funzioni Ajax non funzionavano. Ad esempio, se si dispone di un campo che può avere valori illimitati, in modo da disporre di un pulsante "Aggiungi un altro elemento" o se si dispone di un campo di caricamento del file nel modulo, non funzionano.
Soluzione 2: nel modulo personalizzato, implementare i hook_menu_alter()
percorsi di chiamata Ajax e includere 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'); }
Se utilizzo il codice della risposta accettata ...
module_load_include('inc', 'node', 'node.pages');
$form = node_add('nodetype');
print drupal_render($form);
... all'interno di una funzione di callback della pagina, print drupal_render..
questo si traduce in una pagina completamente senza tema (dall'aspetto rotto).
Quindi, invece, ho appena return
ed $form
:
module_load_include('inc', 'node', 'node.pages');
$form = node_add('program_registration');
return $form;