[Résolu] Requête SQL sur les valeurs d'une soumission Webform

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 à tous,

J’ai besoin d’aide pour réaliser une boucle sur une requête.

Je vous explique m’a problématique, je possède un formulaire Webform de satisfaction dans lequel je pose tout un tas de questions à un utilisateur anonyme, dont les champs :
• Nom
• Prénom
• Note
• Commentaire

Je sais que les informations du Webform sont enregistrés dans la table « webform_submitted_data » (j’ai mis en PJ la structure de la table et une extraction d’exemples).

Dans mon cas, le « nid » du Webform est 47, et les « cid » des réponses à récupérer sont 11, 12, 7 et 10. Et chaque soumission est indiquée par le champ « sid ».

Mon but est de créer un module qui affichera dans un bloc ces 4 éléments pour toutes les soumissions du formulaire, afin de faire un genre de livre d’or.

Voici les requêtes SQL que je vais utiliser pour récupérer mes 4 champs :

   // Nom
   $query_nom = 'SELECT data FROM webform_submitted_data WHERE nid=47 AND sid=26 AND cid=11';
   $resultat_nom = db_query($query_nom);
   $sid_webform_nom = $resultat_nom->fetchField();
   echo "Nom : ";
   echo $sid_webform_nom;

   // Prénom
   $query_prenom = 'SELECT data FROM webform_submitted_data WHERE nid=47 AND sid=26 AND cid=12';
   $resultat_prenom = db_query($query_prenom);
   $sid_webform_prenom = $resultat_prenom->fetchField();
   echo " - Prenom : ";
   echo $sid_webform_prenom;

   // Note
   $query_note = 'SELECT data FROM webform_submitted_data WHERE nid=47 AND sid=26 AND cid=7';
   $resultat_note = db_query($query_note);
   $sid_webform_note = $resultat_note->fetchField();
   echo "<br>";
   echo "Note : ";
   echo $sid_webform_note;

   // Avis
   $query_avis = 'SELECT data FROM webform_submitted_data WHERE nid=47 AND sid=26 AND cid=10';
   $resultat_avis = db_query($query_avis);
   $sid_webform_avis = $resultat_avis->fetchField();
   echo "<br>";
   echo "Avis : ";
   echo $sid_webform_avis;

J'ai besoin de votre aide pour récupérer dans une variable les toutes valeurs du champ « sid » correspondant au « nid=47 » dans ma table « webform_submitted_data », et faire une boucle avec.

Merci pour votre aide que vous pourrez l’apporter.

A bientôt.

misterg94

Forum : 
Version de Drupal : 

J'ai réussi à trouver :

/* récupérer les valeurs sid pour la boucle */
$query_liste_sid = 'SELECT DISTINCT sid FROM webform_submitted_data WHERE nid=47';
$resultat_liste_sid = db_query($query_liste_sid);
$nb_sid = count($resultat_liste_sid->fetchAll()); //affiche 4

echo $nb_sid;

Par contre maintenant j'essaie d'afficher toutes les valeurs de sid, mais cela ne fonctionne pas, je ne dois pas avoir la bonne méthode :

for($i=0;i<$nb_sid;$i++)
   {
      echo $resultat_liste_sid[i];
   }

Merci pour votre aide.

Salut misterg94,

J'ai l'impression que tu te prends sacrément la tête pour un truc tout bête (peut-être que je me trompe et qu'il y a plus de contraintes que je ne l'imagine). Mais si ton but est bien de faire une sorte de livre d'or, à priori tu n'as pas besoin de webform, mais juste de Views.

Voila comment je procède pour créer ce genre de systèmes :

  • Créer un type de contenu, exemple : "Message du livre d'or". Y ajouter les champs déir
  • Donner les drois d'écriture et de publication de ce type de contenu accessible aux utilisateurs Anonymes (penser à mettre les champs en texte plein afin d'éviter des problèmes qui seraient causés par des personnes mal intentionnées).
  • Créer une vue "Livre d'or" qui viendrait charger l'ensemble des contenus publiés de type "Message du livre d'or" et les afficherais dans une page ou un block.

En espérant avoir aidé, sinon tampis et bon courage :)

Salut Qazema,

Merci pour ta réponse, le problème c'est que j'ai essayé d'utilisé Views, mais je me suis cassé les dents dessus. En effet j'ai réussi à faire une Views qui affiche mes Webform vierge (le formulaire), et non pas ce qu'ont soumis mes utilisateurs anonymes.

En fait je bloque sur un truc trop con.

J'exécute une requête et je récupère le résultat dans ma variable "$resultat_liste_sid". Après syntaxiquement, je ne sais pas comment utiliser cette variable.

J'ai vu qu'il fallait faire ce bout de code, pour transformer mes résultat en tableau :
$resultat_liste_sid=$resultat_liste_sid->fetchAll();

Lorsque je compte le nombre d'éléments, j'ai bien le bon nombre
$nb_sid = count($resultat_liste_sid); //affiche 4

Mon problème ce que je ne sais pas afficher cette liste présente dans la variable $resultat_liste_sid.

misterg94

Alors sois tu n'as pas lu mon précédent message en entier, soit tu n'as pas encore bien compris le concept de vue et de webform sur Drupal.

Tu n'as pas besoin de charger des webform avec View. Dans mon post je t'explique comment faire un livre d'or sans avoir à recourir un seul instant à Webform et sans avoir à coder de quelconques requêtes SQL pour quelque chose d'aussi basique.

Je t'invites donc à relire mon précédent post, et si vraiment tu ne comprends pas / n'y arrive pas je ferais éventuellement un tuto plus précis avec un step by step.

En fait j'utilise déjà webform pour faire mon enquête de satisfaction (avec mailing vers l'utilisateur anonyme et les propriétaires du site). Et c'est dans ce formulaire que l'utilisateur renseigne les 4 champs pour mon livre d'or (comme ça il a une unique page à remplir).

C'est bon j'ai réussi à trouver la syntaxe pour afficher mes requête

$query = 'SELECT DISTINCT sid FROM webform_submitted_data WHERE nid=47';
$result = db_query($query);

foreach ($result as $key=>$val)
   {
      /* Nom */
      $query_nom = 'SELECT data FROM webform_submitted_data WHERE nid=47 AND sid='.$val->sid.' AND cid=11';
       $resultat_nom = db_query($query_nom);
      $sid_webform_nom = $resultat_nom->fetchField();
     $sid_webform_nom_maj = strtoupper($sid_webform_nom);
   }

Sinon Qazema, j'avais pensé à créer un contenu, pour cela je suis allé dans "Accueil->Administration->Structure" et j'ai créé le contenu "Message satisfaction" avec les paramètre suivant :
- Paramètres du formulaire de contribution : Libellé du champ titre -> désactivé
- Options de publication -> Non publié
- Paramètres d'affichage -> Ne pas afficher les informations de la contribution
- Paramètres du menu -> tout est décoché

A ce contenu j'ai créé mes 4 champs (par contre je ne vois pas où tu mets les champs en texte plein).

Ensuite, dans "Personnes->Droits" j'avais coché pour "Message satisfaction : Créer un nouveau contenu" pour la case "UTILISATEUR ANONYME".

Après j'avais bloqué, car je ne vois pas comment l'utilisateur peut créer ce nouveau contenu sans être connecté.

Et après je t'avoue que dans views je n'ai pas trouvé comment afficher la liste de ces message sans le "title" et sans la notion de "utilisateur anonyme".

bref à l'occasion je veux bien que tu m'explique aussi cette partie pour ma culture personnel, car cela pourrait me servir plus tard.

Merci encore.

misterg94

Salut Misterg94,

Content que tu es réussi à faire ce que tu souhaitais ! En effet je n'avais pas noté le besoin de l'enquête de satisfaction.

Ci dessous mes réponses à tes différentes interrogations.

Pour les champs en texte plein, ça se passe dans l'admin : configuration > formats de textes
Dans les paramètres des formats filtered et full HTML tu décoches "Utilisateurs anonymes", il ne leur resteras plus que texte plein d'autorisé.

Second point, pour que l'utilisateur anonyme puisse publier, tu avais suivi les bonne étapes. Ensuite, il suffit à l'anonyme de se rendre à l'URL : www.tonsite.com/node/add/nom_machine_de_ton_type_de_contenu
Ce qui aurait donné (j'imagine) dans ton cas www.tonsite.com/node/add/message_satisfaction

Troisième point, dans views, il te faut charger les champs d'un type de contenu et non pas le contenu intégral. Ainsi, tu peux afficher ou retirer les champs qui ne t'intéressent pas (le titre dans ton cas). Je te conseille de regarder ces deux tutos vidéos en français qui t'apprendront à te servir de View (qui est quand même LE module de Drupal à connaitre ;) ) :
https://www.youtube.com/watch?v=qrmwyRr7gZw
https://www.youtube.com/watch?v=443h9UgXZYA

Bonne continuation avec Drupal.

Tu peux toujours modifier le label du titre par nom ou prénom.

Pour le reste j'imagine que tu peux toujours overrider le tpl en question, il te suffit juste de trouver où il est pour le surcharger via ton thème.