[Résolu] ajouter un formulaire à tout les type de contenu

Information importante

En raison d'un grand nombre d'inscriptions de spammers sur notre site, polluant sans relache notre forum, nous suspendons la création de compte via le formulaire de "sign up".

Il est néanmoins toujours possible de devenir adhérent•e en faisant la demande sur cette page, rubrique "Inscription" : https://www.drupal.fr/contact


De plus, le forum est désormais "interdit en écriture". Il n'est plus autorisé d'y écrire un sujet/billet/commentaire.

Pour contacter la communauté, merci de rejoindre le slack "drupalfrance".

Si vous voulez contacter le bureau de l'association, utilisez le formulaire disponible ici, ou envoyez-nous un DM sur twitter.

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.

Forum : 
Version de Drupal : 

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 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.

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.

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ù 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 fonction hook_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 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 valeurs sélectionnées viennent de variable_get(‘formulaireSelectionnes’, array(‘page’)) et dans le deuxième de variable_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 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 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() 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 :

<?php
print variable_get('toto', 89);
?>

tu récupères et affiches la variable toto qui vaudra 89 si elle n'a pas encore été explicitement définie (avec variable_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 avec variable_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 avec variable_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. 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 ?

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 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 variable pataglou_node_types vaudra :

array('titi')

Si tu coches le type de contenu titi ET le type de contenu toto, 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 :

<?php
// Est-ce que $$tableau1 contient la chaîne 'toto' ?
$tableau1 = array('titi');
in_array('toto', $tableau1);  // Renvoie FALSE
// Est-ce que $tableau2 contient la chaîne 'toto' ?
$tableau2 = array('titi', 'toto');
in_array('toto', $tableau2);  // Renvoie TRUE
?>

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.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 ?