Dan's fix from MDL-7263
[moodle.git] / mod / scorm / backuplib.php
blobd6c0ea245d5e858a8d6d25fbd2960cef35a4194e
1 <?php //$Id$
2 //This php script contains all the stuff to backup/restore
3 //scorm mods
5 //This is the "graphical" structure of the scorm mod:
6 //
7 // scorm
8 // (CL,pk->id)---------------------
9 // | |
10 // | |
11 // | |
12 // scorm_scoes |
13 // (UL,pk->id, fk->scorm) |
14 // | |
15 // | |
16 // | |
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) {
31 global $CFG;
33 $status = true;
35 //Iterate over scorm table
36 $scorms = get_records ("scorm","course",$preferences->backup_course,"id");
37 if ($scorms) {
38 foreach ($scorms as $scorm) {
39 if (backup_mod_selected($preferences,'scorm',$scorm->id)) {
40 $status = scorm_backup_one_mod($bf,$preferences,$scorm);
44 return $status;
47 function scorm_backup_one_mod($bf,$preferences,$scorm) {
48 $status = true;
50 if (is_numeric($scorm)) {
51 $scorm = get_record('scorm','id',$scorm);
54 //Start mod
55 fwrite ($bf,start_tag("MOD",3,true));
56 //Print scorm data
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
79 if ($status) {
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);
86 //End mod
87 $status =fwrite ($bf,end_tag("MOD",3,true));
88 return $status;
91 //Backup scorm_scoes contents (executed from scorm_backup_mods)
92 function backup_scorm_scoes ($bf,$preferences,$scorm) {
94 global $CFG;
96 $status = true;
98 $scorm_scoes = get_records("scorm_scoes","scorm",$scorm,"id");
99 //If there is scoes
100 if ($scorm_scoes) {
101 //Write start tag
102 $status =fwrite ($bf,start_tag("SCOES",4,true));
103 //Iterate over each sco
104 foreach ($scorm_scoes as $sco) {
105 //Start 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));
124 //End sco
125 $status =fwrite ($bf,end_tag("SCO",5,true));
127 //Write end tag
128 $status =fwrite ($bf,end_tag("SCOES",4,true));
130 return $status;
133 //Backup scorm_scoes_track contents (executed from scorm_backup_mods)
134 function backup_scorm_scoes_track ($bf,$preferences,$scorm) {
136 global $CFG;
138 $status = true;
140 $scorm_scoes_track = get_records("scorm_scoes_track","scormid",$scorm,"id");
141 //If there is track
142 if ($scorm_scoes_track) {
143 //Write start tag
144 $status =fwrite ($bf,start_tag("SCO_TRACKS",4,true));
145 //Iterate over each sco
146 foreach ($scorm_scoes_track as $sco_track) {
147 //Start 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));
155 //End sco track
156 $status =fwrite ($bf,end_tag("SCO_TRACK",5,true));
158 //Write end tag
159 $status =fwrite ($bf,end_tag("SCO_TRACKS",4,true));
161 return $status;
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)) {
167 $info = array();
168 foreach ($instances as $id => $instance) {
169 $info += scorm_check_backup_mods_instances($instance,$backup_unique_code);
171 return $info;
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);
177 } else {
178 $info[0][1] = 0;
181 //Now, if requested, the user_data
182 if ($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);
186 } else {
187 $info[1][1] = 0;
190 return $info;
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);
200 } else {
201 $info[$instance->id.'1'][1] = 0;
205 return $info;
209 function backup_scorm_files_instance($bf,$preferences,$instanceid) {
210 global $CFG;
212 $status = true;
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);
218 if ($status) {
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);
226 return $status;
230 //Backup scorm package files
231 function backup_scorm_files($bf,$preferences) {
233 global $CFG;
235 $status = true;
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
241 if ($status) {
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);
255 return $status;
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) {
263 global $CFG;
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);
275 return $result;
278 // INTERNAL FUNCTIONS. BASED IN THE MOD STRUCTURE
280 //Returns an array of scorms id
281 function scorm_ids ($course) {
283 global $CFG;
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) {
293 global $CFG;
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
299 s.scormid = a.id");
302 //Returns an array of scorm_scoes id
303 function scorm_scoes_track_ids_by_instance ($instanceid) {
305 global $CFG;
307 return get_records_sql ("SELECT s.id , s.scormid
308 FROM {$CFG->prefix}scorm_scoes_track s
309 WHERE s.scormid = $instanceid");