Tout le problème est le suivant:
Disons que nous avons des articles, les articles peuvent avoir des offres, les articles peuvent avoir des questions et la question peut avoir une réponse.
Lorsqu'un élément est affiché, tout le contenu associé à cet élément doit également être affiché. De plus, selon les rôles, certains formulaires pour faire des offres, poser des questions et relire les réponses doivent être affichés.
Comment y parvenir? Dois-je avoir un type de nœud distinct pour chaque type? Ou dois-je traiter certains sous-types comme les Questions et réponses comme des commentaires? Dois-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.
Pour obtenir un formulaire de modification de nœud, vous devez inclure node.pages.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 nœud possède un widget de téléchargement de fichier, 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);
Le module Form Block est le moyen le plus simple d'incorporer un formulaire de nœud 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 associés.
Bien que le module de commentaires Drupal 7 soit construit sur des champs, il n'est vraiment pas assez flexible pour des choses qui ne ressemblent pas à des commentaires. Si vous voulez que votre sous-type ait un titre et un corps, alors les commentaires sont probablement Si vous ne voulez que des champs personnalisés, un nœud est le chemin à parcourir et éventuellement en utilisant quelque chose comme Nodetitles automatiques .
Mise à jour pour 2014: si l'ajout d'un bloc sans codage est préféré par quiconque, vous voudrez peut-être consulter le module Advanced Form Block , qui ajoute quelques fonctionnalités à vos blocs standard (vous pouvez en ajouter autant que vous le souhaitez) , faites-les tous envoyer via AJAX et même sélectionnez 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 bien: des blocs de forme et peut-être des titres automatiques. Je pense que vous pouvez développer cela avec Nodereference URL Widget - en utilisant des références nodales plutôt que des commentaires, et en laissant ce module faire le travail de garder les nœuds enfants connectés à leur parent.
Dans Drupal 7, le nœud vide doit être créé en tant qu'objet (pas un tableau).
$node->uid = $user->uid;
$node->name = (isset($user->name) ? $user->name : '');
$node->type = $node_type;
$node->language = '';
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;
}
Pour que l'exemple de dobeerman (la réponse acceptée) fonctionne dans d7, ajoutez 'language' => LANGUAGE_NONE et transtypez 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 reproduis la solution qui a fonctionné pour moi sur mon cas. il est disponible comme réponse sur Drupal.org et il 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 copie-colle ci-dessous:
dans votre rappel personnalisé OR dans un hook_form_alter, appelez soit ...
<?php
form_load_include($form_state, 'inc', 'node', 'node.pages');
?>
...OU...
<?php
form_load_include($form_state, 'inc', 'user', 'user.pages');
?>
... selon que le noyau Drupal le formulaire que vous chargez est un formulaire de nœud ou un formulaire d'utilisateur.