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.

31
demandé sur Laxman13 2011-03-17 23:20:52

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);
?>
19
répondu dobeerman 2011-03-18 01:59:30
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',
33
répondu Marius Ilie 2012-07-01 09:05:47
// 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);
5
répondu Kendrick 2012-10-17 21:21:01

Le module Form Block {[2] } est le moyen le plus simple d'intégrer un formulaire de noeud sur une page. Ensuite, j'utiliserais des vues avec un affichage de bloc et un argument pour afficher une liste tabulaire de ces nœuds connexes.

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.

3
répondu Thomas4019 2014-01-17 13:42:40

Dans Drupal 7, le nœud vide doit être créé en tant qu'objet (pas en tant que tableau).

  $node->uid = $user->uid;
  $node->name = (isset($user->name) ? $user->name : '');
  $node->type = $node_type;
  $node->language = '';
2
répondu 2011-04-16 09:12:52

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.

2
répondu user721183 2011-04-22 22:11:59

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
);
1
répondu squall3d 2012-09-11 07:08:10

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.

1
répondu Marcos Buarque 2016-01-16 12:02:35

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;
}
1
répondu Adrian Cid Almaguer 2016-04-27 16:49:39