Avvisare un utente che sta usando scorm che la sua connessione è persa

Avvisare un utente che sta usando scorm che la sua connessione è persa

di Gino Bartali -
Numero di risposte: 2

Salve,

gestisco alcuni corsi che contengono activity scorm lunghe 1 ora o più. Mi sono accorto che se l'utente che sta visionando lo scorm perde temporaneamente la connessione (es. con dispositivi mobili) oppure se gli scade la sessione (es. resta fermo nella lezione finchè la sessione va in timeout), allora lo scorm può continuare normalmente, ma in realtà la connessione tra l'oggetto scorm e moodle è caduta e non vengono salvati i dati di tracciamento della lezione. L'utente, ignaro del problema, conclude la sua lezione scorm, ma poi quando ritorna nella pagina del corso si accorge che l'attività non è stata completata. Se riapre la lezione scorm, questa riparte dall'ultima slide prima che la connessione cadesse.

E' possibile avvisare l'utente che la sua connessione è caduta, in modo tale che possa interrompere la visione dello scorm e ricollegarsi, così da ristabilire la connessione?

Ho fatto alcuni test e mi sono accorto che da quando la connessione cade, il LMSCommit torna errorcode 101, come si può vedere dal log qui:

SCORM API Activity Log
Tue, 11 Aug 2015 09:53:58 GMT: Moodle SCORM 1.2 API Loaded, Activity: Modulo 2, SCO: item
Tue, 11 Aug 2015 09:53:59 GMT: LMSInitialize("", "") => 0
Tue, 11 Aug 2015 09:53:59 GMT: LMSGetValue("cmi.suspend_data") - N4IgJiBcCsCMCc8DMAGANCANlATBgblANrqxo4C6GADlKPgJYCmA7gCICuATgIYAuDAPYA7KHHgZMPAM58AasxZMwAZUwMwTXBmnrNKvvybS6IFKcbSGfZVD5cOTDAGNBAW2qYmNiJABmPJjSTAC+GLAWDFY+dg5OIK4eXjH+gcFhIDiR0baQ9o4u7p7euQFBoSEZAI50lUAAA== => 0
Tue, 11 Aug 2015 09:54:06 GMT: LMSSetValue("cmi.core.session_time", "00:00:00") => 0
Tue, 11 Aug 2015 09:54:06 GMT: LMSSetValue("cmi.suspend_data", "N4IgJiBcCsCMCc8DMB2ANCANlATBgblANoAMasaOAuhgA5SiYCGAzgC4BqAlgKYDuPMAGVMXMD1wFefACIBXAE5M2XAPYA7KHHgYWo8ULbKeLBiBJn8XFlzaCobBXJ4YAxqoC2tTDzsRIAGZMmCw8AL4YsJbWtvaQjs5unt6+cUEh4Rg40TZ+Dk4uIO5ePnmBwaFhVRgAjgxVQAA") => 0
Tue, 11 Aug 2015 09:54:14 GMT: LMSSetValue("cmi.core.session_time", "00:00:07") => 0
Tue, 11 Aug 2015 09:54:14 GMT: LMSSetValue("cmi.suspend_data", "N4IgJiBcCsBMDs8AcA2ANCANlWGBuUA2gAxoCMasAuhgA5SiYCGAzgC4BqAlgKYDuPMAGVMXMDxz5efACIBXAE5M2XAPYA7KPAwtR4oW2U8WDEMVN4uLLm0FQ2CuTwwBjVQFtamHrYiQAZkyYLDwAvhhkFlY2dpAOTq4eXj6xgcFhGLBR1r72js4gbp7euQFBIaGVGACODJVAA==") => 0
Tue, 11 Aug 2015 09:54:14 GMT: LMSSetValue("cmi.core.score.min", "0") => 0
Tue, 11 Aug 2015 09:54:14 GMT: LMSSetValue("cmi.core.score.max", "100") => 0
Tue, 11 Aug 2015 09:54:14 GMT: LMSSetValue("cmi.core.score.raw", "4.48") => 0
Tue, 11 Aug 2015 09:54:14 GMT: LMSSetValue("cmi.core.lesson_status", "failed") => 0
Tue, 11 Aug 2015 09:54:14 GMT: LMSSetValue("cmi.core.session_time", "00:00:07") => 0
Tue, 11 Aug 2015 09:54:14 GMT: LMSSetValue("cmi.suspend_data", "N4IgJiBcCsBMDsBOADADgDQgDZVpgblANrLoCM6sAupgA5ShYCGAzgC4BqAlgKYDuPMAGUsXMD1wFefACIBXAE5M2XAPYA7KPEwtR4oW2U8WDEMlP4uLLm0FQ2CuT0wBjVQFtaWHrYiQAZkxYLDwAvphkFlY2dpAOTq4eXj6xgcFhmLBR1r72js4gbp7euQFBIaGVmACODJVAA==") => 0
Tue, 11 Aug 2015 09:54:15 GMT: Commit("", "") => 0
Tue, 11 Aug 2015 09:54:15 GMT: LMSCommit("AJAXResult", "true") => 0
Tue, 11 Aug 2015 09:54:15 GMT: LMSCommit("result", "true") => 0
Tue, 11 Aug 2015 09:54:15 GMT: LMSCommit("errorCode", "0") => 0
Tue, 11 Aug 2015 09:54:31 GMT: LMSSetValue("cmi.core.session_time", "00:00:24") => 0
Tue, 11 Aug 2015 09:54:31 GMT: LMSSetValue("cmi.suspend_data", "N4IgJiBcCsAssCYAM0A0IA2UHoG5QG0lUBGVBAXXQAcpQMBDAZwBcA1ASwFMB3LsAMoYOYLtjzceAEQCuAJwYsOAewB22AMzomw0QJaKuTOiCQncHJhxb8oLOTK7oAxsoC21DFxsRIAMwYMJi4AX3QSc0trW0h7Rxd3T28YgKDQ9ARIqx87BycQVw8vHP9A4JCK9ABHOgqgAAA==") => 0
Tue, 11 Aug 2015 09:54:46 GMT: LMSSetValue("cmi.core.session_time", "00:00:39") => 0
Tue, 11 Aug 2015 09:54:46 GMT: LMSSetValue("cmi.suspend_data", "N4IgJiBcCs0JwA4DMAmANCANldIBuUA2gAxoCMaKAuhgA5SiYCGAzgC4BqAlgKYDuPMAGVMXMDxwY8vPgBEArgCcmbLgHsAdlCRwMLUeKFsVPFgxDFz0llzaCobRfJ4YAxmoC2tTDzsRIAGZMmCw8AL4YZFZcNn4OTi4g7l4+cYHBoREgKNGx9pCOzm6e3r75QSHhYVkAjgzVQAA") => 0
Tue, 11 Aug 2015 09:54:47 GMT: LMSSetValue("cmi.core.session_time", "00:00:40") => 0
Tue, 11 Aug 2015 09:54:47 GMT: LMSSetValue("cmi.suspend_data", "N4IgJiBcCsBsAMskBoQBsoCZUDcoG15kBGZTAXVQAcpQ0BDAZwBcA1ASwFMB3TsAZTTswnLLi7cAIgFcATvWbsA9gDsoAZgCcqRkJH9mCzo1oh4pnO0btmfKM1nTOqAMZKAtlTSdbESADN6NEZOAF9UYgsrGztIBydXDy8fWMDgsNRMKOtfe0dnEDdPb1yAoJDwkHVsmL94gqLk0rSK0MqAR1o2oAA==") => 0
Tue, 11 Aug 2015 09:54:47 GMT: LMSSetValue("cmi.core.session_time", "00:00:40") => 0
Tue, 11 Aug 2015 09:54:47 GMT: LMSSetValue("cmi.suspend_data", "N4IgJiBcCsBsAMB2JAaEAbKAmNA3KA2vCgIwpYC6aADlKOgIYDOALgGoCWApgO5dgBldBzBcoAZjzceAEQCuAJwYsOAewB2EgJxomw0QJbKuTOiHhncHJhxb8oLBXK5oAxqoC21dFzsRIAGYM6ExcAL5oJJbWtvaQjs5unt6+cUEh4WhY0TZ+Dk4uIO5ePnmBwaERIOI5sf4JhcUpZemVYVUAjnTtQAA") => 0
Tue, 11 Aug 2015 09:54:47 GMT: LMSSetValue("cmi.core.score.min", "0") => 0
Tue, 11 Aug 2015 09:54:47 GMT: LMSSetValue("cmi.core.score.max", "100") => 0
Tue, 11 Aug 2015 09:54:47 GMT: LMSSetValue("cmi.core.score.raw", "5.97") => 0
Tue, 11 Aug 2015 09:54:47 GMT: LMSSetValue("cmi.core.lesson_status", "failed") => 0
Tue, 11 Aug 2015 09:54:47 GMT: LMSSetValue("cmi.core.session_time", "00:00:40") => 0
Tue, 11 Aug 2015 09:54:47 GMT: LMSSetValue("cmi.suspend_data", "N4IgJiBcCsBsAMAOesA0IA2UDM6BuUA2vKgIyoBMq2AuugA5SgYCGAzgC4BqAlgKYB3PmADKGHmD458/AQBEArgCcWHHgHsAdjgCc6NuMkiOqvmyYh4FvDzY8OwqByUK+6AMbqAtvQx8HEJAAZiwYbHwAvuik1rb2jpDOrh7evv4JIWGR6BSxdgFOLm4gnj5+BcGh4VEg2HnxgUnFpWkVmdURNQCOTJ1AAA=") => 0
Tue, 11 Aug 2015 09:54:47 GMT: Commit("", "") => 0
Tue, 11 Aug 2015 09:54:48 GMT: LMSCommit("AJAXResult", "true") => 0
Tue, 11 Aug 2015 09:54:48 GMT: LMSCommit("result", "true") => 0
Tue, 11 Aug 2015 09:54:48 GMT: LMSCommit("errorCode", "0") => 0
Tue, 11 Aug 2015 09:55:03 GMT: LMSSetValue("cmi.core.session_time", "00:00:56") => 0
Tue, 11 Aug 2015 09:55:03 GMT: LMSSetValue("cmi.suspend_data", "N4IgJiBcCsDsBsAmaAGANCANlAzBgblANroCMaiaOAuhgA5SiYCGAzgC4BqAlgKYDuvMAGVM3ML1wE+/ACIBXAE7N23APYA7KNGgZWYicPYrerRiBTn83Vt3ZCo7RfN4YAxmoC2dTL3sRIADNmTFZeAF8MUisbOwdIJxd3Lx8/eODQiIxEGNt/R2dXEA9vX3ygkLDIkBxcuIDEopLU8oyq8OqAR0YOoA") => 0
Tue, 11 Aug 2015 09:55:18 GMT: LMSSetValue("cmi.core.session_time", "00:01:12") => 0
Tue, 11 Aug 2015 09:55:18 GMT: LMSSetValue("cmi.suspend_data", "N4IgJiBcCsCcCMsAc8A0IA2UDM6BuUA2gAypoBMq2AuugA5SgYCGAzgC4BqAlgKYDuvMAGUM3MLxz4+/ACIBXAE7N23APYA7KAHY0IVmInD2K3q0YhiFvN1bd2QqO0Xze6AMZqAtnQy8HEJAAZswYrLwAvujw1rb2jpDOrh7evv4JIWGR6OSxdgFOLm4gnj5+BcGh4VEg2HnxgUnFpWkVmdURNQCOjJ1AAA=") => 0
Tue, 11 Aug 2015 09:55:34 GMT: LMSSetValue("cmi.core.session_time", "00:01:27") => 0
Tue, 11 Aug 2015 09:55:34 GMT: LMSSetValue("cmi.suspend_data", "N4IgJiBcBsAMDsBOAjAJgDQgDZQMyYDcoBtWdZdDXAXUwAcpQsBDAZwBcA1ASwFMB3XmADKWbmF55CffgBEArgCdm7bgHsAdlAAc8TKzETh7Fb1aMQsCwW6tu7IVHaL5vTAGM1AWzpZeDiEgAM2YsVl4AX0xka1t7R0hnVw9vX38EkLDIzFRYuwCnFzcQTx8/AuDQ8KiQXDz4wKTi0rSKzOqImoBHRk6gAA=") => 0
...*** QUI LA SESSIONE VA IN TIMEOUT ***...
Tue, 11 Aug 2015 14:51:56 GMT: LMSSetValue("cmi.core.session_time", "04:57:50") => 0
Tue, 11 Aug 2015 14:51:57 GMT: LMSSetValue("cmi.suspend_data", "N4IgJiBcCMAcDMsCcSBs8A0IA2UAsWAblANoAMG0GATBpngLpYAOUo2AhgM4AuAagEsApgHchYAMrYBYIVACsRYSIAiAVwBOHHgID2AOyjQA7LFRIsXabIk9tQrmxBknhAVwE9xUHhrVCsAGNdAFtmbCEvCEgAMw5sLiEAXyxoV3dPb0hffyDQ8MisuITkrGp0jyifPwCQYLCIqtj4xJSQeArM6Jza+oKm4tasPE6mnryGwujB0pB5UazxuvzGopbkpLaARzZNoAAA==") => 0
Tue, 11 Aug 2015 14:51:57 GMT: LMSSetValue("cmi.core.score.min", "0") => 0
Tue, 11 Aug 2015 14:51:57 GMT: LMSSetValue("cmi.core.score.max", "100") => 0
Tue, 11 Aug 2015 14:51:57 GMT: LMSSetValue("cmi.core.score.raw", "8.96") => 0
Tue, 11 Aug 2015 14:51:58 GMT: LMSSetValue("cmi.core.lesson_status", "failed") => 0
Tue, 11 Aug 2015 14:51:58 GMT: LMSSetValue("cmi.core.session_time", "04:57:51") => 0
Tue, 11 Aug 2015 14:51:58 GMT: LMSSetValue("cmi.suspend_data", "N4IgJiBcCMAcDMBOaBWFA2ANCANlF2AblANoAMm0mATJvJgCyYoC62ADlKDgIYDOAFwBqASwCmAdzFgAyjhFgx+IuIkARAK4AnHgJEB7AHZRoAdljpE2PvMUyBusXy4gyLwiL4iB0qAK0aYtgAxvoAtuw4Yj4QkABmPDh8YgC+2NDunt6+kP6BIeGR0TkJSanY1JleMX4BQSChEVE18YnJaSDwVdmxefWNRS2l7dgM3S19BU3FscPlICjjOZMNhc0lbakpHQCOXNtAAA") => 0
Tue, 11 Aug 2015 14:52:00 GMT: Commit("", "") => 0
Tue, 11 Aug 2015 14:52:00 GMT: LMSCommit("AJAXResult", " ") => 0
Tue, 11 Aug 2015 14:52:00 GMT: LMSCommit("result", "false") => 0
Tue, 11 Aug 2015 14:52:00 GMT: LMSCommit("errorCode", "101") => 0
Tue, 11 Aug 2015 14:52:16 GMT: LMSSetValue("cmi.core.session_time", "04:58:09") => 0
Tue, 11 Aug 2015 14:52:16 GMT: LMSSetValue("cmi.suspend_data", "N4IgJiBcCMAcAsAGAnPATLANCANlArNgG5QDaim0mamAzJvJvgLrYAOUoOAhgM4AuANQCWAUwDuosAGUcwsKILEx4gCIBXAE7d+wgPYA7KNADssc9l5yF0/jtG9OIRE6LDew/lKj9N60dgAxnoAtmw4ol4QkABm3Di8ogC+2NCu7p7ekL7+QaHhkVlxCcnYaOkeUT5+ASDBYRFVsfGJKSC0FZnRObX1BU3FrdjwnU09eQ2F0YOlIPijWeN1+Y1FLclJbQCOnJtAAAA==") => 0
Tue, 11 Aug 2015 14:52:25 GMT: LMSSetValue("cmi.core.session_time", "04:58:18") => 0
Tue, 11 Aug 2015 14:52:25 GMT: LMSSetValue("cmi.suspend_data", "N4IgJiBcCMAcAscBsAmWAaEAbKBWTAblANoAM606K6AzOvOrgLqYAOUoWAhgM4AuANQCWAUwDuIsAGUsQsCLyFRYgCIBXAE5c+QgPYA7KNADssAJzHMPWfKl9tInhxClnBITyF9JUPhrUimADGugC2rFgi3hCQAGZcWDwiAL6Y0G4eXj6QfgHBYRFR2fGJKZgoGZ7Rvv6BICHhkdVxCUmpIDSVWTG5dQ2FzSVtmPBdzb35jUUxQ2UguGPZE/UFTcWtc0iLPbWTA+ulyUeYAI4cR0AAA=") => 0
Tue, 11 Aug 2015 14:52:26 GMT: LMSSetValue("cmi.core.session_time", "04:58:19") => 0
Tue, 11 Aug 2015 14:52:26 GMT: LMSSetValue("cmi.suspend_data", "N4IgJiBcCMAcAs0CccAMAaEAbKBWTAblANobToBM6AzOvOrgLqYAOUoWAhgM4AuAagEsApgHdhYAMpZBYYVABshEaIAiAVwBOnXoID2AOyjQA7LCQnM3GXMm8dw7uxCpnBQd0G8JUXpvXCmADGegC2LFjC3hCQAGacWNzCAL6Y0G4eXj6QfgHBYRFR2fGJKZgUGZ7Rvv6BICHhkdVxCUmpINSVWTG5dQ2FzSVtmPBdzb35jUUxQ2UguGPZE/UFTcWtcwqLPbWTA+ulyUeYAI7sR0AAA=") => 0
Tue, 11 Aug 2015 14:52:26 GMT: LMSSetValue("cmi.core.score.min", "0") => 0
Tue, 11 Aug 2015 14:52:26 GMT: LMSSetValue("cmi.core.score.max", "100") => 0
Tue, 11 Aug 2015 14:52:27 GMT: LMSSetValue("cmi.core.score.raw", "10.45") => 0
Tue, 11 Aug 2015 14:52:27 GMT: LMSSetValue("cmi.core.lesson_status", "failed") => 0
Tue, 11 Aug 2015 14:52:27 GMT: LMSSetValue("cmi.core.session_time", "04:58:20") => 0
Tue, 11 Aug 2015 14:52:27 GMT: LMSSetValue("cmi.suspend_data", "N4IgJiBcCMAcAsAmADAdlsgNCANlAbNgG5QDaW0mimAzJvJgKyb4C62ADlKDgIYDOAFwBqASwCmAd3FgAyjlFhxBYhMkARAK4AnXoNEB7AHZRo6AJyps/BUtmC94/txDIXRUf1GCZUQds1xbABjAwBbDhxxHwhIADNeHH5xAF9saHdPb19If0CQ8MjonISk1OxETK8YvwCgkFCIqJr4xOS0kBoq7Ni8+sailtL27Hhulr6CpuLY4fKQRnGcyYbC5pK2+fwl3rqpwY2ylOPsAEduY6AA=") => 0
Tue, 11 Aug 2015 14:52:29 GMT: Commit("", "") => 0
Tue, 11 Aug 2015 14:52:29 GMT: LMSCommit("AJAXResult", " ") => 0
Tue, 11 Aug 2015 14:52:29 GMT: LMSCommit("result", "false") => 0
Tue, 11 Aug 2015 14:52:29 GMT: LMSCommit("errorCode", "101") => 0
Tue, 11 Aug 2015 14:52:44 GMT: LMSSetValue("cmi.core.session_time", "04:58:38") => 0
Tue, 11 Aug 2015 14:52:45 GMT: LMSSetValue("cmi.suspend_data", "N4IgJiBcCMAcAsBmWAGA7NANCANlAbNgG5QDaKmWATJopvJgKyb4C62ADlKDgIYDOAFwBqASwCmAd3FgAyjlFhxBYhMkARAK4AnXoNEB7AHZRoaAJxns/BUtmC94/txAoXRUf1GCZUQds1xbABjAwBbDhxxHwhIADNeHH5xAF9saHdPb19If0CQ8MjonISk1OwqTK8YvwCgkFCIqJr4xOS0kEQq7Ni8+sailtL27Hhulr6CpuLY4fKQRnGcyYbC5pK2+fwl3rqpwY2ylOPsAEduY6AA=") => 0
Tue, 11 Aug 2015 14:53:01 GMT: LMSSetValue("cmi.core.session_time", "04:58:54") => 0
Tue, 11 Aug 2015 14:53:01 GMT: LMSSetValue("cmi.suspend_data", "N4IgJiBcCMAcAsBWeAmAbLANCANlN2AblANoAMm0mKmAzJvJopmgLrYAOUoOAhgM4AXAGoBLAKYB3cWADKOUWHH4iEyQBEArgCdeg0QHsAdlGgB2AJy1GIfgqWzBe8f24gybwqP6jBMqILamuLYAMYGALYcOOJ+EJAAZrw4/OIAvtjQnt6+/pCBwWGR0bF5SSnp2CjZPnEBQSEg4VExdYnJqRkgtDW58QWNzSVt5Z3Y8L1tA0UtpfGjlSCIk3nTTcWtZR2LaCv9DTPDWxVpp9gAjtynQAA==") => 0
Tue, 11 Aug 2015 14:53:11 GMT: LMSSetValue("cmi.core.session_time", "04:59:05") => 0
Tue, 11 Aug 2015 14:53:12 GMT: LMSSetValue("cmi.suspend_data", "N4IgJiBcCMAcAsA2ArNATNANCANlR2AblANoAMmWamAzJvJspogLrYAOUoOAhgM4AXAGoBLAKYB3MWADKOEWDH4i4iQBEArgCceAkQHsAdlGgB2AJzwGIPvMUyBusXy4gyrwiL4iB0qAK0NMWwAY30AW3YcMV8ISAAzHhw+MQBfbGgPLx8/SACg0IiomNzE5LTsNCzvWP9A4JAwyOjahKSU9JAaapy4/Iam4tayjux4Htb+wuaSuJGKkGQJ3KnGopbS9oXEZb766aHN8tST7ABHLhOgAAA==") => 0
Tue, 11 Aug 2015 14:53:12 GMT: LMSSetValue("cmi.core.exit", "suspend") => 0
Tue, 11 Aug 2015 14:53:13 GMT: LMSFinish("AJAXResult", " ") => 0
Tue, 11 Aug 2015 14:53:14 GMT: LMSFinish("result", "false") => 0
Tue, 11 Aug 2015 14:53:14 GMT: LMSFinish("", "") => 0

Io vorrei fare in modo che se LMSCommit torna errorCode 101, allora aprire un popup di alert all'utente che la sua connessione è caduta e così, anzichè proseguire con la visione dello Scorm, deve uscire da moodle e riloggarsi.

Come posso gestire questo evento? Il catch del LMSCommit dovrei farlo all'interno di un qualche file di moodle (quale file?) oppure dentro il pacchetto scorm?

Per completezza, io uso scorm 1.2 generati da iSpringPro e moodle 2.3.4

Grazie per il vostro aiuto!


Media dei voti:  -
In riposta a Gino Bartali

Re: Avvisare un utente che sta usando scorm che la sua connessione è persa

di Andrea Bicciolo -
Immagine Core developers Immagine Plugin developers Immagine Translators

Per riferimento, la stessa domanda è stata posta anche nei forum in lingua inglese ed è stata data una risposta: https://moodle.org/mod/forum/discuss.php?d=318132

In riposta a Andrea Bicciolo

Re: Avvisare un utente che sta usando scorm che la sua connessione è persa

di Gino Bartali -

Sì ho visto, grazie. Sono sempre io ad aver scritto sia in italiano che in inglese.

Oggi ho installato un nuovo server con Moodle 2.7.9 ma dai miei test rimane il problema della perdita del tracciamento del completamento dello scorm, quando cade la connessione con moodle anche per pochi secondi.

Nel forum in inglese ho messo i dettagli del test.

C'è un modo per evitare che un utente concluda tutta l'attività scorm e poi si accorga che in realtà questa deve essere ripetuta perchè si è perso il salvataggio dei dati di completamento?

Con i dispositivi mobili, questa evenienza credo che possa capitare spesso.

Ho pensato anche ad aggiungere nel pacchetto scorm un javascript che esegue un LMSCommit ogni minuto, ma non si risolve nulla perchè se la connessione cade, poi anche se si ripristina, da lì in poi tutti i LMSCommit tornano l'errorCode 101 e quindi i dati non si salvano. Quindi non so come fare. Avete qualche suggerimento?

Grazie per l'aiuto!