Submitted by Rage on
Bonjour,
je travaille actuellement sur un site type annuaire sur lequel les utilisateurs peuvent laisser des notes (évaluations) sur des fiches.
Ma config: Drupal 7.7, views-7.x-3.0-rc1, votingapi-7.x-2.4, fivestar-7.x-2.x-dev notamment
Dans un premier temps j'ai créer un type de contenu Avis rattaché à mon node principal et qui permet aux utilisateurs de laisser des avis avec des notes d'appréciations (via des champs CCK de type entier).
Jusque là tout va bien, j'arrive à stoker ces données et à les restituées par une vue contextualisée (pour afficher les notes relatives au node/à la fiche consulté).
Or je souhaiterai pourvoir présenter des informations agrégées sur ces votes: moyenne pour chaque note, nombre de vote, ... là aussi bien évidemment contextualisé
Normalement, le module view dans sa version 3 pour drupal 7 permet cette chose
Le hic, c'est que je n'y arrive pas
Il doit y avoir quelque chose qui m’échappe.
J'applique bien un contextal filter de la même manière que sur mes vues simples (sans agrégation).
Je mets "use aggregation" à oui ... peut être pas avec le bon paramètre (j'avoue ne pas bien comprendre ce qui est demandé)
je sélectione le champ que je veux agréger et là aussi j'ai des problèmes avec les paramètres
Si quelqu'un a déjà mis en oeuvre cette solution et peut m'expliquer ...?
Question complémentaire:
A force de chercher sur ce sujet j'ai découvert le module fivestar (qui permet la notation avec l'utilisation d'un widget graphique assez sympa).
Le problème c'est qu'il ne règle pas ma question de moyenne ...
Merci de votre aide
Les fonctions d’agrégation de
Permalien Soumis par Numerizen le 29 Août, 2011 - 17:35
Les fonctions d'agrégation de Views 3 permettent d'influer sur la clause GROUP BY des requêtes SQL que Views exécute.
Donc, pour chaque champ de la requête, il faut choisir la fonction à appliquer. Par exemple, ce sera Average pour le champ note, et "Group results together" pour les autres.
Mais bien sûr cela dépend du contexte d'exécution de la vue et de ce qu'il y d'autre à afficher sur la page.
Une autre approche serait d'utiliser du code dans preprocess_node, de requêter les infos dont tu as besoin pour faire les calculs et de les afficher dans une variable maison. C'est moins beau qu'une vue qui fonctionne bien, mais ça peut simplifier les choses.
Merci pour ces
Permalien Soumis par Rage le 30 Août, 2011 - 10:57
Merci pour ces propositions
effectivement mon objectif est plutôt de bien faire fonctionner le module views que de faire du code (surtout que je ne suis pas très bon).
en fait je cherche à avoir un mode d'emploi ou tuto me permettant de bien savoir ce qu'il faut faire.
J'ai beaucoup appris à l'aide de tuto mais là j'en trouve pas qui explique bien comment faire.
Et pourtant ça semble assez trivial comme résultat attendu, faire une vue qui affiche la moyenne du champ "note" du type de contenu "avis" lié par une node reference au type de contenu "fiche".
Je créé donc une vue block avec:
* filtre: contenu de type 'avis' et 'publié'
* contextual filter: nore reference de ma fiche qui apparait dans 'avis' avec un 'provide default value' de type 'Content ID from URL'
(nb sur ce point j'ai pas trop d'inquiétude puisque je l'utilise dans une vue détail qui affiche la liste des avis et des notes, c'est à dire vue non agrégée)
et là je veux faire mon agregation, c'est à dire que je veux faire la moyenne du champ note pour tous les avis sur une fiche
là j'obtiens des aggregation settings pour pas mal de paramétrage de la vue
globalement il faut que j'arrive à dire: appliquer la fonction 'average' au champs 'note' et dire que la rupture s'effectue sur le node reference (le group by)
jusque là ça semble cohérent
ensuite je choisi la group column 'value' pour dire d'appliquer la fonction average sur la colonne value du champ note (là aussi cela me semble cohérent.
si je m’arrête là, j'obtiens un résultat pas satisfaisant puisqu'il affiche rien à coté du label de ma requête de moyenne.
j'ai vérifié et la colonne value du champ note est en int(11) donc normalement la fonction average devrait bien s'appliquer (j'espère)
reste le group by, je sais pas s'il est fait ou pas
est que quelqu'un sait comment afficher la requete sql générée par views?
j’ai trouvé comment afficher
Permalien Soumis par Rage le 30 Août, 2011 - 12:28
j'ai trouvé comment afficher la requête sql exécutée:
dans structure/views , aller dans l'onglet paramètres (au lieu de la liste des vues) et il y a un paramètre permettant d'afficher le sql lors de la preview
bon, ça me permet de voir un peu ce qui est fait, mais j'ai toujours pas de solution pour mon agrégation
si quelqu'un sait faire ....
TROUVE ! enfin presque …
Permalien Soumis par Rage le 30 Août, 2011 - 15:18
TROUVE!
enfin presque ... ;)
j'arrive maintenant à faire une requête agrégée avec views 3!
je peux maintenant afficher ma moyenne!
SOLUTION: je suis passé de la version views-7.x-3.0-rc1 à la version de dev views-7.x-3.x-dev dans laquelle il semble qu'un sertain nombre de bugs soient fixés.
reste plus qu'à voir comment implémenter le widget fivestar pour afficher le résultat
RESOLU bon, ben ce fut simple
Permalien Soumis par Rage le 30 Août, 2011 - 15:30
RESOLU
bon, ben ce fut simple pour le fivestar.
lorsqu'on applique la fonction average à un champ défini comme rating, le widget d'affichage fivestar est disponible dans le paramétrage du champ dans la vue
donc finger in the nose
Au fait complément de solution concernant l’agrégation, le group by se code dans les critères de tri (sort criteria)
Ah oui, c’est souvent le cas
Permalien Soumis par Numerizen le 30 Août, 2011 - 17:03
Ah oui, c'est souvent le cas avec Views : si la dernière stable semble ne pas fonctionner comme annoncé, il faut upgrader en dev et faire suivre Ctools en dev aussi.