web-dev-qa-db-fra.com

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

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

18
ousneo

Vous pouvez utiliser:

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

Bien que Daniel Wehner réponse soit tout à fait correct 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: node_add() la fonction change le titre de la page en Créer un 'type de nœud' , c'est difficile codé dans la fonction.

Solution 1: au lieu d'utiliser la fonction node_add, J'ai copié le code et supprimé le drupal_set_title. Le code ci-dessus est le même code que la fonction node_add, À l'exception 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';
}
16
Елин Й.

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, puis print drupal_render.. cela se traduit par une page complètement sans thème (à l'aspect cassé).

Au lieu de cela, je viens de return 'éditer le $form:

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