timemodified = time(); # May have to add extra stuff in here # return insert_record("scorm", $scorm); } function scorm_update_instance($scorm) { /// Given an object containing all the necessary data, /// (defined by the form in mod.html) this function /// will update an existing instance with new data. $scorm->timemodified = time(); $scorm->id = $scorm->instance; # May have to add extra stuff in here # return update_record("scorm", $scorm); } function scorm_delete_instance($id) { /// Given an ID of an instance of this module, /// this function will permanently delete the instance /// and any data that depends on it. require('../config.php'); if (! $scorm = get_record("scorm", "id", "$id")) { return false; } $result = true; # Delete any dependent files # scorm_delete_files($CFG->dataroot."/".$scorm->course."/moddata/scorm".$scorm->datadir); # Delete any dependent records here # if (! delete_records("scorm_sco_users", "scormid", "$scorm->id")) { $result = false; } if (! delete_records("scorm_scoes", "scorm", "$scorm->id")) { $result = false; } if (! delete_records("scorm", "id", "$scorm->id")) { $result = false; } return $result; } function scorm_user_outline($course, $user, $mod, $scorm) { /// Return a small object with summary information about what a /// user has done with a given particular instance of this module /// Used for user activity reports. /// $return->time = the time they did it /// $return->info = a short text description return $return; } function scorm_user_complete($course, $user, $mod, $scorm) { /// Print a detailed representation of what a user has done with /// a given particular instance of this module, for user activity reports. return true; } function scorm_print_recent_activity(&$logs, $isteacher=false) { /// Given a list of logs, assumed to be those since the last login /// this function prints a short list of changes related to this module /// If isteacher is true then perhaps additional information is printed. /// This function is called from course/lib.php: print_recent_activity() global $CFG, $COURSE_TEACHER_COLOR; $content = NULL; return $content; // True if anything was printed, otherwise false } function scorm_cron () { /// Function to be run periodically according to the moodle cron /// This function searches for things that need to be done, such /// as sending out mail, toggling flags etc ... global $CFG; return true; } function scorm_grades($scormid) { /// Must return an array of grades for a given instance of this module, /// indexed by user. It also returns a maximum allowed grade. global $CFG; $return->grades = NULL; if ($sco_users=get_records_select("scorm_sco_users", "scormid='$scormid' GROUP BY userid")) { foreach ($sco_users as $sco_user) { $user_data=get_records_select("scorm_sco_users","scormid='$scormid' AND userid='$sco_user->userid'"); $scores->completed=0; $scores->browsed=0; $scores->incomplete=0; $scores->failed=0; $scores->notattempted=0; $result=""; $data = current($user_data); foreach ($user_data as $data) { if ($data->cmi_core_lesson_status=="passed") $scores->completed++; else $scores->{scorm_remove_spaces($data->cmi_core_lesson_status)}++; } if ($scores->completed) $result.="wwwroot/mod/scorm/pix/completed.gif\" alt=\"".get_string("completed","scorm")."\" title=\"".get_string("completed","scorm")."\"> $scores->completed "; if ($scores->incomplete) $result.="wwwroot/mod/scorm/pix/incomplete.gif\" alt=\"".get_string("incomplete","scorm")."\" title=\"".get_string("incomplete","scorm")."\"> $scores->incomplete "; if ($scores->failed) $result.="wwwroot/mod/scorm/pix/failed.gif\" alt=\"".get_string("failed","scorm")."\" title=\"".get_string("failed","scorm")."\"> $scores->failed "; if ($scores->browsed) $result.="wwwroot/mod/scorm/pix/browsed.gif\" alt=\"".get_string("browsed","scorm")."\" title=\"".get_string("browsed","scorm")."\"> $scores->browsed "; if ($scores->notattempted) $result.="wwwroot/mod/scorm/pix/notattempted.gif\" alt=\"".get_string("notattempted","scorm")."\" title=\"".get_string("notattempted","scorm")."\"> $scores->notattempted "; $return->grades[$sco_user->userid]=$result; } } $return->maxgrade = count_records_select("scorm_scoes","scorm='$scormid' AND launch<>''"); return $return; } ////////////////////////////////////////////////////////////////////////////////////// /// Any other scorm functions go here. Each of them must have a name that /// starts with scorm_ function scorm_randstring($len = "8") { $rstring = NULL; for($i=0; $i<$len; $i++) { $char = chr(rand(48,122)); while (!ereg("[a-zA-Z0-9]", $char)){ if($char == $lchar) continue; $char = chr(rand(48,90)); } $rstring .= $char; $lchar = $char; } return $rstring; } function scorm_mkdirs($strPath) { if (is_dir($strPath)) return true; $pStrPath = dirname($strPath); if (!scorm_mkdirs($pStrPath)) return false; return mkdir($strPath); } function scorm_datadir($strPath, $existingdir="", $prefix = "SCORM") { if (($existingdir!="") && (is_dir($strPath.$existingdir))) return $strPath.$existingdir; if (is_dir($strPath)) { do { $datadir="/".$prefix.scorm_randstring(); } while (file_exists($strPath.$datadir)); mkdir($strPath.$datadir); return $strPath.$datadir; } else { return false; } } function scorm_validate($manifest) { if (is_file ($manifest)) { if (file_exists($manifest)) { return "regular"; } } else { return "nomanifest"; } } function scorm_delete_files($directory) { if (is_dir($directory)) { $handle=opendir($directory); while (($file = readdir($handle)) != '') { if ($file != "." && $file != "..") { if (!is_dir($directory."/".$file)) unlink($directory."/".$file); else scorm_delete_files($directory."/".$file); } } rmdir($directory); } } function scorm_startElement($parser, $name, $attrs) { global $manifest,$i,$resources,$parent,$level; if ($name == "ITEM") { $i++; $manifest[$i]["identifier"] = $attrs["IDENTIFIER"]; $manifest[$i]["identifierref"] = $attrs["IDENTIFIERREF"]; $manifest[$i]["isvisible"] = $attrs["ISVISIBLE"]; $manifest[$i]["parent"] = $parent[$level]; $level++; $parent[$level] = $attrs["IDENTIFIER"]; } if ($name == "RESOURCE") { $resources[$attrs["IDENTIFIER"]]["href"]=$attrs["HREF"]; $resources[$attrs["IDENTIFIER"]]["type"]=$attrs["ADLCP:SCORMTYPE"]; } } function scorm_endElement($parser, $name) { global $manifest,$i,$level,$datacontent,$navigation; if ($name == "ITEM") { $level--; } if ($name == "TITLE" && $level>0) $manifest[$i]["title"] = $datacontent; if ($name == "ADLCP:HIDERTSUI") $manifest[$i][$datacontent] = 1; } function scorm_characterData($parser, $data) { global $datacontent; $datacontent = $data; } function scorm_parse($basedir,$file,$scorm_id) { global $manifest,$i,$resources,$parent,$level; $datacontent = ""; $manifest[][] = ""; $resources[] = ""; $i = 0; $level = 0; $parent[$level] = "/"; $xml_parser = xml_parser_create(); // use case-folding so we are sure to find the tag in $map_array xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, true); xml_set_element_handler($xml_parser, "scorm_startElement", "scorm_endElement"); xml_set_character_data_handler($xml_parser, "scorm_characterData"); if (!($fp = fopen($basedir.$file, "r"))) { die("could not open XML input"); } while ($data = fread($fp, 4096)) { if (!xml_parse($xml_parser, $data, feof($fp))) { die(sprintf("XML error: %s at line %d", xml_error_string(xml_get_error_code($xml_parser)), xml_get_current_line_number($xml_parser))); } } xml_parser_free($xml_parser); $launch = 0; $sco->scorm = $scorm_id; delete_records("scorm_scoes","scorm",$scorm_id); delete_records("scorm_sco_users","scormid",$scorm_id); for ($j=1; $j<=$i; $j++) { $sco->identifier = $manifest[$j]["identifier"]; $sco->parent = $manifest[$j]["parent"]; $sco->title = $manifest[$j]["title"]; $sco->launch = $resources[$manifest[$j]["identifierref"]]["href"]; $sco->type = $resources[$manifest[$j]["identifierref"]]["type"]; $sco->previous = $manifest[$j]["previous"]; $sco->next = $manifest[$j]["continue"]; if (scorm_remove_spaces($manifest[$j]["isvisible"]) != "false") $id = insert_record("scorm_scoes",$sco); if ($launch==0 && $sco->launch) $launch = $id; } return $launch; } function scorm_get_scoes_records($sco_user) { /// Gets all info required to display the table of scorm results /// for report.php global $CFG; return get_records_sql("SELECT su.*, u.firstname, u.lastname, u.picture FROM {$CFG->prefix}scorm_sco_users su, {$CFG->prefix}user u WHERE su.scormid = '$sco_user->scormid' AND su.userid = u.id AND su.userid = $sco_user->userid ORDER BY scoid"); } function scorm_remove_spaces($sourcestr) { // Remove blank space from a string $newstr=""; for( $i=0; $i$len ) { return "".substr($stringa,0,$len-4)."...".substr($stringa,strlen($stringa)-1,1).""; } else return $stringa; } function scorm_external_link($link) { // check if a link is external $result = false; $link = strtolower($link); if (substr($link,0,7) == "http://") $result = true; else if (substr($link,0,8) == "https://") $result = true; else if (substr($link,0,4) == "www.") $result = true; else if (substr($link,0,7) == "rstp://") $result = true; else if (substr($link,0,6) == "rtp://") $result = true; else if (substr($link,0,6) == "ftp://") $result = true; else if (substr($link,0,9) == "gopher://") $result = true; return $result; } ?>