SCORM 2004 4th Edition offre de nouvelles fonctionnalités permettant de partager des données entre SCO.
Grâce à un mécanisme de persitence de données inter-SCO, différentes SCO peuvent désormais accéder en lecture et/ou en écriture à des données partagées.
La mise en oeuvre de ces données partagées requiert l’ajout de quelques sections au sein du fichier imsmanifest.xml
du paquetage SCORM et de quelques lignes de code JavaScript côté client.
Ajouts au fichier imsmanifest.xml
Des sections adlcp:data et adlcp:map doivent être ajoutées dans la définition des SCO concernées.
Par exemple :
<item identifier="SCO-ITEM" identifierref="SCO-ITEM-REF" isvisible="true"> ____<title>SCO Title</title> ____<imsss:sequencing> ________<imsss:rollupRules rollupObjectiveSatisfied="false" objectiveMeasureWeight="1.0000" /> ____</imsss:sequencing> ____<adlcp:data> ________<adlcp:map targetID="data_1" readSharedData="false" writeSharedData="true" /> ________<adlcp:map targetID="data_2" readSharedData="true" writeSharedData="false" /> ________<adlcp:map targetID="data_3" readSharedData="true" writeSharedData="true" /> ____</adlcp:data> </item>
Ici, les données partagées data_1, data_2 et data_3 font chacune l’objet d’une déclaration dans une section adlcp:map de la section adlcp:data de la définition de la SCO.
Chaque section adlcp:map décrit une donnée partagée qui est paramétrée à l’aide des attributs suivants :
- targetID : nom de la donnée partagée;
- readSharedData : indique si la donnée partagée est accessible en lecture, auquel cas sa valeur est lue au démarrage de la SCO;
- writeSharedData : indique si la donnée partagée est accessible en écriture, auquel cas sa valeur est écrite à l’arrêt de la SCO.
Code JavaScript côté client
Du côté client on utilise les données partagées en lisant et/ou en écrivant dans les variables suivantes :
- adl.data._count : nombre de données partagées exposées par la SCO — accessible en lecture seulement;
- adl.data.0.id .. adl.data.n.id : tableau contenant les noms des données partagées — accessibles en lecture seulement;
- adl.data.0.store .. adl.data.n.store : tableau contenant les valeurs des données partagées — accessibles en lecture et/ou en écriture en fonction du paramétrage choisi.
Cependant, la manipulation de cet ensemble de variables n’est ni intuitive, ni pratique.
Pour rendre ces fonctionnalités plus agréables à utiliser, j’ai fait quelques ajouts à la librairie LibSCORM.
Grâce à ces ajouts, voici comment on peut ensuite de lire la valeur de data_2 pour l’écrire data_3.
____var data_2 = GetSharedValue('data_2'); ____SetSharedValue('data_3', data_2);
Calquées sur les fonctions GetValue et SetValue de la librairie LibSCORM, on dispose des fonctions GetSharedValue et SetSharedValue — ajoutées au fichier LMS.js.
Ces fonctions GetSharedValue et SetSharedValue utilisent des ressources relatives aux données partagées qui sont créées automatiquement au chargement de la SCO par la méthode LoadSharedValues — ajoutée au fichier Boilerplate.js.
Pour modifier la librairie LibSCORM, ajoutez les portions de code ci-dessous en gras aux fichiers originaux.
Ajouts au fichier LMS.js
function LMS(win) {
____this.Terminate = function() {
________this._wrap("Terminate", true, "");
________this._terminated = true;
____};
____this.IsTerminated = function() {
________return this._terminated;
____};
____this.GetValue = function(name) {
________return this._wrap("GetValue", false, name);
____};
____this.SetValue = function(name, value) {
________this._wrap("SetValue", true, name, value);
____};
____this.LoadSharedValues = function() {
________LMS_adlDataIds = new Array();
________var data_count = lms.GetValue('adl.data._count');
________for ( var i = 0; i < data_count; i++ ) {
____________LMS_adlDataIds[lms.GetValue('adl.data.' + i + '.id')] = i;
________}
____};
____this.GetSharedValue = function(name) {
________name = 'adl.data.' + LMS_adlDataIds[name] + '.store';
________return this._wrap("GetValue", false, name);
____};
____this.SetSharedValue = function(name, value) {
________name = 'adl.data.' + LMS_adlDataIds[name] + '.store';
________this._wrap("SetValue", true, name, value);
____};
Ajouts au fichier Boilerplate.js
// Controlled by var SCO_title; /*global SCO_title: false */ var DC_popupErrors; /*global DC_popupErrors: false */ var DC_showConsoleIcon; /*global DC_showConsoleIcon: false */ var DC_errorImg; /*global DC_errorImg: false */ var LMS_suspendOnExit; /*global LMS_suspendOnExit: false */ var LMS_trackSessionTime; /*global LMS_trackSessionTime: false */ var LMS_adlDataIds; /*global LMS_adlDataIds: shared variables name=>id associative array */ ____: function boilerplate_load() { ____dc = new DebugConsole(DC_showConsoleIcon ? ____document.getElementById('debug') : ____null, ____true, DC_errorImg); ____try { ________lms = new LMS(window); ________if(LMS_trackSessionTime) { ____________lms.StartSessionTimer(); ________} ________lms.LoadSharedValues(); ________objectives = new CMIBag(lms, "objectives"); ________interactions = new CMIBag(lms, "interactions"); ____} catch(e) { ________boilerplate_handleException(e); ____}
Commentaires
Ecrire un commentaire Trackback