DAJANA KAPUSOVA
TECFA Education and Technologies |
|
[ Accueil ] [ Liens ] [ Travaux ] |
Le but de cet exercice était de construire un test (ou un quiz) on-line qui permette de recevoir un feedback.
Au départ, je pensais lier cet exercice à mon activité professionnelle, mais je n'ai pas trouvé d'idée intéressante. Mais un jour de la semaine présentielle, j'ai eu une "illumination". Je me sentais un peu isolée des autres Jolans puisqu'ils ne vennaient pas sur TecfaMOO, mais allaient sur MSN Messenger (mais franchement êtes-vous dignes d'être des Jolans!?!). J'ai craqué et me suis mise aussi sur Messenger. Bien sûr, que je n'aurais pas laissé les Jolans s'en tirer comme ça. J'ai décidé donc de créer un quiz pour tester leurs connaissances sur le MOO et surtout de rendre public les résultats. Mon questionnaire porte le titre "Do you speak MOO" que l'on peut trouver dans mon MOO-finger avec la suite: "Me TOO".
Le quiz devait être destiné qu'aux Jolans, mais ayant trouvé cette idée très originale, j'ai décidé de permettre aux autres fidèles du MOO de le faire aussi (mais sous conditions qu'ils fassent parti de Tecfa, donc figurer dans LDAP de Tecfa). Il suffisait d'extraire la liste des gens qui se sont connectés sur TecfaMOO pendant le dernier mois et d'associer les noms des personnages dans le MOO avec les personnes dans LDAP. Le questionnaire est destiné plutôt pour avoir du FUN.
Ayant des bases de programmation PHP et de MySQL, l'exercice ne me semblait pas très difficile, même si je n'écris pas toujours du code très propre et il y a encore du travail à faire en ce qui concerne les formulaires et la récupération des données, ainsi que leur exploitation.
Ayant travaillé sur le projet d'enseignement à distance SUPPREM,j'ai construit plusieurs quizz dans la plate-forme Oracle iLearning. Celle-ci permet de construire plusieurs types de questions (choix multiples avec une seules réponse correcte, choix multiples avec plusieurs réponses correctes, vrai ou faux, texte à trous avec insertion de texte, texte à trous avec insertion de nombres). A une réponse, correcte ou incorrecte, un feedback est associé. Je me suis vite rendue compte des limites de certains types de questions, comme p.ex.:
Cet exercice devrait me permettre de comprendre comment un formulaire est construit et de quele manière les réponses sont récupérées et un feedback peut y être associé.
Avant de commencer cet exercice, je n'avais pas encore une idée très précise de ce que mon exercice allait devenir. En avançant dans ma réalisation, j'ai pu fixer plusieurs objectifs et contraintes:
Mon dispositif n'égligera les aspects suivants:
J'ai donné un titre au quiz: "Do you speak MOO" que l'on retrouve au début de chaque page du dispositif entouré de deux vaches (j'ai repris l'image que l'on trouve sur les pages associées au projet TecfaMOO). Pour rendre plus gaie l'interface, j'ai choisi d'utiliser la couleur orange qui s'associe très bien avec la couleur jaune de la vache (au départ j'ai voulu utiliser le jaune, mais celui-ci n'était pas très visible sur l'écran). Les boutons prennent également la couleur orange.
Chaque question est facilement identifiable par un titre "Question x", entre les questions se trouve une barre horizontale. La zone des réponses (checkbox, radio, textarea) a un retrait plus à droite fait avec la balise <blockquote>. Pour distinguer mieux visuelement le texte des commandes que l'on tape dans le client MOO, j'ai choisi de mettre les commandes en style "code" et dans la page avec les résultats elles sont en plus en gras. Dans la page avec le classement, pour mieux lire le tableau, j'ai fait alterner une ligne blanche avec une ligne grise.
La navigation entre les pages est assurée soit à l'aide des boutons (pour soumettre), soit avec un lien hypertexte (vers le classement, retour au questionnaire).
Le dispositif comprend des pages PHP dont certaines contiennent une requête SQL sur la base de données MySQL du serveur tecfa. Le dispositif fonctionne de la manière suivante:
Figure: fonctionnement du dispositif
Pour la création des pages PHP j'ai utilisé Dreamweaver qui est facile d'emploi et que je connais assez bien. Pour la base de données, j'ai utilisé au début MySQL sur le serveur silene.unige.ch, car je n'avais pas encore accès à la BD sur le serveur de tecfa. Une fois le dispositif terminé, j'ai transféré tous les fichiers sur le serveur de tecfa et ai également importé la BD.
Je divise l'élaboration du dispositif en deux parties: une lié à la création de la base de données, l'autre à la création des pages en PHP.
Extraire les personnes du LDAP Tecfa
- pour obtenir les noms et les préonoms des personnes
Sur la page du LDAP dans "Display options" cocher "Last
Name" et "First Name", "Display Style - Table"
et soumettre. Faire du copier-coller du tableau dans Excel et on obtient
un tableau à deux colonnes: le prénom de la personnes correspondra
dans la BD au champ first_name
, la deuxième au champs
last_name
.
Extraire les informations sur les personnages de TecfaMOO
- pour obtenir les personnages qui se sont connectées durant le dernier mois (ceux qui viennent régulièrement sur le MOO) avec des informations sur ceux-ci et qui pourront participer au quiz
Dans le MOO, faire @lastlog et essayer d'associer le MOO-personnage avec une personne de Tecfa. Ajouter d'autres informations concernant ce personnage:
-moo_name
- le nom du personnage (@lastlog)
-moo_id
- numéro du personnage (#~<player>.owners)
-parent
- type du player (#~<player>:ancestors()[1])
-objects
- nombre d'objets que possède le personnage (@count ~<player>)
-thing_5
- nombre de generic_thing #5 que possède le personnage (@sp ~<player>, il faut avoir le feature #1419)
-features
- nombre de features que le personnage a sur sa liste (@features for ~<player>)
-old
- age du MOO-personnage, càd l'age depuis la création du personnage (@age)
-spent
- temps que le personnage a passé en tant que connecté (@age)
Créer la BD MySQL
- pour avoir ma propre BD des personnes de Tecfa avec leur personnage dans le MOO
Créer une table moo
contenant les champs nécessaires.
Enregistrer le fichier Excel contenant le tableau avec toutes les informations
sous type CSV (séparateur: point-virgule). Importer dans la BD le
fichier CSV ("Insérer des données provenant d'un fichier
texte dans la table").
Créer une table moostat
contenant des champs où
seront stockés les résultats du questionnaire.
Pour transférer la BD d'un serveur (silene) à un autre (tecfa), il faut exporter (sur silene) la struture et les données pour chaque table, ensuite copier le texte contenant CREATE TABLE et INSERT IINTO et le coller en tant qu'une requête SQL (sur tecfa)
Voir également les commentaires dans les fichiers source des pages PHP.
Structure du fichier
Les pages sont en XHTML et il faut écrire sur la première
ligne
<? echo ("<?xml version=\"1.0\" encoding=\"ISO-8859-1\"
?>"); ?>
Le code HTML est mélangé avec du code PHP, pour indiquer qu'il
s'agit du php
<?php mettre ici le code ?>
Grâce au formulaire<form> il est possbile d'envoyer des données
qui seront ensuite récupérées ($variable = $_POST['variable'];
)
et traitées.
Pour pouvoir récupérer la variable $moo_name
dans la page moo_result.php qui est envoyée depuis la page questionnaire.php,
il faut insérer un <input> avec type="hidden"
dans la page intermédiaire moo_quest.php
<input name="moo_name" type="hidden" value="<?php
echo $moo_name; ?>" />
Pour afficher le détail des erreurs du php, insérer error_reporting(E_ALL);
Il faut se connecter sur la BD - le fichier connect.php contient les informations
nécessaires pour la connexion. Dans les pages PHP qui contiennent
des requêtes SQL, il faut faire un include de ce fichier avec include
("connect.php");
Pour ce qui est de la création des requêtes, leur envoi et
l'affichage du résultat, j'ai utilisé et adapté un
code trouvé sur internet (voir aussi les commentaires dans les fichiers
source).
Test fait avec IE 5.5, Netscape 7.1 et Mozilla 1.4 sous Windows et avec Netscape 7.0 sous Linux.
Avant de commencer cet exercice, j'ai déjà travaillé avec PHP et les formulaires, ce qui m'a très motivé à faire un dispositif plus complexe relié à une BD. Mais toutefois, la structure du questionnaire reste simple, je n'ai pas voulu travailler sur la quantité des questions (en ce qui concerne les possibilités du choix du type des réponses, le tour est très vite fait: INPUT, TEXTAREA, SELECT) mais plutôt sur le traitement des réponses.
On peut se rendre compte que pour certains types, comme les boutons radio, la récupération des données et leur traitement en vue d'un feedback est très simple, tandis que pour les checkbox, ceci peut devenir très vite compliqué si p.ex. on décide de donner une feedback en fonction des combinaisons possibles des réponses cochées. Un bon exemple a été donné pour les checkbox (voir référence "Pages dynamiques avec PHP"), je me suis rendue compte que j'aurais utilisé la façon inefficace pour le faire (checkboxes - multiples variables).
Dans le cas d'une réponse où il est possible de taper la réponse (un input du type texte), les bonne réposes peuvent également devenir infinies si l'on prend en compte qu'un espace de trop n'est pas une erreur. Imaginons par exemple (dans mon cas Question 2) que j'attends du participant la réponse "page daja oui! et toi?". Ceci est l'une des réponses correctes. Mais s'il tape entre les mots p.ex. deux espaces ou s'il met la commande en majiscule, il s'agit tout de même d'une réponse correcte. Que faire avec toutes ces possibilités? Ou si p.ex. il oublie de mettre un espace entre "page" et "daja", donc qu'il tape "pagedaja", il s'agit bien d'une mauvaise réponse, mais il n'était pas loin de la bonne réponse et on pourra dire cela dans le feedback. Dans cet exercice, j'ai décidé de ne traiter que la bonne réponse, le reste étant faux.
J'ai décidé pour mon questionnaire de donner un feedback en fonction de la réponse donnée (pour un input de type radio). Donc si le participant a cinq possibilités à choix, je traite avec if-elseif-else toutes les possibilités, plus une s'il ne choisit rien du tout (empty). Pour un petit questionnaire comme celui de cet exercice, cela ne gène pas trop le concepteur/programmeur, mais imaginns des banques de quizz (je les utilise dans la plate-forme OiL), où toutes les possiblités devraient être traitées. Je comprends mieux maintenant pourquoi on n'a pour une question du quiz que deux feedback: un feedback en retour sur les réponses correctes et un feedback en retour sur les réponses incorrectes.
Un autre point important à savoir est le fait que quand la valeur d'une
variable contient un caractère spéciale comme "
,
'
, \
etc. et on l'affiche avec "echo", des
antishashes "\" s'afficheront devant. Pour afficher correctement le
texte, il faut utiliser la fonction stripslashes(). Pour cet exercice, j'ai
pas perdu de temps à chercher d'où ça venait, mais il y
a quelque temps en arrière quand j'ai travaillé avec des formulaires
avec saisie de texte, je ne comprennais pas pourquoi des antislashes s'affichaient.
Une "nouveauté" pour moi était de déclarer les
variables et de récupérer les réponses aux questions dans
la variable $_POST. Je m'en serais jamais vraiment rendu compte, mais en mettant
dans chaque page error_reporting(E_ALL);
j'ai pu voir tous les
warnings et notices. J'ai tout de même une notice (Notice: Undefined index:
xxx in /xxx.php on line xxx) qui s'affiche sans cesse quand on n'a pas coché
une réponse. J'ai mis dans mon code le cas où aucune réponse
n'est choisie (empty), mais ceci n'a rien changé. J'ai donc cherché
sur internet une explication, et une excellente réponse m'a satisfaite:
il ne s'agit que d'un avertissement et pas d'une erreur. Donc je m'en suis plus
occupée et après avoir fini mon exercice j'ai enlevé la
ligne avec error_reporting().
Une bonne façon de savoir si une réponse a été donné est d'utiliser isset et empty. On peut le faire soit pour les questions elle-mêmes où également pour prévoir l'accès direct à la page PHP sans données. Au départ j'ai pas pensé à la possibilité que quelqu'un accède à la page contenant le feedback par un autre endroit (normalement on fait les questions et on soumet pour obtenir le résultat/feedback). Mais une fois, "accidentellement", j'ai chargé la page du feedback sans passer par la page des questions. La page du feedback, contient une requête SQL qui écrit dans la BD les résultats du quiz et quand j'ai regardé les enregistrements dans la BD, j'ai trouvé un enregistrement où le champ moo_name (qui correspond au nom du MOO-personnage) était vide. Chose étrange, car le participant doit choisir le nom du MOO-personnage dans une liste déroulante et donc cette variable ne peut par conséquent être vide. J'ai quand même mis un certain temps à comprendre que ça venait du fait que j'ai directement accédé à cette page et la variable moo_name était de ce fait vide. Grâce à cet "accident" j'ai pu corriger mon code: si la variable moo_name est vide, alors un lien vers le début du questionnaire s'affiche. (Testez ceci pour le pages moo-quest.php et moo-result.php).
Une autre découverte fut pour moi la possibilité de mélanger du HTML et du PHP ensemble que j'ai vu dans un exemple du transparent "Pages dynamiques avec PHP" (celui où l'on récupère les données dans la même page). Voici la logique du code que j'ai réutilisé justement pour bloquer l'accès à la page des questions et des résultats si l'on ne passe pas par la première page du dispositif. On voit que le "else" peut se refermer beaucoup plus loin.
<?php
if( empty ($moo_name) ) {
afficher un lien vers le début du questionnaire si la variable $moo_name
est vide
}
else { //ici c'est le début du else qui va se fermer beaucoup plus loin
?>
ici le code HTML ou PHP
<?php
} //ici la fin du else
?>
En ce qui concerne les fonctions nécessaires pour travailler avec la BD MySQL, j'ai utilisé un exemple trouvé sur le web, le code me semblait très "cleen" et je l'ai adapté à mon besoin. Je suis capable d'écrire des requêtes simple en SQL, et quand je ne me souvenais plus comment faire p.ex. pour faire un tri descendant ou ascendant, ou faire un calcul dynamique sur deux colonnes d'une table (score + bonus), j'ai vite regardé sur internet pour me rafraîchir la mémoire. Pour l'instant je ne me suis pas préoccupée de la manière dont les champs dans la BD sont définis (text, int, varchar ...) car nous devrions voir ceci lors d'une autre période staf 14 et je n'ai pas le temps de m'y plonger pour cet exercice. Mais cela n'empêche pas le dispositif de marcher correctement.
Il me semblait important de faire tester le questionnaire par quelqu'un, de préférence de tecfa et d'avoir ainsi un avis sur mon dispositif qui me permettra de faire des corrections nécessaires. Grand merci à ces deux cobailles qui resteront anonymes! Et merci également à Jacques qui a corrigé mes fautes de français.
Pour tester si mon code HTML est valide, j'ai fait un lien vers le valideur XHTML et CSS, et j'ai testé. L'un de mes soucis principaux est d'apprendre à écrire du code propre et correct.
Bien évidemment, il aurait été plus intéressant de faire ce dispositif dynamiquement dans le MOO avec E_Web, comme me l'a fait remarquer DKS, mais pour l'instant je n'ai pas le bagage nécessaire en programmation dans le MOO.
Avec la première personne qui a fait le quiz (merci RoRk at WoRk), on s'est apperçu (mais seulement après avoir fait des tests compliqués dans le MOO) qu'il y avait une petite faille entre la première et la deuxième question (comment pager et comment repager). En fait, on peut utiliser plusieurs commandes pour pager à quelqu'un, ainsi que pour repager. Voici un exemple concret.
Vous écrivez à la suite les commandes suivantes:
'daja Bonjour!
page rork Bonjour!
' oui! et toi?
A qui sera envoyé le page écrit en troisième ligne? J'aurais dit à RoRk, mais non, il sera envoyé à daja. De ce fait, il faudra rajouter une condition supplémentaire, pour que le quiz soit vraiment parfait, qui tiendra compte de ce rapport entre la réponse faite à la Question 1 et à la Question 2.
L.
Atkinson, Programmation en PHP 4, CampusPress, Paris 2000
Introduction
à PHP
Pages
dynamiques avec PHP
php.debutant.com
- Interroger une table MySQL
www.php.net
© 2004 by D.K., updated March 2004 |