wiki:SCORMDokeos

Publications SCORM avec Dokeos

Tests de la version 1.8.4

Résultats : des problèmes de compatibilité avec Opale ont été identifiés, CF fichier rapport pdf attaché.

Tests de la version 1.8.5

Par rapport a la norme SCORM

  • Le script devant générer une erreur n'en génère toujours pas

Exécution du script :

LMSInitialize("")
LMSGetValue("cmi.suspend_dataError")
LMSCommit("")
LMSFinish("")

La variable "cmi.suspend_dataError" n'est jamais initialisé. Or après le LMSGetValue, aucun code d'erreur n'est paramétré.

D'une manière plus générale, aucun code d'erreur ne semble implémenté, tel que défini dans SCORM_1.2_RunTimeEnv.pdf section 3.3.3. "API Error Code Usage" (les exemples supposés retourner des erreurs n'en renvoient pas, LMSGetErrorString semble ne fonctionner pour aucun code...)

Il semble donc impossible par exemple de savoir a partir d'un module SCORM si les DataModelElements facultatifs pour la norme sont supportés ou non par Dokeos et toutes les erreurs sont passées sous silence.

  • Le problème de la perte du runtime SCORM lors de lancements successif du module sont toujours présent ("LMSInitialize - There is no SCORM runtime API object to call." à la 2eme exécution du script de test SCORM). Se déconnecter de Dokeos ou relancer apache ne résout pas le problème, supprimer et réimporter le package SCORM résoud le problème (jusqu'à la prochaine fois...)
  • Les tests SCORM 2004 n'ont pas été refait et ne devraient pas faire l'objet d'une description détaillée dans le compte rendu : c'est officiel, dokeos n'implémente pas dans les versions actuels le support SCORM 2004.

Par rapport a l'exécution d'un module produit avec OpaleSup

  • Dokeos expose l'API SCORM 2004 même lorsque le imsmanifest contient : <schemaversion>1.2</schemaversion>. Dans les modules Opale SCORM 1.2, on utilise l'API 2004 si la plateforme l'expose, ce qui fait que par défaut rien ne fonctionne. La prochaine version d'Opale utilisera uniquement les API 1.2 lorsque le format choisi est 1.2, on peu recommander tout de même que Dokeos n'expose pas l'API 2004 si schemaversion est 1.2. Nous continuons les tests en intégrant un workaround a notre module Opale pour éviter ce problème.
  • En multi-sco, retourner a l'accueil a partir de certaines pages tue le module (le plan de navigation deviens inutilisable). (je ne sais pas si c'est lié au bug "perte de l'API après plusieurs exécutions, signalé précédemment).

Voici les infos de debug par Dokeos lors de la première exécution :

SCORM: LMSSetValue ('cmi.core.session_time','00:00:04.09')
SCORM: LMSSetValue ('cmi.core.exit','')
SCORM: LMSCommit()
SCORM: LMSCommit()
SCORM: LMSFinish() (no LMSCommit())
SCORM: LMSInitialise()
SCORM: LMSGetValue ('cmi.suspend_data') returned ''
SCORM: LMSGetLastError()
SCORM: LMSSetValue ('cmi.suspend_data',''assmnt':{'#':{'c23':{'st':'attempt','i':0,'s':0,'a':1}}}')
SCORM: LMSCommit()

Procédure pour reporduire le problème :

  • -
    • importer le module Opale multi-sco lié ici
    • le consulter (ayant activé de préférence "débug" et "autoriser plusieurs tentatives")
    • dans le plan, cliquer sur la page "Ceci est le titre de l'Exercice Interactif"
    • cliquer sur "accueil" tout en haut a gauche
    • réouvrir le module

-> le plan deviens complètement inopérant

  • La gestion de l'état étrange (tests multi-sco) :
    • Au départ, ouvrir un SCO ne lui fait jamais changer d'état (toujours "non tenté")
    • Lorsque l'on valide une activité d'évaluation, son SCO passe en état "terminée"
    • Après, parcourir n'importe quel type d'état la passe toujours en état "terminée"
    • D'après le document de référence de l'ADL section 3.4.4. "The SCORM Run-Time Environemnt Data Model" donnée "cmi.core.lesson_status" : "Upon reiving the LMSFinish() call or the user navigates away, the LMS sould set the cmi.core.lesson_status for the SCO to "completed""

Info de debugs, on a l'impression que l'appel "LMSSetValue ('cmi.core.lesson_status','completed')" lancé exceptionnellement pour marquer la fin d'une évaluation contamine tous les autres SCO parcourus après.

SCORM: LMSSetValue ('cmi.suspend_data',''assmnt':{'evalX':{'c11':{'st':'attempt'},'c11_97':{'st':'attempt','r':{'choice':0},'i':0,'s':1,'a':1},'c24':{'st':'attempt','r':{'0':'true','1':'true'},'i':0,'s':0,'a':1},'c25':{'st':'attempt','r':{'pos':'[{g:2,offs:0,x:472,y:312},{g:1,offs:0,x:496,y:266},{g:1,offs:1,x:699,y:266},{g:1,offs:2,x:902,y:266}]'},'i':0,'s':0.25,'a':1},'c26':{'st':'attempt','r':{'pos':'[{g:1,offs:0,x:123,y:334},{g:1,offs:1,x:251,y:334},{g:1,offs:2,x:380,y:334},{g:1,offs:3,x:504,y:341}]'}},'c27':{'st':'attempt','r':{'N22':'fdggsd','N27':'mots'}},'c28':{'st':'attempt','r':{'field':'kljlk'},'i':0,'s':0,'a':1}}}')
SCORM: LMSCommit()
SCORM: LMSSetValue ('cmi.suspend_data',''assmnt':{'evalX':{'c11':{'st':'attempt'},'c11_97':{'st':'attempt','r':{'choice':0},'i':0,'s':1,'a':1},'c24':{'st':'attempt','r':{'0':'true','1':'true'},'i':0,'s':0,'a':1},'c25':{'st':'attempt','r':{'pos':'[{g:2,offs:0,x:472,y:312},{g:1,offs:0,x:496,y:266},{g:1,offs:1,x:699,y:266},{g:1,offs:2,x:902,y:266}]'},'i':0,'s':0.25,'a':1},'c26':{'st':'attempt','r':{'pos':'[{g:1,offs:0,x:123,y:334},{g:1,offs:1,x:251,y:334},{g:1,offs:2,x:380,y:334},{g:1,offs:3,x:504,y:341}]'},'i':0,'s':1,'a':1},'c27':{'st':'attempt','r':{'N22':'fdggsd','N27':'mots'}},'c28':{'st':'attempt','r':{'field':'kljlk'},'i':0,'s':0,'a':1}}}')
SCORM: LMSCommit()
SCORM: LMSSetValue ('cmi.suspend_data',''assmnt':{'evalX':{'c11':{'st':'attempt'},'c11_97':{'st':'attempt','r':{'choice':0},'i':0,'s':1,'a':1},'c24':{'st':'attempt','r':{'0':'true','1':'true'},'i':0,'s':0,'a':1},'c25':{'st':'attempt','r':{'pos':'[{g:2,offs:0,x:472,y:312},{g:1,offs:0,x:496,y:266},{g:1,offs:1,x:699,y:266},{g:1,offs:2,x:902,y:266}]'},'i':0,'s':0.25,'a':1},'c26':{'st':'attempt','r':{'pos':'[{g:1,offs:0,x:123,y:334},{g:1,offs:1,x:251,y:334},{g:1,offs:2,x:380,y:334},{g:1,offs:3,x:504,y:341}]'},'i':0,'s':1,'a':1},'c27':{'st':'attempt','r':{'N22':'fdggsd','N27':'mots'},'i':0,'s':0.3333333333333333,'a':1},'c28':{'st':'attempt','r':{'field':'kljlk'},'i':0,'s':0,'a':1}}}')
SCORM: LMSCommit()
SCORM: LMSSetValue ('cmi.core.score.raw','43')
SCORM: LMSSetValue ('cmi.core.score.min','0')
SCORM: LMSSetValue ('cmi.core.score.max','100')
SCORM: LMSSetValue ('cmi.core.lesson_status','completed')
SCORM: LMSCommit()
SCORM: LMSSetValue ('cmi.suspend_data',''assmnt':{'evalX':{'c11':{'st':'complete','i':0,'s':2.5833333333333335,'a':6},'c11_97':{'st':'attempt','r':{'choice':0},'i':0,'s':1,'a':1},'c24':{'st':'attempt','r':{'0':'true','1':'true'},'i':0,'s':0,'a':1},'c25':{'st':'attempt','r':{'pos':'[{g:2,offs:0,x:472,y:312},{g:1,offs:0,x:496,y:266},{g:1,offs:1,x:699,y:266},{g:1,offs:2,x:902,y:266}]'},'i':0,'s':0.25,'a':1},'c26':{'st':'attempt','r':{'pos':'[{g:1,offs:0,x:123,y:334},{g:1,offs:1,x:251,y:334},{g:1,offs:2,x:380,y:334},{g:1,offs:3,x:504,y:341}]'},'i':0,'s':1,'a':1},'c27':{'st':'attempt','r':{'N22':'fdggsd','N27':'mots'},'i':0,'s':0.3333333333333333,'a':1},'c28':{'st':'attempt','r':{'field':'kljlk'},'i':0,'s':0,'a':1}}}')
SCORM: LMSCommit()
SCORM: LMSSetValue ('cmi.core.session_time','00:02:05.66')
SCORM: LMSSetValue ('cmi.core.exit','')
SCORM: LMSCommit()
SCORM: LMSCommit()
SCORM: LMSFinish() (no LMSCommit())
SCORM: LMSInitialise()
SCORM: LMSGetValue ('cmi.suspend_data') returned ''assmnt':{'evalX':{'c11':{'st':'complete','i':0,'s':2.5833333333333335,'a':6},'c11_97':{'st':'attempt','r':{'choice':0},'i':0,'s':1,'a':1},'c24':{'st':'attempt','r':{'0':'true','1':'true'},'i':0,'s':0,'a':1},'c25':{'st':'attempt','r':{'pos':'[{g:2,offs:0,x:472,y:312},{g:1,offs:0,x:496,y:266},{g:1,offs:1,x:699,y:266},{g:1,offs:2,x:902,y:266}]'},'i':0,'s':0.25,'a':1},'c26':{'st':'attempt','r':{'pos':'[{g:1,offs:0,x:123,y:334},{g:1,offs:1,x:251,y:334},{g:1,offs:2,x:380,y:334},{g:1,offs:3,x:504,y:341}]'},'i':0,'s':1,'a':1},'c27':{'st':'attempt','r':{'N22':'fdggsd','N27':'mots'},'i':0,'s':0.3333333333333333,'a':1},'c28':{'st':'attempt','r':{'field':'kljlk'},'i':0,'s':0,'a':1}}}'
SCORM: LMSGetLastError()
SCORM: LMSSetValue ('cmi.suspend_data',''assmnt':{'evalX':{'c11':{'st':'complete','i':0,'s':2.5833333333333335,'a':6},'c11_97':{'st':'attempt','r':{'choice':0},'i':0,'s':1,'a':1},'c24':{'st':'attempt','r':{'0':'true','1':'true'},'i':0,'s':0,'a':1},'c25':{'st':'attempt','r':{'pos':'[{g:2,offs:0,x:472,y:312},{g:1,offs:0,x:496,y:266},{g:1,offs:1,x:699,y:266},{g:1,offs:2,x:902,y:266}]'},'i':0,'s':0.25,'a':1},'c26':{'st':'attempt','r':{'pos':'[{g:1,offs:0,x:123,y:334},{g:1,offs:1,x:251,y:334},{g:1,offs:2,x:380,y:334},{g:1,offs:3,x:504,y:341}]'},'i':0,'s':1,'a':1},'c27':{'st':'attempt','r':{'N22':'fdggsd','N27':'mots'},'i':0,'s':0.3333333333333333,'a':1},'c28':{'st':'attempt','r':{'field':'kljlk'},'i':0,'s':0,'a':1}},'#':{'c23':{'st':'attempt','i':0,'s':0,'a':1}}}')
SCORM: LMSCommit()
SCORM: LMSSetValue ('cmi.core.session_time','00:06:14.78')
SCORM: LMSSetValue ('cmi.core.exit','')
SCORM: LMSCommit()
SCORM: LMSCommit()
SCORM: LMSFinish() (no LMSCommit())
SCORM: LMSInitialise()
SCORM: LMSGetValue ('cmi.suspend_data') returned ''assmnt':{'evalX':{'c11':{'st':'complete','i':0,'s':2.5833333333333335,'a':6},'c11_97':{'st':'attempt','r':{'choice':0},'i':0,'s':1,'a':1},'c24':{'st':'attempt','r':{'0':'true','1':'true'},'i':0,'s':0,'a':1},'c25':{'st':'attempt','r':{'pos':'[{g:2,offs:0,x:472,y:312},{g:1,offs:0,x:496,y:266},{g:1,offs:1,x:699,y:266},{g:1,offs:2,x:902,y:266}]'},'i':0,'s':0.25,'a':1},'c26':{'st':'attempt','r':{'pos':'[{g:1,offs:0,x:123,y:334},{g:1,offs:1,x:251,y:334},{g:1,offs:2,x:380,y:334},{g:1,offs:3,x:504,y:341}]'},'i':0,'s':1,'a':1},'c27':{'st':'attempt','r':{'N22':'fdggsd','N27':'mots'},'i':0,'s':0.3333333333333333,'a':1},'c28':{'st':'attempt','r':{'field':'kljlk'},'i':0,'s':0,'a':1}},'#':{'c23':{'st':'attempt','i':0,'s':0,'a':1}}}'
SCORM: LMSGetLastError()
SCORM: LMSSetValue ('cmi.core.session_time','00:00:05.70')
SCORM: LMSSetValue ('cmi.core.exit','')
SCORM: LMSCommit()
SCORM: LMSCommit()
SCORM: LMSFinish() (no LMSCommit())
SCORM: LMSInitialise()
  • enregistrer un score "contamine" tous les autres SCO :
    • lorsque l'on termine une évaluation, le score de l'évaluation est bien enregistré, mais...
    • tous les SCO sans évaluation par lesquels on passe sont associé au score de celui de la dernière évaluation
    • pourtant, on lance un seul "LMSSetValue ('cmi.core.score.raw','43')", puis après LMSFinish(), donc le score ne devrais pas "contaminer" les autres SCO, non ? Ce bug doit être lié au précédent.

capture d'écran problème contamination des scores

  • Au niveau de l'enregistrement des temps en multi-sco, cela ne fonctionne pas non plus avec les modules Opale dans de nombreux cas :
    • contamination des temps par d'anciens temps : si on passe 10 seconde sur un SCO, puis 20 secondes sur le 2eme et que l'on clique sur le bouton pour afficher l'écran de scores et de temps, les 2 SCOs sont contaminés avec le même temps : 10 secondes. Pourtant, quelque soit la manière dont on quitte le SCO, session time est bien envoyé, avec LMSCommit / LMSFinish comme il se doit.
    • l'écran des scores ne montre pas le temps global que l'apprenant passe dans un SCO, juste le temps qu'il a passé lors de sa dernière visite. Je ne sais pas si Dokeos utilise session_time a la place de total_time, ou s'il calcule juste mal total_time mais il me semble qu'utiliser le total serait plus pertinent.

En résumé il n'est toujours pas possible d'utiliser des contenus interactifs produits avec Opale dans Dokeos 1.8.5

Attachments