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!