Submitted by monstres on
Bonjour,
Je cherche à ajouter un formulaire à tous les types de contenu afin qu'il apparaisse lors de chaque ajout (comme le module de commentaire par exemple).
Existe-t-il une doc en français sur les hooks, un site qui expliquerait tout points par point…
Pour ceux qui pourraient répondre avec un bout de code, très précisément j'ai créé un module qui ajoute un onglet dans le menu.
Cet onglet permet de sélectionner les types de contenu sur lequel le questionnaire doit apparaitre lors d'une création de contenu.
Puis je bloque…
J'aimerais maintenant trouver le ou les hooks permettant d'afficher mon formulaire si l'affichage est coché dans mon administration.
Merci d'avance et bonne journée.
Tu devrais utiliser le module
Permalien Soumis par Artusamak le 10 Novembre, 2010 - 17:46
Tu devrais utiliser le module webform pour créer tes questionnaires et ajouter un champ de type node référence sur les types de contenu où tu veux lier des questionnaires aux noeuds.
Hello monstres, Ta question
Permalien Soumis par drupalfrance le 11 Novembre, 2010 - 16:15
Hello monstres,
Ta question n'est pas super claire : où veux-tu afficher ton formulaire exactement ? Tu veux l'intégrer au formulaire de création du noeud (là où tu saisis le titre, le statut de publication...) ? Ou bien tu veux qu'il s'affiche sur le noeud APRÈS que celui-ci a été créé (comme le formulaire de commentaire) ?
je souhaites afficher mon
Permalien Soumis par monstres le 12 Novembre, 2010 - 10:26
je souhaites afficher mon formulaire en dessous du formulaire lors de la création d'un nœud.
Mais j'en ai un second à faire apparaitre dans le noeud.
Ce que j'ai réussi avec l'appel hook_nodeapi.
Merci.
Donc, ton problème est
Permalien Soumis par drupalfrance le 12 Novembre, 2010 - 12:55
Donc, ton problème est résolu ?
Et bien en partie
Permalien Soumis par monstres le 12 Novembre, 2010 - 13:14
Et bien en partie seulement.
J'ai pu faire apparaitre mon formulaire 2 dans le noeud lors de l'affichage classique.
Mais j'ai toujours besoin du ou des hooks qui permettent l'affichage du formulaire 1 dans le noeud lors de sa création.
Regarde du côté du
Permalien Soumis par drupalfrance le 12 Novembre, 2010 - 14:39
Regarde du côté du hook_form_alter(), il te permet d'ajouter des champs dans un formulaire existant (cela dit, il faudra coder toi-même les champs en PHP, tu ne pourras pas utiliser webform).
Oui ! C’est bien ça
Permalien Soumis par monstres le 13 Novembre, 2010 - 11:38
Oui !
C'est bien ça l'affichage d'un formulaire dans un noeud c'est le hook_nodeapi et l'affichage d'un formulaire lors de la création d'un noeud c'est hook_form_alter.
Merci bien.
Maintenant ma seconde question c'est comment afficher les formulaires seulements dans les types de contenu que j'ai coché dans la partie admin de mon module.
Je récupère un tableau des type de contenu coché en faisant :
$apparition_formulaire=variable_get('formulaireSelectionnes', array('page'));
puis je j'execute ceci :
if(in_array($node->type, $apparition_formulaire)){... code du formulaire}
mais ça n'a pas d'effet…
Mais merci bien pour la première partie de la réponse.
Ça aiderait si tu disais où
Permalien Soumis par drupalfrance le 13 Novembre, 2010 - 12:29
Ça aiderait si tu disais où tu exécutes ce code exactement (dans un module ? dans un hook ? dans un template ?...).
Si tu exécutes ton code dans un template, la variable
$node
existe, et ton code devrait fonctionner.Si tu exécutes ton code dans un
hook_form_alter()
, la variable$node
n'existe pas ! Si tu regardes la signature de la fonctionhook_form_alter()
, tu vois qu'elle ne reçoit pas de variable$node
en argument. Il faut donc aller chercher le noeud dans$form['#node']
(dans ton code, il faut donc remplacer$node->type
par$form['#node']->type
).Je fais un module pour
Permalien Soumis par monstres le 13 Novembre, 2010 - 12:44
Je fais un module pour drupal. Et j'exécute donc mon code dans le fichier .module de mon module.
J'ai un hook_menu et une fonction qui permettent d'afficher la liste des type de contenu en checkbox.
Ensuite j'ai besoin d'afficher un formulaire sur les noeuds sélectionnés lors de la création.
En traçant les variable je me suis rendu compte que $node->type était vide dans la fonction from_alter. Avec $form[#node]->type il trouve bien le type de contenu-type mais la ligne de commande suivante ne restreint pas l'affichage en fonction de mes sélections.
if(in_array($form['#node']->type, $affichage_Formulaire)){…………blabla………}
au cas ou je laisse le code le fonction d'aministration des types de contenu. Mon module se nomme pataglou.
$options = node_get_types('names');
$form['pataglou_node_types'] = array(
'#type' => 'checkboxes',
'#title' => t('Ajouter un questionnaire à ces types de contenu'),
'#options' => $options,
'#default_value' => variable_get('pataglou_node_types', array('page')),
'#description' => t('Un questionnaire s\'affichera pour ces types de contenu, permettant aux utilisateurs de les personnaliser.'),
);
Dans ton premier exemple, les
Permalien Soumis par drupalfrance le 13 Novembre, 2010 - 14:43
Dans ton premier exemple, les valeurs sélectionnées viennent de
variable_get(‘formulaireSelectionnes’, array(‘page’))
et dans le deuxième devariable_get(‘pataglou_node_types’, array(‘page’))
, il faut choisir l'un ou l'autre.Tu n'as pas le choix du nom de cette variable : elle doit s'appeler comme ton champ de formulaire (en l'occurrence :
pataglou_node_types
).Si ton code
if (in_array()) ...
ne marche pas, c'est probablement que ta variable ne contient pas la bonne valeur, essaie de l'afficher à l'écran pour voir.oui oui, je sais bien que ça
Permalien Soumis par monstres le 13 Novembre, 2010 - 15:14
oui oui, je sais bien que ça doit être la même, Dans mon premier exemple j'ai mis 'formulaireSelectionnes' dans le post, pour que tu comprennes. Mais dans mon code c'est bien le même partout.
Ce que je comprend de ton post c'est que ma démarche est bonne. Je n'obtiens pas le résultat que je cherche parcequ'il y a une erreur dans mon code mais c'est déjà l'important pour moi (que je comprenne comment ça fonctionne).
mon array :
$affichage_Formulaire=variable_get('pataglou_node_types', array('page'));
affiche
Array ( [boites_a_histoire] => boites_a_histoire [livres_papier] => livres_papier [story] => 0 [blog] => 0 [page] => 0 )
ma requete
$form['#node']->type
affiche :
page
et la comparaison avec la fonction in_array($form['#node']->type ,affichage_Formulaire)
ne sort rien… Alors qu'il y a bien l'élément "boites_a_histoire]" en commun…
d'ailleurs je me demande que signifie ',array('page') dans la commande :
variable_get('pataglou_node_types', array('page')
?
merci
J’irai même un peu plus loin
Permalien Soumis par monstres le 13 Novembre, 2010 - 15:26
J'irai même un peu plus loin en te demandant comment fonctionne le stockage de données des formulaires de drupal.
Je suis vraiment impressionné que drupal comprenne l'ajout de champs lorsqu'on rajoute des entrées à la variable $form.
Ou celui celle ci est-elle stockée par exemple ?
La fonction variable_get()
Permalien Soumis par drupalfrance le 13 Novembre, 2010 - 15:50
La fonction
variable_get()
permet de récupérer la valeur d'une variable stockée dans la base de données. Cette fonction prend deux arguments : le nom de la variable que tu veux récupérer et la valeur par défaut de cette variable au cas où elle n'existe pas (tout ça est documenté sur http://api.drupal.org/api/drupal/includes--bootstrap.inc/function/variab...).Quand tu écris :
tu récupères et affiches la variable
toto
qui vaudra 89 si elle n'a pas encore été explicitement définie (avecvariable_SET()
).Dans ton cas, c'est un peu particulier car tu utilises
variable_get()
dans un formulaire d'admin. Ces formulaires ont quasiment tous pour caractéristique d'enregistrer ce qui a été tapé dans leur champs avecvariable_set()
(chaque variable portant le même nom que le champ correspondant).Si tu ajoutes un champ à un formulaire d'admin qui a cette caractéristique, ton champ est lui aussi AUTOMATIQUEMENT enregistré avec
variable_set()
. D'où la possibilité de le récupérer plus tard avecvariable_get()
.Dans ton exemple, ta variable devrait contenir un tableau PHP (puisque potentiellement, plusieurs types de contenus peuvent avoir été cochés dans ton champ), et
array('page')
est la valeur par défaut de ton champ (c. à d. que le type de noeud "page" est coché par défaut).Un grand merci. Super clair.
Permalien Soumis par monstres le 13 Novembre, 2010 - 16:00
Un grand merci.
Super clair. Je vais aller faire un tour sur le lien que tu viens de me donner mais tout ceci me parait bien plus simple.
Si j'ai bien compris le dernier problème reste c'est concernant la fonction in_array.
J'imagine que la commande :
if(in_array($form[‘#node’]->type, $affichage_Formulaire)){…………blabla………}
Supposons que je sois sur un contenu de type 'livres_papier'
la function in_array() va rechercher l'entrée 'livres_papier' dans l'array.
Array ( [boites_a_histoire] => boites_a_histoire [livres_papier] => livres_papier [story] => 0 [blog] => 0 [page] => 0 )
Et elle va la trouver… Comme toutes les autres d'ailleurs puisqu'elles sont toutes présentes. Cochées ou non ? (vu le tableau que ça me renvoie).
Je me trompe ? ou c'est pour ça que ma ligne de commande est inefficace ?
oui ça doit être ça parce que
Permalien Soumis par monstres le 13 Novembre, 2010 - 16:07
oui ça doit être ça parce que si je met une conditionnel du type :
if($form['#node']->type=='livres_papier'){blablabla}
Mon formulaire s'affiche bien seulement dans la partie livres_papier.
bon ! je m’en suis sorti en
Permalien Soumis par monstres le 13 Novembre, 2010 - 16:41
bon ! je m'en suis sorti en faisant :
if(isset($affichage_Formulaire[$form['#node']->type]) && $affichage_Formulaire[$form['#node']->type] != '0'){… voir le formulaire blabla…}
et ça marche !
Merci bien Vincent. Je suis
Permalien Soumis par monstres le 13 Novembre, 2010 - 16:43
Merci bien Vincent.
Je suis spécialisé dans le maniement d'illustrator, photoshop, indesign, flash/flex.
Si tu as la moindre question sur un de ces points (sait-on jamais), n'hésite pas à me contacter ici.
Merci pour le temps que tu m'as accordé.
Bonne journée et bon week-end.
Je t’en prie, content d’avoir
Permalien Soumis par drupalfrance le 13 Novembre, 2010 - 17:02
Je t'en prie, content d'avoir pu t'aider.
Concernant ta question sur
in_array()
, je ne suis pas certain de l'avoir comprise, mais en gros :Si tu coches le type de contenu
titi
dans ton formulaire d'admin, ta variablepataglou_node_types
vaudra :array('titi')
Si tu coches le type de contenu
titi
ET le type de contenutoto
, elle vaudra :array('titi', 'toto')
Et ainsi de suite...
La fonction
in_array()
te permet de tester qu'une valeur existe dans un tableau PHP :Enfin, merci pour ta proposition d'aide en webdesign (un domaine où pour le coup, je ne connais rien). Tu n'as pas un portfolio de réalisations en ligne, où on peut voir ce que tu fais ?
http://www.desmonstressousmon
Permalien Soumis par monstres le 13 Novembre, 2010 - 17:17
http://www.desmonstressousmonlit.com
Pour le book du studio.
Jusqu'ici, concernant le net, je développe essentiellement des sites internet full flash qui sont propulsés par une interface web flash que j'ai créé.
Je ne veux pas me laisser enfermer dans flash avec tout ce qui se passe en ce moment (css3, html5…) et comme Drupal a un très bon module qui permet de faire passer les infos à flash je guette un peu tout ça.
Bref… et toi un book ?
OK, merci, je garde
Permalien Soumis par drupalfrance le 13 Novembre, 2010 - 17:52
OK, merci, je garde l'info.
Je n'ai pas de book, mon activité ce sont les formations sur Drupal.
Salut Vincent, nouveau
Permalien Soumis par monstres le 18 Novembre, 2010 - 15:39
Salut Vincent,
nouveau soucis…
Si tu as une idée.
http://drupalfr.org/forum/support/developpement/25763-hookformalter-enre...
Merci d'avance et bonne journée.
Salut Vincent, nouveau
Permalien Soumis par monstres le 18 Novembre, 2010 - 17:24
Salut Vincent,
nouveau soucis…
Si tu as une idée.
http://drupalfr.org/forum/support/developpement/25763-hookformalter-enre...
Merci d'avance et bonne journée.