Incorporare un modulo di "aggiunta nodo" in una pagina


19

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.


1
Se si verificano problemi specifici con il blocco moduli, il posto migliore in cui cercare è la coda dei problemi per quel modulo.
Jeremy French,

Risposte:


28

Puoi usare:

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

3
Se ricevi un errore 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 )
mbrakken

C'è un modo per metterlo in un blocco? O questo deve essere incluso nel file tpl.php?

Non riesco a utilizzare il codice per il modulo con elementi Ajax (ad esempio: caricamento di file). Possibile soluzione
Dimetry

@Dimetry vedi la mia risposta per l'utilizzo di elementi Ajax in un modulo di nodo incorporato.
Елин Й.

16

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_addfunzione, ho copiato il codice e rimosso il drupal_set_title. Il codice sopra è lo stesso codice della node_addfunzione, 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';
}

Inline Entityform sarebbe un'alternativa? Ho giocato con il modulo ma non sono stato in grado di visualizzare un modulo di aggiunta nodo sul front-end, solo quando si modifica un nodo è possibile fornire un campo di riferimento entità che visualizza un modulo di aggiunta nodo.
AlxVallejo,

1
Entityform Inline è per i campi di riferimento dell'entità, il che è irrilevante per questa domanda.
Елин Й.

1
Se non si desidera utilizzare hook_menu_alter () per i caricamenti di file, ecc., È possibile invece aggiungere l'inclusione in una modifica del modulo per il modulo del nodo: function YOURMODULE_form_NODETYPE_node_form_alter(&$form, &$form_state) { form_load_include($form_state, 'inc', 'node', 'node.pages'); }
joe_flash

@ ЕлинЙ. La tua risposta si applica a questa domanda ?
Umair,

1
@Umair La mia risposta riguarda solo l'aggiunta di un modulo nodo a una pagina. Non invierebbe il modulo tramite AJAX né aggiornerebbe la vista. Tuttavia, puoi ottenerli utilizzando AJAX Framework .
Елин Й.

0

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 returned $form:

module_load_include('inc', 'node', 'node.pages');
$form = node_add('program_registration');
return $form;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.