From 531fa830a690c817c48d7872fd9b9ee5dbfeccf3 Mon Sep 17 00:00:00 2001 From: skodak Date: Fri, 10 Aug 2007 20:58:09 +0000 Subject: [PATCH] MDL-9552 support for new gradebook in scorm --- mod/scorm/aicc.php | 5 +- mod/scorm/datamodels/aicclib.php | 2 +- mod/scorm/datamodels/sequencinglib.php | 6 +- mod/scorm/db/upgrade.php | 8 ++ mod/scorm/lib.php | 143 ++++++++++++++++++++----- mod/scorm/version.php | 4 +- 6 files changed, 139 insertions(+), 29 deletions(-) diff --git a/mod/scorm/aicc.php b/mod/scorm/aicc.php index 6539e36f71..64b2de3a26 100755 --- a/mod/scorm/aicc.php +++ b/mod/scorm/aicc.php @@ -317,8 +317,10 @@ $value = scorm_add_time($track->value, $SESSION->scorm_session_time); $track->value = $value; $track->timemodified = time(); - $id = update_record('scorm_scoes_track',$track); + update_record('scorm_scoes_track',$track); + $id = $track->id; } else { + $track = new object(); $track->userid = $USER->id; $track->scormid = $scorm->id; $track->scoid = $sco->id; @@ -327,6 +329,7 @@ $track->timemodified = time(); $id = insert_record('scorm_scoes_track',$track); } + scorm_update_grades($scorm, $USER->id); } $SESSION->scorm_status = 'Terminated'; diff --git a/mod/scorm/datamodels/aicclib.php b/mod/scorm/datamodels/aicclib.php index add8d5fbf2..b39a054d4a 100644 --- a/mod/scorm/datamodels/aicclib.php +++ b/mod/scorm/datamodels/aicclib.php @@ -193,7 +193,7 @@ function scorm_parse_aicc($pkgdir,$scormid) { $launch = 0; if (isset($courses)) { foreach ($courses as $course) { - unset($sco); + $sco = new object(); $sco->identifier = $course->id; $sco->scorm = $scormid; $sco->organization = ''; diff --git a/mod/scorm/datamodels/sequencinglib.php b/mod/scorm/datamodels/sequencinglib.php index ea5b94da1f..0ced1826a8 100755 --- a/mod/scorm/datamodels/sequencinglib.php +++ b/mod/scorm/datamodels/sequencinglib.php @@ -354,14 +354,18 @@ function scorm_seq_is($what, $scoid, $userid, $attempt=0) { } function scorm_seq_set($what, $scoid, $userid, $attempt=0, $value='true') { + $sco = scorm_get_sco($scoid); /// set passed activity to active or not if ($value == false) { delete_record('scorm_scoes_track','scoid',$scoid,'userid',$userid,'attempt',$attempt,'element',$what); } else { - $sco = scorm_get_sco($scoid); scorm_insert_track($userid, $sco->scorm, $sco->id, 0, $what, $value); } + + // update grades in gradebook + $scorm = get_record('scorm', 'id', $sco->scorm); + scorm_update_grades($scorm, $userid, true); } function scorm_seq_exit_action_rules($seq,$userid) { diff --git a/mod/scorm/db/upgrade.php b/mod/scorm/db/upgrade.php index 4c643979e8..a8c11c5ff7 100644 --- a/mod/scorm/db/upgrade.php +++ b/mod/scorm/db/upgrade.php @@ -274,6 +274,14 @@ function xmldb_scorm_upgrade($oldversion=0) { } } + if ($result && $oldversion < 2007081001) { + require_once($CFG->dirroot.'/mod/scorm/lib.php'); + // too much debug output + $db->debug = false; + scorm_update_grades(); + $db->debug = true; + } + return $result; } diff --git a/mod/scorm/lib.php b/mod/scorm/lib.php index e53e8a6b68..035e9853d3 100755 --- a/mod/scorm/lib.php +++ b/mod/scorm/lib.php @@ -57,6 +57,8 @@ function scorm_add_instance($scorm) { set_field('scorm','launch',$scorm->launch,'id',$scorm->id); } + scorm_grade_item_update(stripslashes_recursive($scorm)); + return $id; } else { error(get_string('badpackage','scorm')); @@ -121,7 +123,11 @@ function scorm_update_instance($scorm) { $scorm->reference = $oldscorm->reference; // This fix a problem with Firefox when the teacher choose Cancel on overwrite question } - return update_record('scorm', $scorm); + if ($result = update_record('scorm', $scorm)) { + scorm_grade_item_update(stripslashes_recursive($scorm)); + } + + return $result; } /** @@ -187,7 +193,10 @@ function scorm_delete_instance($id) { } if (! delete_records('scorm_sequencing_ruleconditions', 'scormid', $scorm->id)) { $result = false; - }*/ + }*/ + + scorm_grade_item_delete(stripslashes_recursive($scorm)); + return $result; } @@ -203,9 +212,7 @@ function scorm_delete_instance($id) { * @return mixed */ function scorm_user_outline($course, $user, $mod, $scorm) { - - $return = NULL; - + global $CFG; require_once('locallib.php'); $return = scorm_grade_user($scorm, $user->id, true); @@ -404,35 +411,123 @@ function scorm_cron () { } /** -* Given a scorm id return all the grades of that activity -* -* @param int $scormid Scorm instance id -* @return mixed -*/ -function scorm_grades($scormid) { - + * Return grade for given user or all users. + * + * @param int $scormid id of scorm + * @param int $userid optional user id, 0 means all users + * @return array array of grades, false if none + */ +function scorm_get_user_grades($scorm, $userid=0) { global $CFG; + require_once('locallib.php'); + + $grades = array(); + if (empty($userid)) { + if ($scousers = get_records_select('scorm_scoes_track', "scormid='$scorm->id' GROUP BY userid", "", "userid,null")) { + foreach ($scousers as $scouser) { + $grades[$scouser->userid] = new object(); + $grades[$scouser->userid]->id = $scouser->userid; + $grades[$scouser->userid]->userid = $scouser->userid; + $grades[$scouser->userid]->rawgrade = scorm_grade_user($scorm, $scouser->userid); + } + } else { + return false; + } - if (!$scorm = get_record('scorm', 'id', $scormid)) { - return NULL; + } else { + if (!get_records_select('scorm_scoes_track', "scormid='$scorm->id' AND userid='$userid' GROUP BY userid", "", "userid,null")) { + return false; //no attempt yet + } + $grades[$userid] = new object(); + $grades[$userid]->id = $userid; + $grades[$userid]->userid = $userid; + $grades[$userid]->rawgrade = scorm_grade_user($scorm, $userid); } - if (($scorm->grademethod % 10) == 0) { // GRADESCOES - if (!$return->maxgrade = count_records_select('scorm_scoes',"scorm='$scormid' AND launch<>''")) { - return NULL; + return $grades; +} + +/** + * Update grades in central gradebook + * + * @param object $scorm null means all scormbases + * @param int $userid specific user only, 0 mean all + */ +function scorm_update_grades($scorm=null, $userid=0, $nullifnone=true) { + global $CFG; + if (!function_exists('grade_update')) { //workaround for buggy PHP versions + require_once($CFG->libdir.'/gradelib.php'); + } + + if ($scorm != null) { + if ($grades = scorm_get_user_grades($scorm, $userid)) { + grade_update('mod/scorm', $scorm->course, 'mod', 'scorm', $scorm->id, 0, $grades); + + } else if ($userid and $nullifnone) { + $grade = new object(); + $grade->userid = $userid; + $grade->rawgrade = NULL; + grade_update('mod/scorm', $scorm->course, 'mod', 'scorm', $scorm->id, 0, $grade); } + } else { - $return->maxgrade = $scorm->maxgrade; + $sql = "SELECT s.*, cm.idnumber as cmidnumber + FROM {$CFG->prefix}scorm s, {$CFG->prefix}course_modules cm, {$CFG->prefix}modules m + WHERE m.name='scorm' AND m.id=cm.module AND cm.instance=s.id"; + if ($rs = get_recordset_sql($sql)) { + if ($rs->RecordCount() > 0) { + while ($scorm = rs_fetch_next_record($rs)) { + scorm_grade_item_update($scorm); + scorm_update_grades($scorm, 0, false); + } + } + rs_close($rs); + } } +} - $return->grades = NULL; - if ($scousers=get_records_select('scorm_scoes_track', "scormid='$scormid' GROUP BY userid", "", "userid,null")) { - require_once('locallib.php'); - foreach ($scousers as $scouser) { - $return->grades[$scouser->userid] = scorm_grade_user($scorm, $scouser->userid); +/** + * Update/create grade item for given scorm + * + * @param object $scorm object with extra cmidnumber + * @return object grade_item + */ +function scorm_grade_item_update($scorm) { + global $CFG; + if (!function_exists('grade_update')) { //workaround for buggy PHP versions + require_once($CFG->libdir.'/gradelib.php'); + } + + $params = array('itemname'=>$scorm->name, 'idnumber'=>$scorm->cmidnumber); + + if (($scorm->grademethod % 10) == 0) { // GRADESCOES + if ($maxgrade = count_records_select('scorm_scoes',"scorm='$scorm->id' AND launch<>''")) { + $params['gradetype'] = GRADE_TYPE_VALUE; + $params['grademax'] = $maxgrade; + $params['grademin'] = 0; + } else { + $params['gradetype'] = GRADE_TYPE_NONE; } + } else { + $params['gradetype'] = GRADE_TYPE_VALUE; + $params['grademax'] = $scorm->maxgrade; + $params['grademin'] = 0; } - return $return; + + return grade_update('mod/scorm', $scorm->course, 'mod', 'scorm', $scorm->id, 0, NULL, $params); +} + +/** + * Delete grade item for given scorm + * + * @param object $scorm object + * @return object grade_item + */ +function scorm_grade_item_delete($scorm) { + global $CFG; + require_once($CFG->libdir.'/gradelib.php'); + + return grade_update('mod/scorm', $scorm->course, 'mod', 'scorm', $scorm->id, 0, NULL, array('deleted'=>1)); } function scorm_get_view_actions() { diff --git a/mod/scorm/version.php b/mod/scorm/version.php index f08ec757bf..f110d2d67e 100755 --- a/mod/scorm/version.php +++ b/mod/scorm/version.php @@ -10,8 +10,8 @@ // catch up now, so until 27th October please only increment in very tiny steps // in HEAD, until we get past that date.. -$module->version = 2007070300; // The (date) version of this module -$module->requires = 2007020200; // The version of Moodle that is required +$module->version = 2007081001; // The (date) version of this module +$module->requires = 2007081001; // The version of Moodle that is required $module->cron = 300; // How often should cron check this module (seconds)? ?> -- 2.39.5