Drupal 7 - Comment afficher le formulaire node / add / sometype sur une autre page?
Tout le problème est le suivant:
Disons que nous avons des articles, des articles peuvent avoir des offres, des articles peuvent avoir des Questions et des questions peuvent avoir une réponse.
Lorsqu'un élément est affiché, tout le contenu associé à cet élément doit également être affiché. En outre, selon les rôles, certains formulaires pour faire des offres, poser des Questions et rejouer des réponses doivent être affichés.
Comment y parvenir? Devrais-je avoir un type de nœud séparé pour chaque type? Ou devrais-je traiter certains sous-types comme des Questions et Réponses comme commentaires? Devrais-je utiliser des modules bien connus pour cela?
J'utilise Drupal 7 et j'ai essayé d'écrire un module personnalisé mais je ne l'ai pas fait fonctionner correctement.
9 réponses
Pour obtenir un formulaire d'édition de nœud, vous devez inclure le nœud .page.inc .
<?php
// required for Drupal 6
module_load_include('inc', 'node', 'node.pages');
// which nodeform you want
$node_type = 'YOURNODETYPE';
$form_id = $node_type . '_node_form';
// maybe add current users info
global $user;
// create a blank node
$node = array(
'uid' => $user->uid,
'name' => (isset($user->name) ? $user->name : ''),
'type' => $node_type,
);
// Invoke hook_nodapi and hook_node
node_object_prepare($node);
// Or you can also use an exiting node, for example
// $node = node_load(123);
// and the display the form:
$output = drupal_get_form($form_id, $node);
?>
module_load_include('inc', 'node', 'node.pages');
$form = node_add('nodetype');
$output = drupal_render($form);
Si votre formulaire de noeud a un widget de téléchargement de fichiers, vous devez ajouter les lignes suivantes au tableau de menus:
'file path' => drupal_get_path('module', 'node'),
'file' => 'node.pages.inc',
// Drupal 7
// Embed node creation form on a custom page inside module.
module_load_include('inc', 'node', 'node.pages');
$form = node_add('node_machine_name');
return drupal_render($form);
Bien que le module de commentaire Drupal 7 soit construit sur des champs, il n'est vraiment pas assez flexible pour ne pas commenter comme des choses. Si vous voulez que votre sous-type ait un titre et un corps, alors les commentaires sont probablement le chemin à parcourir. Si vous ne voulez que des champs personnalisés alors un nœud est le chemin à parcourir et éventuellement en utilisant quelque chose comme Automatique Nodetitles.
Mise à jour pour 2014: si l'ajout d'un bloc sans codage est préféré par quelqu'un, vous pouvez consulter le module Advanced Form Block, qui ajoute quelques fonctionnalités à vos blocs standard (vous pouvez en ajouter autant que vous le souhaitez, les soumettre tous via AJAX et même sélectionner les champs que vous voulez). Contrairement au module Form Block, il est toujours activement maintenu pour Drupal 7.
La réponse de Thomas me semble bonne: Formblocks et peut-être nodetitles automatiques. Je pense que vous pourriez développer cela avec Nodereference URL Widget - en utilisant nodereferences plutôt que des commentaires, et en laissant ce module faire le travail de garder les nœuds enfants connectés à leur parent.
Pour que l'exemple de dobeerman (la réponse acceptée) fonctionne dans d7, ajoutez 'language' => LANGUAGE_NONE et convertissez le tableau $node dans un objet. c'est à dire:
$node = (object)array(
'uid' => $user->uid,
'name' => (isset($user->name) ? $user->name : ''),
'type' => $node_type,
'language' => LANGUAGE_NONE
);
Je reproduit la solution qui a fonctionné pour moi sur mon cas. il est disponible en réponse sur Drupal.org et cela peut aider les autres avec le même problème que je rencontrais.
La réponse est disponible ici: https://www.drupal.org/node/1336212#comment-6192404.
Je le copie-colle ci-dessous:
Dans votre rappel personnalisé ou dans un hook_form_alter, appelez l'un ou l'autre...
<?php
form_load_include($form_state, 'inc', 'node', 'node.pages');
?>
...OU...
<?php
form_load_include($form_state, 'inc', 'user', 'user.pages');
?>
...selon que le formulaire Drupal de base vous êtes le chargement est un formulaire de noeud ou un formulaire utilisateur.
Voici comment j'ai résolu le problème:
Dans mon hook_menu
$items['add-visiteur'] = array(
'title' => 'Add',
'page callback' => 'add_visiteur',
'access arguments' => array('access content'),
'type' => MENU_CALLBACK,
);
Et ma fonction de rappel
function add_visiteur() {
module_load_include('inc', 'node', 'node.pages');
// which nodeform you want
$node_type = 'visiteur';
$form_id = $node_type . '_node_form';
// maybe add current users info
global $user;
// create a blank node
$node = new stdClass;
$node->uid = $user->uid;
$node->name = (isset($user->name) ? $user->name : '');
$node->type = $node_type;
// Invoke hook_nodapi and hook_node
node_object_prepare($node);
$output = drupal_get_form($form_id, $node);
return $output;
}