Système d'achievements/badges et statistiques

Système d'achievements/badges et statistiques - PHP - Programmation

Marsh Posté le 12-03-2019 à 18:34:35    

Salut!
 
Je suis en ce moment sur un projet de site web pour mes élèves. Un site qui propose des exercices de français, math, ... Le projet avance bien mais là je bloque. Pour motiver les troupes, je souhaite créer un système d'achievements ou de badges à débloquer (par exemple lorsque l'on fait tel score avec tel temps à tel exercice, ou que l'on s'est connecté plus de 50, ou encore que l'on a obtenu plus de 10 badges, etc.).
 
Pour cela, je compte créer deux tables:
 
* tbl_badges * --> Cette table contiendra tous les badges et comment les obtenir en gros.
  -id
  -name
  -description
  -condition_type (par exemple l'id d'un exercice, ou des mots-clés comme "connexion" ou autre)
  -condition_nb (le score à faire pour débloquer le badge ou le nombre de connexions nécessaire par exemple)
  -condition_time (le temps minimum pour débloquer le badge)
 
* tbl_badges_users * --> Une ligne signifie que le badge n°x a été débloqué par l'utilisateur n°y
  -id_badge
  -id_user
 
Mon problème est donc le suivant: comment garder en mémoire chaque action des utilisateurs? Il faut que je stocke tout un tas de statistiques pour chaque utilisateur: quels exercices ont été faits, avec quel score, avec quel temps, le nombre de connexions, etc. Et je ne vois pas comment créer cette table (que je pourrais appeler tbl_stats). D'ailleurs, une seule table suffit-elle? Cette table me servira aussi pour remplir une page de données statistiques que l'utilisateur pourra consulter.
Elle devra peut-être être dynamique car je vais ajouter des exercices au fur à mesure du temps.
 
Des idées? Merci!


---------------
----** Mon feed-back **----
Reply

Marsh Posté le 12-03-2019 à 18:34:35   

Reply

Marsh Posté le 13-03-2019 à 10:10:32    

tbl_stats {
id_stat
id_user
type_stat (entier)
score
temps
id_lié
}
 
type_stat va te permettre de typer une statistique : est-ce qu'elle porte sur un nb de connexions à l'outil, sur un exo fait, sur un projet... Dans ces 2 derniers cas, le champ "id_lié" sera rempli avec l'ID de l'exo ou du projet (mais pas dans le cas de connexion à l'outil, pas d'objet à lier à la stat a priori).
Donc, avec la combinaison type_stat et id_lié, tu seras capable de lier ta stat à un objet (en plus de la lier à un utilisateur).
Le champ score et temps seront interprétés différemment en fonction du type de stat : pour un exo, ça sera le temps passé à faire l'exo et la note obtenue, pour les connexions, ça sera le nb de connexions et le temps passé sur le site.
 
L'idée est de faire ta table stats la plus générique possible.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 13-03-2019 à 11:42:19    

Merci te ta réponse ;)
Bonne idée, je vois comment faire. Par contre, type_stat serait un entier? Je me demande s'il ne serait pas plus clair pour moi de remplir avec un varchar (genre "connexion", "exercice", etc.) Je ne sais pas si c'est viable après dans le code...


---------------
----** Mon feed-back **----
Reply

Marsh Posté le 13-03-2019 à 14:15:03    

Ca prend plus de place et si à un moment tu veux remplacer le libellé par un autre, faut mettre à jour la BD.
En PHP, tu définis des constantes genre :
define('STAT_TYPE_CONNEXION', 1);
define('STAT_TYPE_EXO', 2);
 
Ainsi, dans ton code, ça reste propre et compréhensible puisque tu vas faire des comparaisons avec ces constantes genre :
if ($maVar == STAT_TYPE_EXO) {
...
}
 
Faire des comparaisons avec des chaînes, c'est plus hasardeux...


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed