2 //This php script contains all the stuff to backup/restore
5 //This is the "graphical" structure of the scorm mod:
8 // (CL,pk->id)---------------------
13 // (UL,pk->id, fk->scorm) |
17 // scorm_scoes_track |
18 // (UL,k->id, fk->scormid, fk->scoid, k->element)---
20 // Meaning: pk->primary key field of the table
21 // fk->foreign key to link with parent
22 // nt->nested field (recursive data)
23 // CL->course level info
24 // UL->user level info
25 // files->table may have files)
27 //-----------------------------------------------------------
29 function scorm_backup_mods($bf,$preferences) {
35 //Iterate over scorm table
36 $scorms = get_records ("scorm","course",$preferences->backup_course
,"id");
38 foreach ($scorms as $scorm) {
39 if (backup_mod_selected($preferences,'scorm',$scorm->id
)) {
40 $status = scorm_backup_one_mod($bf,$preferences,$scorm);
47 function scorm_backup_one_mod($bf,$preferences,$scorm) {
50 if (is_numeric($scorm)) {
51 $scorm = get_record('scorm','id',$scorm);
55 fwrite ($bf,start_tag("MOD",3,true));
57 fwrite ($bf,full_tag("ID",4,false,$scorm->id
));
58 fwrite ($bf,full_tag("MODTYPE",4,false,"scorm"));
59 fwrite ($bf,full_tag("NAME",4,false,$scorm->name
));
60 fwrite ($bf,full_tag("REFERENCE",4,false,$scorm->reference
));
61 fwrite ($bf,full_tag("VERSION",4,false,$scorm->version
));
62 fwrite ($bf,full_tag("MAXGRADE",4,false,$scorm->maxgrade
));
63 fwrite ($bf,full_tag("GRADEMETHOD",4,false,$scorm->grademethod
));
64 fwrite ($bf,full_tag("LAUNCH",4,false,$scorm->launch
));
65 fwrite ($bf,full_tag("SKIPVIEW",4,false,$scorm->skipview
));
66 fwrite ($bf,full_tag("SUMMARY",4,false,$scorm->summary
));
67 fwrite ($bf,full_tag("HIDEBROWSE",4,false,$scorm->hidebrowse
));
68 fwrite ($bf,full_tag("HIDETOC",4,false,$scorm->hidetoc
));
69 fwrite ($bf,full_tag("HIDENAV",4,false,$scorm->hidenav
));
70 fwrite ($bf,full_tag("AUTO",4,false,$scorm->auto
));
71 fwrite ($bf,full_tag("POPUP",4,false,$scorm->popup
));
72 fwrite ($bf,full_tag("OPTIONS",4,false,$scorm->options
));
73 fwrite ($bf,full_tag("WIDTH",4,false,$scorm->width
));
74 fwrite ($bf,full_tag("HEIGHT",4,false,$scorm->height
));
75 fwrite ($bf,full_tag("TIMEMODIFIED",4,false,$scorm->timemodified
));
76 $status = backup_scorm_scoes($bf,$preferences,$scorm->id
);
78 //if we've selected to backup users info, then execute backup_scorm_scoes_track
80 if (backup_userdata_selected($preferences,'scorm',$scorm->id
)) {
81 $status = backup_scorm_scoes_track($bf,$preferences,$scorm->id
);
82 $status = backup_scorm_files_instance($bf,$preferences,$scorm->id
);
87 $status =fwrite ($bf,end_tag("MOD",3,true));
91 //Backup scorm_scoes contents (executed from scorm_backup_mods)
92 function backup_scorm_scoes ($bf,$preferences,$scorm) {
98 $scorm_scoes = get_records("scorm_scoes","scorm",$scorm,"id");
102 $status =fwrite ($bf,start_tag("SCOES",4,true));
103 //Iterate over each sco
104 foreach ($scorm_scoes as $sco) {
106 $status =fwrite ($bf,start_tag("SCO",5,true));
107 //Print submission contents
108 fwrite ($bf,full_tag("ID",6,false,$sco->id
));
109 fwrite ($bf,full_tag("MANIFEST",6,false,$sco->manifest
));
110 fwrite ($bf,full_tag("ORGANIZATION",6,false,$sco->organization
));
111 fwrite ($bf,full_tag("PARENT",6,false,$sco->parent
));
112 fwrite ($bf,full_tag("IDENTIFIER",6,false,$sco->identifier
));
113 fwrite ($bf,full_tag("LAUNCH",6,false,$sco->launch
));
114 fwrite ($bf,full_tag("PARAMETERS",6,false,$sco->parameters
));
115 fwrite ($bf,full_tag("SCORMTYPE",6,false,$sco->scormtype
));
116 fwrite ($bf,full_tag("TITLE",6,false,$sco->title
));
117 fwrite ($bf,full_tag("PREREQUISITES",6,false,$sco->prerequisites
));
118 fwrite ($bf,full_tag("MAXTIMEALLOWED",6,false,$sco->maxtimeallowed
));
119 fwrite ($bf,full_tag("TIMELIMITACTION",6,false,$sco->timelimitaction
));
120 fwrite ($bf,full_tag("DATAFROMLMS",6,false,$sco->datafromlms
));
121 fwrite ($bf,full_tag("MASTERYSCORE",6,false,$sco->masteryscore
));
122 fwrite ($bf,full_tag("NEXT",6,false,$sco->next
));
123 fwrite ($bf,full_tag("PREVIOUS",6,false,$sco->previous
));
125 $status =fwrite ($bf,end_tag("SCO",5,true));
128 $status =fwrite ($bf,end_tag("SCOES",4,true));
133 //Backup scorm_scoes_track contents (executed from scorm_backup_mods)
134 function backup_scorm_scoes_track ($bf,$preferences,$scorm) {
140 $scorm_scoes_track = get_records("scorm_scoes_track","scormid",$scorm,"id");
142 if ($scorm_scoes_track) {
144 $status =fwrite ($bf,start_tag("SCO_TRACKS",4,true));
145 //Iterate over each sco
146 foreach ($scorm_scoes_track as $sco_track) {
148 $status =fwrite ($bf,start_tag("SCO_TRACK",5,true));
149 //Print track contents
150 fwrite ($bf,full_tag("ID",6,false,$sco_track->id
));
151 fwrite ($bf,full_tag("USERID",6,false,$sco_track->userid
));
152 fwrite ($bf,full_tag("SCOID",6,false,$sco_track->scoid
));
153 fwrite ($bf,full_tag("ELEMENT",6,false,$sco_track->element
));
154 fwrite ($bf,full_tag("VALUE",6,false,$sco_track->value
));
156 $status =fwrite ($bf,end_tag("SCO_TRACK",5,true));
159 $status =fwrite ($bf,end_tag("SCO_TRACKS",4,true));
164 ////Return an array of info (name,value)
165 function scorm_check_backup_mods($course,$user_data=false,$backup_unique_code,$instances=null) {
166 if (!empty($instances) && is_array($instances) && count($instances)) {
168 foreach ($instances as $id => $instance) {
169 $info +
= scorm_check_backup_mods_instances($instance,$backup_unique_code);
173 //First the course data
174 $info[0][0] = get_string("modulenameplural","scorm");
175 if ($ids = scorm_ids ($course)) {
176 $info[0][1] = count($ids);
181 //Now, if requested, the user_data
183 $info[1][0] = get_string("scoes","scorm");
184 if ($ids = scorm_scoes_track_ids_by_course ($course)) {
185 $info[1][1] = count($ids);
193 function scorm_check_backup_mods_instances($instance,$backup_unique_code) {
194 $info[$instance->id
.'0'][0] = $instance->name
;
195 $info[$instance->id
.'0'][1] = '';
196 if (!empty($instance->userdata
)) {
197 $info[$instance->id
.'1'][0] = get_string("scoes","scorm");
198 if ($ids = scorm_scoes_track_ids_by_instance ($instance->id
)) {
199 $info[$instance->id
.'1'][1] = count($ids);
201 $info[$instance->id
.'1'][1] = 0;
209 function backup_scorm_files_instance($bf,$preferences,$instanceid) {
214 //First we check to moddata exists and create it as necessary
215 //in temp/backup/$backup_code dir
216 $status = check_and_create_moddata_dir($preferences->backup_unique_code
);
217 $status = check_dir_exists($CFG->dataroot
."/temp/backup/".$preferences->backup_unique_code
."/moddata/scorm/",true);
219 //Only if it exists !! Thanks to Daniel Miksik.
220 if (is_dir($CFG->dataroot
."/".$preferences->backup_course
."/".$CFG->moddata
."/scorm/".$instanceid)) {
221 $status = backup_copy_file($CFG->dataroot
."/".$preferences->backup_course
."/".$CFG->moddata
."/scorm/".$instanceid,
222 $CFG->dataroot
."/temp/backup/".$preferences->backup_unique_code
."/moddata/scorm/".$instanceid);
230 //Backup scorm package files
231 function backup_scorm_files($bf,$preferences) {
237 //First we check to moddata exists and create it as necessary
238 //in temp/backup/$backup_code dir
239 $status = check_and_create_moddata_dir($preferences->backup_unique_code
);
240 //Now copy the scorm dir
242 if (is_dir($CFG->dataroot
."/".$preferences->backup_course
."/".$CFG->moddata
."/scorm")) {
243 $handle = opendir($CFG->dataroot
."/".$preferences->backup_course
."/".$CFG->moddata
."/scorm");
244 while (false!==($item = readdir($handle))) {
245 if ($item != '.' && $item != '..' && is_dir($CFG->dataroot
."/".$preferences->backup_course
."/".$CFG->moddata
."/scorm/".$item)
246 && array_key_exists($item,$preferences->mods
['scorm']->instances
)
247 && !empty($preferences->mods
['scorm']->instances
[$item]->backup
)) {
248 $status = backup_copy_file($CFG->dataroot
."/".$preferences->backup_course
."/".$CFG->moddata
."/scorm/".$item,
249 $CFG->dataroot
."/temp/backup/".$preferences->backup_unique_code
."/moddata/scorm/",$item);
259 //Return a content encoded to support interactivities linking. Every module
260 //should have its own. They are called automatically from the backup procedure.
261 function scorm_encode_content_links ($content,$preferences) {
265 $base = preg_quote($CFG->wwwroot
,"/");
267 //Link to the list of scorms
268 $buscar="/(".$base."\/mod\/scorm\/index.php\?id\=)([0-9]+)/";
269 $result= preg_replace($buscar,'$@SCORMINDEX*$2@$',$content);
271 //Link to scorm view by moduleid
272 $buscar="/(".$base."\/mod\/scorm\/view.php\?id\=)([0-9]+)/";
273 $result= preg_replace($buscar,'$@SCORMVIEWBYID*$2@$',$result);
278 // INTERNAL FUNCTIONS. BASED IN THE MOD STRUCTURE
280 //Returns an array of scorms id
281 function scorm_ids ($course) {
285 return get_records_sql ("SELECT a.id, a.course
286 FROM {$CFG->prefix}scorm a
287 WHERE a.course = '$course'");
290 //Returns an array of scorm_scoes id
291 function scorm_scoes_track_ids_by_course ($course) {
295 return get_records_sql ("SELECT s.id , s.scormid
296 FROM {$CFG->prefix}scorm_scoes_track s,
297 {$CFG->prefix}scorm a
298 WHERE a.course = '$course' AND
302 //Returns an array of scorm_scoes id
303 function scorm_scoes_track_ids_by_instance ($instanceid) {
307 return get_records_sql ("SELECT s.id , s.scormid
308 FROM {$CFG->prefix}scorm_scoes_track s
309 WHERE s.scormid = $instanceid");