/** * Tests for score submitted event validations. * * @dataProvider get_scoreraw_submitted_event_validations * * @param string $cmielement a valid CMI raw score element * @param string $cmivalue a valid CMI raw score value * @param string $failmessage the message used to fail the test in case of missing to violate a validation rule * @param string $excmessage the exception message when violating the validations rules */ public function test_scoreraw_submitted_event_validations($cmielement, $cmivalue, $failmessage, $excmessage) { $this->resetAfterTest(); try { $data = array('context' => context_module::instance($this->eventcm->id), 'courseid' => $this->eventcourse->id, 'other' => array('attemptid' => 2)); if ($cmielement != null) { $data['other']['cmielement'] = $cmielement; } if ($cmivalue != null) { $data['other']['cmivalue'] = $cmivalue; } \mod_scorm\event\scoreraw_submitted::create($data); $this->fail($failmessage); } catch (Exception $e) { $this->assertInstanceOf('coding_exception', $e); $this->assertEquals($excmessage, $e->getMessage()); } }
function scorm_insert_track($userid, $scormid, $scoid, $attempt, $element, $value, $forcecompleted=false, $trackdata = null) { global $DB, $CFG; $id = null; if ($forcecompleted) { // TODO - this could be broadened to encompass SCORM 2004 in future. if (($element == 'cmi.core.lesson_status') && ($value == 'incomplete')) { if ($track = $DB->get_record_select('scorm_scoes_track', 'userid=? AND scormid=? AND scoid=? AND attempt=? '. 'AND element=\'cmi.core.score.raw\'', array($userid, $scormid, $scoid, $attempt))) { $value = 'completed'; } } if ($element == 'cmi.core.score.raw') { if ($tracktest = $DB->get_record_select('scorm_scoes_track', 'userid=? AND scormid=? AND scoid=? AND attempt=? '. 'AND element=\'cmi.core.lesson_status\'', array($userid, $scormid, $scoid, $attempt))) { if ($tracktest->value == "incomplete") { $tracktest->value = "completed"; $DB->update_record('scorm_scoes_track', $tracktest); } } } if (($element == 'cmi.success_status') && ($value == 'passed' || $value == 'failed')) { if ($DB->get_record('scorm_scoes_data', array('scoid' => $scoid, 'name' => 'objectivesetbycontent'))) { $objectiveprogressstatus = true; $objectivesatisfiedstatus = false; if ($value == 'passed') { $objectivesatisfiedstatus = true; } if ($track = $DB->get_record('scorm_scoes_track', array('userid' => $userid, 'scormid' => $scormid, 'scoid' => $scoid, 'attempt' => $attempt, 'element' => 'objectiveprogressstatus'))) { $track->value = $objectiveprogressstatus; $track->timemodified = time(); $DB->update_record('scorm_scoes_track', $track); $id = $track->id; } else { $track = new stdClass(); $track->userid = $userid; $track->scormid = $scormid; $track->scoid = $scoid; $track->attempt = $attempt; $track->element = 'objectiveprogressstatus'; $track->value = $objectiveprogressstatus; $track->timemodified = time(); $id = $DB->insert_record('scorm_scoes_track', $track); } if ($objectivesatisfiedstatus) { if ($track = $DB->get_record('scorm_scoes_track', array('userid' => $userid, 'scormid' => $scormid, 'scoid' => $scoid, 'attempt' => $attempt, 'element' => 'objectivesatisfiedstatus'))) { $track->value = $objectivesatisfiedstatus; $track->timemodified = time(); $DB->update_record('scorm_scoes_track', $track); $id = $track->id; } else { $track = new stdClass(); $track->userid = $userid; $track->scormid = $scormid; $track->scoid = $scoid; $track->attempt = $attempt; $track->element = 'objectivesatisfiedstatus'; $track->value = $objectivesatisfiedstatus; $track->timemodified = time(); $id = $DB->insert_record('scorm_scoes_track', $track); } } } } } $track = null; if ($trackdata !== null) { if (isset($trackdata[$element])) { $track = $trackdata[$element]; } } else { $track = $DB->get_record('scorm_scoes_track', array('userid' => $userid, 'scormid' => $scormid, 'scoid' => $scoid, 'attempt' => $attempt, 'element' => $element)); } if ($track) { if ($element != 'x.start.time' ) { // Don't update x.start.time - keep the original value. if ($track->value != $value) { $track->value = $value; $track->timemodified = time(); $DB->update_record('scorm_scoes_track', $track); } $id = $track->id; } } else { $track = new stdClass(); $track->userid = $userid; $track->scormid = $scormid; $track->scoid = $scoid; $track->attempt = $attempt; $track->element = $element; $track->value = $value; $track->timemodified = time(); $id = $DB->insert_record('scorm_scoes_track', $track); $track->id = $id; } // Trigger updating grades based on a given set of SCORM CMI elements. $scorm = false; if (in_array($element, array('cmi.core.score.raw', 'cmi.score.raw')) || (in_array($element, array('cmi.completion_status', 'cmi.core.lesson_status', 'cmi.success_status')) && in_array($track->value, array('completed', 'passed')))) { $scorm = $DB->get_record('scorm', array('id' => $scormid)); include_once($CFG->dirroot.'/mod/scorm/lib.php'); scorm_update_grades($scorm, $userid); } // Trigger CMI element events. if (in_array($element, array('cmi.core.score.raw', 'cmi.score.raw')) || (in_array($element, array('cmi.completion_status', 'cmi.core.lesson_status', 'cmi.success_status')) && in_array($track->value, array('completed', 'failed', 'passed')))) { if (!$scorm) { $scorm = $DB->get_record('scorm', array('id' => $scormid)); } $cm = get_coursemodule_from_instance('scorm', $scormid); $data = array( 'other' => array('attemptid' => $attempt, 'cmielement' => $element, 'cmivalue' => $track->value), 'objectid' => $scorm->id, 'context' => context_module::instance($cm->id), 'relateduserid' => $userid ); if (in_array($element, array('cmi.core.score.raw', 'cmi.score.raw'))) { // Create score submitted event. $event = \mod_scorm\event\scoreraw_submitted::create($data); } else { // Create status submitted event. $event = \mod_scorm\event\status_submitted::create($data); } // Fix the missing track keys when the SCORM track record already exists, see $trackdata in datamodel.php. // There, for performances reasons, columns are limited to: element, id, value, timemodified. // Missing fields are: userid, scormid, scoid, attempt. $track->userid = $userid; $track->scormid = $scormid; $track->scoid = $scoid; $track->attempt = $attempt; // Trigger submitted event. $event->add_record_snapshot('scorm_scoes_track', $track); $event->add_record_snapshot('course_modules', $cm); $event->add_record_snapshot('scorm', $scorm); $event->trigger(); } return $id; }