Intégrer un formulaire «ajout de nœud» dans une page

19

Je cherche un moyen d'incorporer un formulaire "node add" sur une page de destination. J'utilisais le bloc de formulaire , mais il semble apporter de nombreuses erreurs car j'utilisais une version de capture instantanée de développement.

ousneo
la source
1
Si vous rencontrez des problèmes spécifiques avec le bloc de formulaire, le meilleur endroit à rechercher peut être la file d'attente des problèmes pour ce module.
Jeremy French

Réponses:

28

Vous pouvez utiliser:

module_load_include('inc', 'node', 'node.pages');
$form = node_add('nodetype');
print drupal_render($form);
Daniel Wehner
la source
3
Si vous obtenez une erreur qui node_add()n'est pas définie, vous voudrez l'ajouter if (!function_exists('node_add')) { module_load_include('inc', 'node', 'node.pages'); }au début. Cette information vient d'ici: ( kahthong.com/2012/01/embed-drupal-node-form-anywhere )
mbrakken
Y a-t-il un moyen de mettre cela dans un bloc? Ou cela doit-il être inclus dans le fichier tpl.php?
Je ne peux pas utiliser le code du formulaire avec des éléments Ajax (par exemple: téléchargement de fichier). Solution possible
Dimetry
@Dimetry voir ma réponse pour utiliser des éléments Ajax dans une forme de nœud intégré.
Елин Й.
16

Bien que la réponse de Daniel Wehner soit absolument correcte et fonctionne, je voulais ajouter deux problèmes courants rencontrés avec cette approche et des solutions de contournement pour surmonter ces problèmes. D'abord mon code, puis les explications:

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)

Pourquoi je l'ai fait de cette façon, au lieu du simple de Daniel node_add?

Problème 1: la node_add()fonction change le titre de la page en Créer un «type de nœud» , c'est codé en dur dans la fonction.

Solution de contournement 1: au lieu d'utiliser la node_addfonction, j'ai copié le code et supprimé le drupal_set_title. Le code ci-dessus est le même code que la node_addfonction, sauf à partir de cette seule ligne.

Problème 2: Dans le formulaire intégré, certaines fonctions ajax ne fonctionnaient pas. Par exemple, si vous avez un champ qui peut avoir des valeurs illimitées, de sorte que vous avez un bouton «Ajouter un autre élément», ou si vous avez un champ de téléchargement de fichier dans votre formulaire, ils ne fonctionnent pas.

Solution de contournement 2: dans votre module personnalisé, implémentez hook_menu_alter()pour les chemins d'appel ajax et incluez 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';
}
Елин Й.
la source
Inline Entityform serait-il une alternative? J'ai joué avec le module, mais je n'ai pas pu afficher un formulaire d'ajout de nœud sur le front-end, ce n'est que lorsque vous modifiez un nœud que vous pouvez fournir un champ de référence d'entité qui affiche un formulaire d'ajout de nœud.
AlxVallejo
1
Inline Entityform est pour les champs de référence d'entité, ce qui n'est pas pertinent pour cette question.
Елин Й.
1
Si vous ne voulez pas utiliser hook_menu_alter () pour les téléchargements de fichiers, etc., vous pouvez ajouter à la place l'inclusion dans un formulaire pour le formulaire de noeud: function YOURMODULE_form_NODETYPE_node_form_alter(&$form, &$form_state) { form_load_include($form_state, 'inc', 'node', 'node.pages'); }
joe_flash
@ ЕлинЙ. Votre réponse s'applique-t-elle à cette question ?
Umair
1
@Umair Ma réponse consiste uniquement à ajouter un formulaire de nœud à une page. Il ne soumettrait ni le formulaire via AJAX ni ne mettrait à jour la vue. Cependant, vous pouvez atteindre ceux utilisant AJAX Framework .
Елин Й.
0

Si j'utilise le code de réponse accepté ...

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

... à l'intérieur d'une fonction de rappel de page, print drupal_render..cela se traduit par une page complètement sans thème (d'aspect cassé).

Au lieu de cela, je viens returnde rédiger le $form:

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