ILIAS  release_5-1 Revision 5.0.0-5477-g43f3e3fab5f
class.ilObjSCORM2004LearningModule.php
Go to the documentation of this file.
1 <?php
2 
3 /* Copyright (c) 1998-2010 ILIAS open source, Extended GPL, see docs/LICENSE */
4 
5 require_once "./Modules/ScormAicc/classes/class.ilObjSCORMLearningModule.php";
6 
16 {
18 // var $meta_data;
19 
20  const CONVERT_XSL = './Modules/Scorm2004/templates/xsl/op/scorm12To2004.xsl';
21  const WRAPPER_HTML = './Modules/Scorm2004/scripts/converter/GenericRunTimeWrapper1.0_aadlc/GenericRunTimeWrapper.htm';
22  const WRAPPER_JS = './Modules/Scorm2004/scripts/converter/GenericRunTimeWrapper1.0_aadlc/SCOPlayerWrapper.js';
23 
30  function ilObjSCORM2004LearningModule($a_id = 0, $a_call_by_reference = true)
31  {
32  $this->type = "sahs";
33  parent::ilObject($a_id,$a_call_by_reference);
34  }
35 
41  function setImportSequencing($a_val)
42  {
43  $this->import_sequencing = $a_val;
44  }
45 
52  {
53  return $this->import_sequencing;
54  }
55 
62  function validate($directory)
63  {
64  //$this->validator =& new ilObjSCORMValidator($directory);
65  //$returnValue = $this->validator->validate();
66  return true;
67  }
68 
73  function readObject()
74  {
75  global $ilias, $lng ,$ilDB;
76 
77  //check for MYSQL 4.1 and json_encode,json_decode
78  if (!function_exists('json_encode') || !function_exists('json_decode') || ($ilDB->getDBType() == 'mysql' && !$ilDB->isMysql4_1OrHigher())) {
79  $ilias->raiseError($lng->txt('scplayer_phpmysqlcheck'),$ilias->error_obj->WARNING);
80  }
81 
82  $needs_convert = false;
83 
84  // convert imsmanifest.xml file in iso to utf8 if needed
85 
86  $manifest_file = $this->getDataDirectory()."/imsmanifest.xml";
87 
88  // check if manifestfile exists and space left on device...
89  $check_for_manifest_file = is_file($manifest_file);
90 
91 
92 
93  // if no manifestfile
94  if (!$check_for_manifest_file)
95  {
96  $this->ilias->raiseError($this->lng->txt("Manifestfile $manifest_file not found!"), $this->ilias->error_obj->MESSAGE);
97  return;
98  }
99 
100 
101  if ($check_for_manifest_file)
102  {
103  $manifest_file_array = file($manifest_file);
104 
105  foreach($manifest_file_array as $mfa)
106  {
107  // if (seems_not_utf8($mfa))
108  if (@iconv('UTF-8', 'UTF-8', $mfa) != $mfa)
109  {
110  $needs_convert = true;
111  break;
112  }
113  }
114 
115 
116 
117  // to copy the file we need some extraspace, counted in bytes *2 ... we need 2 copies....
118  $estimated_manifest_filesize = filesize($manifest_file) * 2;
119 
120  // i deactivated this, because it seems to fail on some windows systems (see bug #1795)
121  //$check_disc_free = disk_free_space($this->getDataDirectory()) - $estimated_manifest_filesize;
122  $check_disc_free = 2;
123  }
124 
125 
126  // if $manifest_file needs to be converted to UTF8
127  if ($needs_convert)
128  {
129  // if file exists and enough space left on device
130  if ($check_for_manifest_file && ($check_disc_free > 1))
131  {
132 
133  // create backup from original
134  if (!copy($manifest_file, $manifest_file.".old"))
135  {
136  echo "Failed to copy $manifest_file...<br>\n";
137  }
138 
139  // read backupfile, convert each line to utf8, write line to new file
140  // php < 4.3 style
141  $f_write_handler = fopen($manifest_file.".new", "w");
142  $f_read_handler = fopen($manifest_file.".old", "r");
143  while (!feof($f_read_handler))
144  {
145  $zeile = fgets($f_read_handler);
146  //echo mb_detect_encoding($zeile);
147  fputs($f_write_handler, utf8_encode($zeile));
148  }
149  fclose($f_read_handler);
150  fclose($f_write_handler);
151 
152  // copy new utf8-file to imsmanifest.xml
153  if (!copy($manifest_file.".new", $manifest_file))
154  {
155  echo "Failed to copy $manifest_file...<br>\n";
156  }
157 
158  if (!@is_file($manifest_file))
159  {
160  $this->ilias->raiseError($this->lng->txt("cont_no_manifest"),
161  $this->ilias->error_obj->WARNING);
162  }
163  }
164  else
165  {
166  // gives out the specific error
167 
168  if (!($check_disc_free > 1))
169  $this->ilias->raiseError($this->lng->txt("Not enough space left on device!"),$this->ilias->error_obj->MESSAGE);
170  return;
171  }
172 
173  }
174  else
175  {
176  // check whether file starts with BOM (that confuses some sax parsers, see bug #1795)
177  $hmani = fopen($manifest_file, "r");
178  $start = fread($hmani, 3);
179  if (strtolower(bin2hex($start)) == "efbbbf")
180  {
181  $f_write_handler = fopen($manifest_file.".new", "w");
182  while (!feof($hmani))
183  {
184  $n = fread($hmani, 900);
185  fputs($f_write_handler, $n);
186  }
187  fclose($f_write_handler);
188  fclose($hmani);
189 
190  // copy new utf8-file to imsmanifest.xml
191  if (!copy($manifest_file.".new", $manifest_file))
192  {
193  echo "Failed to copy $manifest_file...<br>\n";
194  }
195  }
196  else
197  {
198  fclose($hmani);
199  }
200  }
201 
202  //validate the XML-Files in the SCORM-Package
203  if ($_POST["validate"] == "y")
204  {
205  if (!$this->validate($this->getDataDirectory()))
206  {
207  $this->ilias->raiseError("<b>Validation Error(s):</b><br>".$this->getValidationSummary(),
208  $this->ilias->error_obj->WARNING);
209  }
210  }
211 
212 
213  //check for SCORM 1.2
214  $this->convert_1_2_to_2004($manifest_file);
215 
216  // start SCORM 2004 package parser/importer
217  include_once ("./Modules/Scorm2004/classes/ilSCORM13Package.php");
218  $newPack = new ilSCORM13Package();
219  if ($this->getEditable())
220  {
221  return $newPack->il_importLM($this,$this->getDataDirectory(),
222  $this->getImportSequencing());
223  }
224  else
225  {
226  return $newPack->il_import($this->getDataDirectory(),$this->getId(),$this->ilias,$_POST["validate"]);
227  }
228  }
229 
230 
231  public function fixReload() {
232  $out = file_get_contents($this->imsmanifestFile);
233  $check ='/xmlns="http:\/\/www.imsglobal.org\/xsd\/imscp_v1p1"/';
234  $replace="xmlns=\"http://www.imsproject.org/xsd/imscp_rootv1p1p2\"";
235  $out=preg_replace($check, $replace, $out);
236  file_put_contents($this->imsmanifestFile, $out);
237  }
238 
239 
240  public function convert_1_2_to_2004($manifest) {
241  global $ilDB, $ilLog;
242 
243  ##check manifest-file for version. Check for schemaversion as this is a required element for SCORM 2004
244  ##accept 2004 3rd Edition an CAM 1.3 as valid schemas
245 
246  //set variables
247  $this->packageFolder=$this->getDataDirectory();
248  $this->imsmanifestFile=$manifest;
249  $doc = new DomDocument();
250 
251  //fix reload errors before loading
252  $this->fixReload();
253  $doc->load($this->imsmanifestFile);
254  $elements = $doc->getElementsByTagName("schemaversion");
255  $schema=$elements->item(0)->nodeValue;
256  if (strtolower(trim($schema))=="cam 1.3" || strtolower(trim($schema))=="2004 3rd edition" || strtolower(trim($schema))=="2004 4th edition") {
257  //no conversion
258  $this->converted=false;
259  return true;
260 
261  } else {
262  $this->converted=true;
263  //convert to SCORM 2004
264 
265  //check for broken SCORM 1.2 manifest file (missing organization default-common error in a lot of manifest files)
266  $organizations = $doc->getElementsByTagName("organizations");
267  //first check if organizations is in manifest
268  if ($organizations->item(0)==null) die("organizations missing in manifest");
269  $default=$organizations->item(0)->getAttribute("default");
270  if ($default=="" || $default==null) {
271  //lookup identifier
272  $organization = $doc->getElementsByTagName("organization");
273  $ident=$organization->item(0)->getAttribute("identifier");
274  $organizations->item(0)->setAttribute("default",$ident);
275  }
276 
277  //validate the fixed mainfest. If it's still not valid, don't transform an throw error
278 
279 
280  //first copy wrappers
281  $wrapperdir=$this->packageFolder."/GenericRunTimeWrapper1.0_aadlc";
282  mkdir($wrapperdir);
283  copy(self::WRAPPER_HTML,$wrapperdir."/GenericRunTimeWrapper.htm");
284  copy(self::WRAPPER_JS,$wrapperdir."/SCOPlayerWrapper.js");
285 
286  //backup manifestfile
287  $this->backupManifest=$this->packageFolder."/imsmanifest.xml.back";
288  $ret=copy($this->imsmanifestFile,$this->backupManifest);
289 
290  //transform manifest file
291  $this->totransform = $doc;
292  $ilLog->write("SCORM: about to transform to SCORM 2004");
293 
294  $xsl = new DOMDocument;
295  $xsl->async = false;
296  $xsl->load(self::CONVERT_XSL);
297  $prc = new XSLTProcessor;
298  $r = @$prc->importStyleSheet($xsl);
299 
300  file_put_contents($this->imsmanifestFile, $prc->transformToXML($this->totransform));
301 
302  $ilLog->write("SCORM: Transformation completed");
303  return true;
304  }
305 
306  }
307 
315  public static function _lookupLastAccess($a_obj_id, $a_usr_id)
316  {
317  global $ilDB;
318 
319  $result = $ilDB->queryF('
320  SELECT MAX(c_timestamp) last_access
321  FROM cmi_node, cp_node
322  WHERE cmi_node.cp_node_id = cp_node.cp_node_id
323  AND cp_node.slm_id = %s
324  AND user_id = %s
325  GROUP BY c_timestamp',
326  array('integer', 'integer'),
327  array($a_obj_id, $a_usr_id));
328  if ($ilDB->numRows($result))
329  {
330  $row = $ilDB->fetchAssoc($result);
331  return $row["last_access"];
332  }
333 
334  return "";
335  }
336 
340  // function getTrackedUsers($a_search)
341  // {
342  // global $ilUser, $ilDB, $ilUser;
343 
344  // $sco_set = $ilDB->queryF('
345  // SELECT DISTINCT user_id,MAX(c_timestamp) last_access
346  // FROM cmi_node, cp_node
347  // WHERE cmi_node.cp_node_id = cp_node.cp_node_id
348  // AND cp_node.slm_id = %s
349  // GROUP BY user_id',
350  // array('integer'),
351  // array($this->getId()));
352 
353  // $items = array();
354  // $temp = array();
355 
356  // while($sco_rec = $ilDB->fetchAssoc($sco_set))
357  // {
358  // $name = ilObjUser::_lookupName($sco_rec["user_id"]);
359  // if ($sco_rec['last_access'] != 0) {
360 // // $sco_rec['last_access'] = $sco_rec['last_access'];
361  // } else {
362  // $sco_rec['last_access'] = "";
363  // }
364  // if (ilObject::_exists($sco_rec['user_id']) && ilObject::_lookUpType($sco_rec['user_id'])=="usr" ) {
365  // $user = new ilObjUser($sco_rec['user_id']);
366  // $temp = array("user_full_name" => $name["lastname"].", ".
367  // $name["firstname"]." [".ilObjUser::_lookupLogin($sco_rec["user_id"])."]",
368  // "user_id" => $sco_rec["user_id"],"last_access" => $sco_rec['last_access'],
369  // "version"=> $this->getModuleVersionForUser($sco_rec["user_id"]),
370  // "attempts" => $this->getAttemptsForUser($sco_rec["user_id"]),
371  // "username" => $user->getLastname().", ".$user->getFirstname()
372  // );
373  // if ($a_search != "" && (strpos(strtolower($user->getLastname()), strtolower($a_search)) !== false || strpos(strtolower($user->getFirstname()), strtolower($a_search)) !== false ) ) {
374  // $items[] = $temp;
375  // } else if ($a_search == "") {
376  // $items[] = $temp;
377  // }
378  // }
379  // }
380 
381  // return $items;
382  // }
383 
384  function deleteTrackingDataOfUsers($a_users)
385  {
386  global $ilDB;
387  include_once("./Modules/Scorm2004/classes/class.ilSCORM2004DeleteData.php");
388  include_once("./Services/Tracking/classes/class.ilLPStatusWrapper.php");
389  include_once("./Services/Tracking/classes/class.ilChangeEvent.php");
391 
392  foreach($a_users as $user)
393  {
395  ilLPStatusWrapper::_updateStatus($this->getId(), $user);
396  }
397  }
398 
399 
403  function getTrackedItems()
404  {
405  global $ilUser, $ilDB, $ilUser;
406 
407  $sco_set = $ilDB->queryF('
408  SELECT DISTINCT cmi_node.cp_node_id id
409  FROM cp_node, cmi_node
410  WHERE slm_id = %s
411  AND cp_node.cp_node_id = cmi_node.cp_node_id
412  ORDER BY cp_node.cp_node_id ',
413  array('integer'),
414  array($this->getId()));
415 
416  $items = array();
417 
418  while($sco_rec = $ilDB->fetchAssoc($sco_set))
419  {
420  $item['id']=$sco_rec["id"];
421  $item['title']=self::_lookupItemTitle($sco_rec["id"]);
422  $items[count($items)] =$item;
423 
424  }
425  return $items;
426  }
427 
428 
429  function getTrackingDataAgg($a_user_id, $raw = false)
430  {
431  global $ilDB;
432 
433  $scos = array();
434  $data = array();
435  //get all SCO's of this object
436 
437  $val_set = $ilDB->queryF(
438  'SELECT cp_node_id FROM cp_node
439  WHERE nodename = %s
440  AND cp_node.slm_id = %s',
441  array('text', 'integer'),
442  array('item',$this->getId())
443  );
444  while($val_rec = $ilDB->fetchAssoc($val_set))
445  {
446  array_push($scos,$val_rec['cp_node_id']);
447  }
448 
449  foreach ($scos as $sco)
450  {
451  $data_set = $ilDB->queryF('
452  SELECT c_timestamp last_access, total_time, success_status, completion_status,
453  c_raw, scaled, cp_node_id
454  FROM cmi_node
455  WHERE cp_node_id = %s
456  AND user_id = %s',
457  array('integer','integer'),
458  array($sco,$a_user_id)
459  );
460 
461  while($data_rec = $ilDB->fetchAssoc($data_set))
462  {
463  if ($data_rec["success_status"]!="" && $data_rec["success_status"]!="unknown") {
464  $status = $data_rec["success_status"];
465  } else {
466  if ($data_rec["completion_status"]=="") {
467  $status="unknown";
468  } else {
469  $status = $data_rec["completion_status"];
470  }
471  }
472  if(!$raw)
473  {
474  $time = ilFormat::_secondsToString(self::_ISODurationToCentisec($data_rec["total_time"])/100);
475  $score = "";
476  if ($data_rec["c_raw"] != null) {
477  $score = $data_rec["c_raw"];
478  if ($data_rec["scaled"] != null) $score .= " = ";
479  }
480  if ($data_rec["scaled"] != null) $score .= ($data_rec["scaled"]*100)."%";
481  $title = self::_lookupItemTitle($data_rec["cp_node_id"]);
482  $last_access=ilDatePresentation::formatDate(new ilDateTime($data_rec['last_access'],IL_CAL_UNIX));
483  $data[] = array("user_id" => $data_rec["user_id"], "sco_id"=>$data_rec["cp_node_id"],
484  "score" => $score, "time" => $time, "status" => $status,"last_access"=>$last_access,"title"=>$title);
485  }
486  else
487  {
488  $data_rec["total_time"] = self::_ISODurationToCentisec($data_rec["total_time"])/100;
489  $data[$data_rec["cp_node_id"]] = $data_rec;
490  }
491  }
492  }
493 
494 
495  return $data;
496  }
497 
501  function getAttemptsForUser($a_user_id){
502  global $ilDB;
503  $val_set = $ilDB->queryF('SELECT package_attempts FROM sahs_user WHERE user_id = %s AND obj_id = %s',
504  array('integer','integer'),
505  array($a_user_id, $this->getId()));
506 
507  $val_rec = $ilDB->fetchAssoc($val_set);
508 
509  if ($val_rec["package_attempts"] == null) {
510  $val_rec["package_attempts"]="";
511  }
512 
513  return $val_rec["package_attempts"];
514  }
515 
516 
520  function getModuleVersionForUser($a_user_id){
521  global $ilDB;
522  $val_set = $ilDB->queryF('SELECT module_version FROM sahs_user WHERE user_id = %s AND obj_id = %s',
523  array('integer','integer'),
524  array($a_user_id, $this->getId()));
525 
526  $val_rec = $ilDB->fetchAssoc($val_set);
527 
528  if ($val_rec["module_version"] == null) {
529  $val_rec["module_version"]="";
530  }
531  return $val_rec["module_version"];
532  }
533 
534 
535  // function exportSelected($a_exportall = 0, $a_user = array())
536  // {
537  // include_once("./Modules/Scorm2004/classes/class.ilSCORM2004TrackingItemsExport.php");
538  // ilSCORM2004TrackingItemsExport::exportSelected($a_exportall = 0, $a_user = array());
539  // }
540 
541 
542 
543  function importSuccess($a_file) {
544  global $ilDB, $ilUser;
545  include_once("./Services/Tracking/classes/class.ilLPStatus.php");
546  $scos = array();
547  //get all SCO's of this object ONLY RELEVANT!
548  include_once './Services/Object/classes/class.ilObjectLP.php';
549  $olp = ilObjectLP::getInstance($this->getId());
550  $collection = $olp->getCollectionInstance();
551  if($collection)
552  {
553  $scos = $collection->getItems();
554  }
555 
556  $fhandle = fopen($a_file, "r");
557 
558  $obj_id = $this->getID();
559  $users = array();
560  $usersToDelete = array();
561  $fields = fgetcsv($fhandle, 4096, ';');
562  while(($csv_rows = fgetcsv($fhandle, 4096, ";")) !== FALSE) {
563  $data = array_combine($fields, $csv_rows);
564  //no check the format - sufficient to import users
565  if ($data["Login"]) $user_id = $this->get_user_id($data["Login"]);
566  if ($data["login"]) $user_id = $this->get_user_id($data["login"]);
567  //add mail in future
568  if ($data["user"] && is_numeric($data["user"])) $user_id = $data["user"];
569  if ($user_id>0) {
570  $last_access = ilUtil::now();
571  if ($data['Date']) {
572  $date_ex = explode('.', $data['Date']);
573  $last_access = implode('-', array($date_ex[2], $date_ex[1], $date_ex[0]));
574  }
575  if ($data['LastAccess']) {
576  $last_access = $data['LastAccess'];
577  }
578 
580 
581  if ($data["Status"]) {
582  if (is_numeric($data["Status"])) $status = $data["Status"];
586  }
587  $attempts = null;
588  if($data["Attempts"]) $attempts = $data["Attempts"];
589 
590  $percentage_completed = 0;
591  if ($status == ilLPStatus::LP_STATUS_COMPLETED_NUM) $percentage_completed = 100;
592  else if ($data['percentageCompletedSCOs']) $percentage_completed = $data['percentageCompletedSCOs'];
593 
594  $sco_total_time_sec = null;
595  if ($data['SumTotal_timeSeconds']) $sco_total_time_sec = $data['SumTotal_timeSeconds'];
596 
597  if ($status == ilLPStatus::LP_STATUS_NOT_ATTEMPTED) {
598  $usersToDelete[] = $user_id;
599  } else {
600  $this->importSuccessForSahsUser($user_id, $last_access, $status, $attempts, $percentage_completed, $sco_total_time_sec);
601  $users[] = $user_id;
602  }
603 
604  if ($status == ilLPStatus::LP_STATUS_COMPLETED_NUM) {
605  foreach ($scos as $sco_id)
606  {
607  $res = $ilDB->queryF('
608  SELECT completion_status, success_status, user_id FROM cmi_node WHERE cp_node_id = %s AND user_id = %s',
609  array('integer','integer'),
610  array($sco_id,$user_id)
611  );
612 
613  if(!$ilDB->numRows($res))
614  {
615  $nextId = $ilDB->nextId('cmi_node');
616  $val_set = $ilDB->manipulateF('INSERT INTO cmi_node
617  (cp_node_id,user_id,completion_status,c_timestamp,cmi_node_id)
618  VALUES(%s,%s,%s,%s,%s)',
619  array('integer','integer','text','timestamp','integer'),
620  array($sco_id,$user_id,'completed',$last_access,$nextId));
621  } else {
622  $doUpdate = false;
623  while ($row = $ilDB->fetchAssoc($res)) {
624  if ( ($row["completion_status"] == "completed" && $row["success_status"] != "failed") || $row["success_status"] == "passed") {
625  if ($doUpdate != true) $doUpdate = false; //note for issue if there are 2 entries for same sco_id
626  } else {
627  $doUpdate = true;
628  }
629  }
630  if ($doUpdate == true) {
631  $ilDB->update('cmi_node',
632  array(
633  'completion_status' => array('text', 'completed'),
634  'success_status' => array('text', ''),
635  'suspend_data' => array('text', ''),
636  'c_timestamp' => array('timestamp', $last_access)
637  ),
638  array(
639  'user_id' => array('integer', $user_id),
640  'cp_node_id' => array('integer', $sco_id)
641  )
642  );
643  }
644  }
645  }
646 
647  }
648  } else {
649  //echo "Warning! User $csv_rows[0] does not exist in ILIAS. Data for this user was skipped.\n";
650  }
651  }
652 
653  if (count($usersToDelete)>0) {
654  // include_once("./Services/Tracking/classes/class.ilLPMarks.php");
655  // ilLPMarks::_deleteForUsers($this->getId(), $usersToDelete);
656  $this->deleteTrackingDataOfUsers($usersToDelete);
657  }
658  include_once("./Services/Tracking/classes/class.ilLPStatusWrapper.php");
659  ilLPStatusWrapper::_refreshStatus($this->getId(),$users);
660 
661  return 0;
662  }
663 
670  function _ISODurationToCentisec($str) {
671  $aV = array(0, 0, 0, 0, 0, 0);
672  $bErr = false;
673  $bTFound = false;
674  if (strpos($str,"P") != 0) {
675  $bErr = true;
676  }
677  if (!$bErr) {
678  $aT = array("Y", "M", "D", "H", "M", "S");
679  $p = 0;
680  $i = 0;
681  $str = substr($str,1);
682  for ($i = 0; $i < count($aT); $i++) {
683  if (strpos($str,"T")===0) {
684  $str = substr($str,1);
685  $i = max($i, 3);
686  $bTFound = true;
687  }
688  $p = strpos($str,$aT[$i]);
689 
690  if ($p > -1) {
691  if ($i == 1 && strpos($str,"T") > -1 && strpos($str,"T") < $p) {
692  continue;
693  }
694  if ($aT[$i] == "S") {
695  $aV[$i] = substr($str,0, $p);
696 
697  } else {
698  $aV[$i] = intval(substr($str,0, $p));
699  }
700  if (!is_numeric($aV[$i])) {
701  $bErr = true;
702  break;
703  } else if ($i > 2 && !$bTFound) {
704  $bErr = true;
705  break;
706  }
707  $str = substr($str,$p + 1);
708 
709  }
710  }
711  if (!$bErr && strlen($str) != 0) {
712  $bErr = true;
713 
714  }
715  }
716 
717  if ($bErr) {
718  return;
719  }
720  return $aV[0] * 3155760000 + $aV[1] * 262980000 + $aV[2] * 8640000 + $aV[3] * 360000 + $aV[4] * 6000 + round($aV[5] * 100);
721  }
722 
723  function getCourseCompletionForUser($a_user)
724  {
725  global $ilDB, $ilUser;
726 
727  $scos = array();
728  //get all SCO's of this object
729 
730  $val_set = $ilDB->queryF('
731  SELECT cp_node.cp_node_id FROM cp_node,cp_resource,cp_item
732  WHERE cp_item.cp_node_id = cp_node.cp_node_id
733  AND cp_item.resourceid = cp_resource.id
734  AND scormtype = %s
735  AND nodename = %s
736  AND cp_node.slm_id = %s ',
737  array('text','text','integer'),
738  array('sco','item',$this->getId()));
739 
740  while ($val_rec = $ilDB->fetchAssoc($val_set))
741  {
742  array_push($scos,$val_rec['cp_node_id']);
743  }
744 
745 
746  $scos_c = $scos;
747  //copy SCO_array
748  //check if all SCO's are completed
749  for ($i=0;$i<count($scos);$i++)
750  {
751 
752  $val_set = $ilDB->queryF('
753  SELECT * FROM cmi_node
754  WHERE (user_id= %s
755  AND cp_node_id= %s
756  AND (completion_status=%s OR success_status=%s))',
757  array('integer','integer','text', 'text'),
758  array($a_user,$scos[$i],'completed','passed')
759  );
760 
761  if ($ilDB->numRows($val_set) > 0) {
762  //delete from array
763  $key = array_search($scos[$i], $scos_c);
764  unset ($scos_c[$key]);
765  }
766 
767  }
768  //check for completion
769  if (count($scos_c) == 0) {
770  $completion = true;
771  } else {
772  $completion = false;
773  }
774  return $completion;
775  }
776 
783  public static function _getCourseCompletionForUser($a_id, $a_user)
784  {
785  global $ilDB, $ilUser;
786  $scos = array();
787  //get all SCO's of the object
788 
789  $val_set = $ilDB->queryF('
790  SELECT cp_node.cp_node_id FROM cp_node,cp_resource,cp_item
791  WHERE cp_item.cp_node_id = cp_node.cp_node_id
792  AND cp_item.resourceid = cp_resource.id
793  AND scormtype = %s
794  AND nodename = %s
795  AND cp_node.slm_id = %s',
796  array('text','text','integer'), array('sco' ,'item',$a_id));
797  while ($val_rec = $ilDB->fetchAssoc($val_set))
798  {
799  array_push($scos,$val_rec['cp_node_id']);
800  }
801 
802  $scos_c = $scos;
803  //copy SCO_array
804  //check if all SCO's are completed
805  for ($i=0;$i<count($scos);$i++)
806  {
807 
808  $val_set = $ilDB->queryF('
809  SELECT * FROM cmi_node
810  WHERE (user_id= %s
811  AND cp_node_id= %s
812  AND (completion_status = %s OR success_status = %s))',
813  array('integer','integer','text','text'),
814  array($a_user,$scos[$i],'completed','passed'));
815 
816  if ($ilDB->numRows($val_set) > 0)
817  {
818  //delete from array
819  $key = array_search($scos[$i], $scos_c);
820  unset ($scos_c[$key]);
821  }
822 
823  }
824  //check for completion
825  if (count($scos_c) == 0) {
826  $completion = true;
827  } else {
828  $completion = false;
829  }
830  return $completion;
831  }
832 
840  public static function _getUniqueScaledScoreForUser($a_id, $a_user)
841  {
842  global $ilDB, $ilUser;
843  $scos = array();
844 
845  $val_set = $ilDB->queryF("SELECT cp_node.cp_node_id FROM cp_node,cp_resource,cp_item WHERE".
846  " cp_item.cp_node_id=cp_node.cp_node_id AND cp_item.resourceId = cp_resource.id AND scormType='sco' AND nodeName='item' AND cp_node.slm_id = %s GROUP BY cp_node.cp_node_id",
847  array('integer'),
848  array($a_id)
849  );
850  while ($val_rec = $ilDB->fetchAssoc($val_set))
851  {
852  array_push($scos,$val_rec['cp_node_id']);
853  }
854  $set = 0; //numbers of SCO that set cmi.score.scaled
855  $scaled = null;
856  for ($i=0;$i<count($scos);$i++)
857  {
858  $val_set = $ilDB->queryF("SELECT scaled FROM cmi_node WHERE (user_id = %s AND cp_node_id = %s)",
859  array('integer', 'integer'),
860  array($a_user, $scos[$i])
861  );
862  if ($val_set->numRows()>0)
863  {
864  $val_rec = $ilDB->fetchAssoc($val_set);
865  if ($val_rec['scaled']!=NULL) {
866  $set++;
867  $scaled = $val_rec['scaled'];
868  }
869  }
870  }
871  $retVal = ($set == 1) ? $scaled : null ;
872  return $retVal;
873  }
874 
883  function _getTrackingItems($a_obj_id)
884  {
885  global $ilDB;
886 
887 
888  $item_set = $ilDB->queryF('
889  SELECT cp_item.* FROM cp_node, cp_item WHERE slm_id = %s
890  AND cp_node.cp_node_id = cp_item.cp_node_id
891  ORDER BY cp_node.cp_node_id ',
892  array('integer'),
893  array($a_obj_id)
894  );
895 
896  $items = array();
897  while ($item_rec = $ilDB->fetchAssoc($item_set))
898  {
899 
900  $s2 = $ilDB->queryF('
901  SELECT cp_resource.* FROM cp_node, cp_resource
902  WHERE slm_id = %s
903  AND cp_node.cp_node_id = cp_resource.cp_node_id
904  AND cp_resource.id = %s ',
905  array('integer','text'),
906  array($a_obj_id,$item_rec["resourceid"])
907  );
908 
909 
910  if ($res = $ilDB->fetchAssoc($s2))
911 
912  {
913  if ($res["scormtype"] == "sco")
914  {
915  $items[] = array("id" => $item_rec["cp_node_id"],
916  "title" => $item_rec["title"]);
917  }
918  }
919  }
920 
921  return $items;
922  }
923 
924  static function _getStatus($a_obj_id, $a_user_id)
925  {
926  global $ilDB;
927 
928  $status_set = $ilDB->queryF('
929  SELECT * FROM cmi_gobjective
930  WHERE scope_id = %s
931  AND objective_id = %s
932  AND user_id = %s',
933  array('integer','text','integer'),
934  array($a_obj_id,'course_overall_status',$a_user_id)
935  );
936 
937  if ($status_rec = $ilDB->fetchAssoc($status_set))
938  {
939  return $status_rec["status"];
940  }
941 
942  return false;
943  }
944 
945  static function _getSatisfied($a_obj_id, $a_user_id)
946  {
947  global $ilDB;
948 
949 
950  $status_set = $ilDB->queryF('
951  SELECT * FROM cmi_gobjective
952  WHERE scope_id = %s
953  AND objective_id = %s
954  AND user_id = %s',
955  array('integer','text','integer'),
956  array($a_obj_id,'course_overall_status',$a_user_id)
957  );
958 
959  if ($status_rec = $ilDB->fetchAssoc($status_set))
960  {
961  return $status_rec["satisfied"];
962  }
963 
964  return false;
965  }
966 
967  static function _getMeasure($a_obj_id, $a_user_id)
968  {
969  global $ilDB;
970 
971  $status_set = $ilDB->queryF('
972  SELECT * FROM cmi_gobjective
973  WHERE scope_id = %s
974  AND objective_id = %s
975  AND user_id = %s',
976  array('integer','text','integer'),
977  array($a_obj_id,'course_overall_status',$a_user_id)
978  );
979 
980  if ($status_rec = $ilDB->fetchAssoc($status_set))
981  {
982  return $status_rec["measure"];
983  }
984 
985  return false;
986  }
987 
988  static function _lookupItemTitle($a_node_id)
989  {
990  global $ilDB;
991 
992  $r = $ilDB->queryF('
993  SELECT * FROM cp_item
994  WHERE cp_node_id = %s',
995  array('integer'),
996  array($a_node_id)
997  );
998 
999  if ($i = $ilDB->fetchAssoc($r))
1000  {
1001  return $i["title"];
1002  }
1003  return "";
1004  }
1005 
1010  {
1011  include_once("./Modules/Scorm2004/classes/class.ilSCORM2004Tree.php");
1012  $this->slm_tree = new ilSCORM2004Tree($this->getId());
1013 
1014  //$this->slm_tree =& new ilTree($this->getId());
1015  //$this->slm_tree->setTreeTablePK("slm_id");
1016  //$this->slm_tree->setTableNames('sahs_sc13_tree', 'sahs_sc13_tree_node');
1017  $this->slm_tree->addTree($this->getId(), 1);
1018 
1019  //add seqinfo for rootNode
1020  include_once ("./Modules/Scorm2004/classes/seq_editor/class.ilSCORM2004Sequencing.php");
1021  $seq_info = new ilSCORM2004Sequencing($this->getId(),true);
1022  $seq_info->insert();
1023  }
1024 
1025  function getTree()
1026  {
1027  $this->slm_tree = new ilTree($this->getId());
1028  $this->slm_tree->setTreeTablePK("slm_id");
1029  $this->slm_tree->setTableNames('sahs_sc13_tree', 'sahs_sc13_tree_node');
1030  return $this->slm_tree;
1031  }
1032 
1034 
1035  global $ilTabs;
1036  $ilTabs->setTabActive("sequencing");
1037 
1038  include_once ("./Modules/Scorm2004/classes/seq_editor/class.ilSCORM2004Sequencing.php");
1039  $control_settings = new ilSCORM2004Sequencing($this->getId(),true);
1040 
1041  return $control_settings;
1042  }
1043 
1045  include_once ("./Modules/Scorm2004/classes/seq_editor/class.ilSCORM2004Sequencing.php");
1046 
1047  $control_settings = new ilSCORM2004Sequencing($this->getId(),true);
1048  $control_settings->setChoice(ilUtil::yn2tf($_POST["choice"]));
1049  $control_settings->setFlow(ilUtil::yn2tf($_POST["flow"]));
1050  $control_settings->setForwardOnly(ilUtil::yn2tf($_POST["forwardonly"]));
1051  $control_settings->insert();
1052 
1053  return true;
1054  }
1055 
1064  function executeDragDrop($source_id, $target_id, $first_child, $as_subitem = false, $movecopy = "move")
1065  {
1066  $this->slm_tree = new ilTree($this->getId());
1067  $this->slm_tree->setTableNames('sahs_sc13_tree', 'sahs_sc13_tree_node');
1068  $this->slm_tree->setTreeTablePK("slm_id");
1069 
1070  require_once("./Modules/Scorm2004/classes/class.ilSCORM2004NodeFactory.php");
1071 
1072  $source_obj = ilSCORM2004NodeFactory::getInstance($this, $source_id, true);
1073  //$source_obj->setLMId($this->getId());
1074 
1075  if (!$first_child)
1076  {
1077  $target_obj = ilSCORM2004NodeFactory::getInstance($this, $target_id, true);
1078  //$target_obj->setLMId($this->getId());
1079  $target_parent = $this->slm_tree->getParentId($target_id);
1080  }
1081 //echo "-".$source_obj->getType()."-";
1082  // handle pages
1083  if ($source_obj->getType() == "page")
1084  {
1085  if ($this->slm_tree->isInTree($source_obj->getId()))
1086  {
1087  $node_data = $this->slm_tree->getNodeData($source_obj->getId());
1088 
1089  // cut on move
1090  if ($movecopy == "move")
1091  {
1092  $parent_id = $this->slm_tree->getParentId($source_obj->getId());
1093  $this->slm_tree->deleteTree($node_data);
1094 
1095  // write history entry
1096 /* require_once("./Services/History/classes/class.ilHistory.php");
1097  ilHistory::_createEntry($source_obj->getId(), "cut",
1098  array(ilLMObject::_lookupTitle($parent_id), $parent_id),
1099  $this->getType().":pg");
1100  ilHistory::_createEntry($parent_id, "cut_page",
1101  array(ilLMObject::_lookupTitle($source_obj->getId()), $source_obj->getId()),
1102  $this->getType().":st");
1103 */
1104  }
1105 /* else // this is not implemented here
1106  {
1107  // copy page
1108  $new_page =& $source_obj->copy();
1109  $source_id = $new_page->getId();
1110  $source_obj =& $new_page;
1111  }
1112 */
1113 
1114  // paste page
1115  if(!$this->slm_tree->isInTree($source_obj->getId()))
1116  {
1117  if ($first_child) // as first child
1118  {
1119  $target_pos = IL_FIRST_NODE;
1120  $parent = $target_id;
1121  }
1122  else if ($as_subitem) // as last child
1123  {
1124  $parent = $target_id;
1125  $target_pos = IL_FIRST_NODE;
1126  $pg_childs = $this->slm_tree->getChildsByType($parent, "page");
1127  if (count($pg_childs) != 0)
1128  {
1129  $target_pos = $pg_childs[count($pg_childs) - 1]["obj_id"];
1130  }
1131  }
1132  else // at position
1133  {
1134  $target_pos = $target_id;
1135  $parent = $target_parent;
1136  }
1137 
1138  // insert page into tree
1139  $this->slm_tree->insertNode($source_obj->getId(),
1140  $parent, $target_pos);
1141 
1142  // write history entry
1143 /* if ($movecopy == "move")
1144  {
1145  // write history comments
1146  include_once("./Services/History/classes/class.ilHistory.php");
1147  ilHistory::_createEntry($source_obj->getId(), "paste",
1148  array(ilLMObject::_lookupTitle($parent), $parent),
1149  $this->getType().":pg");
1150  ilHistory::_createEntry($parent, "paste_page",
1151  array(ilLMObject::_lookupTitle($source_obj->getId()), $source_obj->getId()),
1152  $this->getType().":st");
1153  }
1154 */
1155 
1156  }
1157  }
1158  }
1159 
1160  // handle scos
1161  if ($source_obj->getType() == "sco" || $source_obj->getType() == "ass")
1162  {
1163 //echo "2";
1164  $source_node = $this->slm_tree->getNodeData($source_id);
1165  $subnodes = $this->slm_tree->getSubtree($source_node);
1166 
1167  // check, if target is within subtree
1168  foreach ($subnodes as $subnode)
1169  {
1170  if($subnode["obj_id"] == $target_id)
1171  {
1172  return;
1173  }
1174  }
1175 
1176  $target_pos = $target_id;
1177 
1178  if ($first_child) // as first sco
1179  {
1180  $target_pos = IL_FIRST_NODE;
1181  $target_parent = $target_id;
1182 
1183  $pg_childs = $this->slm_tree->getChildsByType($target_parent, "page");
1184  if (count($pg_childs) != 0)
1185  {
1186  $target_pos = $pg_childs[count($pg_childs) - 1]["obj_id"];
1187  }
1188  }
1189  else if ($as_subitem) // as last sco
1190  {
1191  $target_parent = $target_id;
1192  $target_pos = IL_FIRST_NODE;
1193  $childs = $this->slm_tree->getChilds($target_parent);
1194  if (count($childs) != 0)
1195  {
1196  $target_pos = $childs[count($childs) - 1]["obj_id"];
1197  }
1198  }
1199 
1200  // delete source tree
1201  if ($movecopy == "move")
1202  {
1203  $this->slm_tree->deleteTree($source_node);
1204  }
1205 /* else
1206  {
1207  // copy chapter (incl. subcontents)
1208  $new_chapter =& $source_obj->copy($this->slm_tree, $target_parent, $target_pos);
1209  }
1210 */
1211 
1212  if (!$this->slm_tree->isInTree($source_id))
1213  {
1214  $this->slm_tree->insertNode($source_id, $target_parent, $target_pos);
1215 
1216  // insert moved tree
1217  if ($movecopy == "move")
1218  {
1219  foreach ($subnodes as $node)
1220  {
1221  if($node["obj_id"] != $source_id)
1222  {
1223  $this->slm_tree->insertNode($node["obj_id"], $node["parent"]);
1224  }
1225  }
1226  }
1227  }
1228 
1229  // check the tree
1230 // $this->checkTree();
1231  }
1232 
1233  // handle chapters
1234  if ($source_obj->getType() == "chap")
1235  {
1236 //echo "2";
1237  $source_node = $this->slm_tree->getNodeData($source_id);
1238  $subnodes = $this->slm_tree->getSubtree($source_node);
1239 
1240  // check, if target is within subtree
1241  foreach ($subnodes as $subnode)
1242  {
1243  if($subnode["obj_id"] == $target_id)
1244  {
1245  return;
1246  }
1247  }
1248 
1249  $target_pos = $target_id;
1250 
1251  if ($first_child) // as first chapter
1252  {
1253  $target_pos = IL_FIRST_NODE;
1254  $target_parent = $target_id;
1255 
1256  //$sco_childs = $this->slm_tree->getChildsByType($target_parent, "sco");
1257  //if (count($sco_childs) != 0)
1258  //{
1259  // $target_pos = $sco_childs[count($sco_childs) - 1]["obj_id"];
1260  //}
1261  }
1262  else if ($as_subitem) // as last chapter
1263  {
1264  $target_parent = $target_id;
1265  $target_pos = IL_FIRST_NODE;
1266  $childs = $this->slm_tree->getChilds($target_parent);
1267  if (count($childs) != 0)
1268  {
1269  $target_pos = $childs[count($childs) - 1]["obj_id"];
1270  }
1271  }
1272 
1273  // delete source tree
1274  if ($movecopy == "move")
1275  {
1276  $this->slm_tree->deleteTree($source_node);
1277  }
1278 /* else
1279  {
1280  // copy chapter (incl. subcontents)
1281  $new_chapter =& $source_obj->copy($this->slm_tree, $target_parent, $target_pos);
1282  }
1283 */
1284 
1285  if (!$this->slm_tree->isInTree($source_id))
1286  {
1287  $this->slm_tree->insertNode($source_id, $target_parent, $target_pos);
1288 
1289  // insert moved tree
1290  if ($movecopy == "move")
1291  {
1292  foreach ($subnodes as $node)
1293  {
1294  if($node["obj_id"] != $source_id)
1295  {
1296  $this->slm_tree->insertNode($node["obj_id"], $node["parent"]);
1297  }
1298  }
1299  }
1300  }
1301 
1302  // check the tree
1303 // $this->checkTree();
1304  }
1305 
1306 // $this->checkTree();
1307  }
1308 
1309  function getExportFiles()
1310  {
1311  $file = array();
1312 
1313  require_once("./Modules/Scorm2004/classes/class.ilSCORM2004Export.php");
1314 
1315  $export = new ilSCORM2004Export($this);
1316  foreach ($export->getSupportedExportTypes() as $type)
1317  {
1318  $dir = $export->getExportDirectoryForType($type);
1319  // quit if import dir not available
1320  if (!@is_dir($dir) or !is_writeable($dir))
1321  {
1322  continue;
1323  }
1324  // open directory
1325  $cdir = dir($dir);
1326 
1327  // get files and save the in the array
1328  while ($entry = $cdir->read())
1329  {
1330  if ($entry != "." and
1331  $entry != ".." and
1332  (
1333  ereg("^[0-9]{10}_{2}[0-9]+_{2}(".$this->getType()."_)*[0-9]+\.zip\$", $entry) or
1334  ereg("^[0-9]{10}_{2}[0-9]+_{2}(".$this->getType()."_)*[0-9]+\.pdf\$", $entry) or
1335  ereg("^[0-9]{10}_{2}[0-9]+_{2}(".$this->getType()."_)*[0-9]+\.iso\$", $entry)
1336  ))
1337  {
1338  $file[$entry.$type] = array("type" => $type, "file" => $entry,
1339  "size" => filesize($dir."/".$entry));
1340  }
1341  }
1342 
1343  // close import directory
1344  $cdir->close();
1345  }
1346 
1347  // sort files
1348  ksort ($file);
1349  reset ($file);
1350  return $file;
1351  }
1352 
1356  function exportScorm($a_inst, $a_target_dir, $ver, &$expLog)
1357  {
1358 
1359  $a_xml_writer = new ilXmlWriter;
1360 
1361  // export metadata
1362  $this->exportXMLMetaData($a_xml_writer);
1363  $metadata_xml = $a_xml_writer->xmlDumpMem(false);
1364  $a_xml_writer->_XmlWriter;
1365 
1366  $xsl = file_get_contents("./Modules/Scorm2004/templates/xsl/metadata.xsl");
1367  $args = array( '/_xml' => $metadata_xml , '/_xsl' => $xsl );
1368  $xh = xslt_create();
1369  $output = xslt_process($xh,"arg:/_xml","arg:/_xsl",NULL,$args,NULL);
1370  xslt_free($xh);
1371  file_put_contents($a_target_dir.'/indexMD.xml',$output);
1372 
1373  // export glossary
1374  if($this->getAssignedGlossary()!=0)
1375  {
1376  ilUtil::makeDir($a_target_dir."/glossary");
1377  include_once("./Modules/Glossary/classes/class.ilObjGlossary.php");
1378  include_once("./Modules/Glossary/classes/class.ilGlossaryExport.php");
1379  $glo_xml_writer = new ilXmlWriter();
1380 
1381  $glo_xml_writer->xmlSetDtdDef("<!DOCTYPE ContentObject SYSTEM \"http://www.ilias.de/download/dtd/ilias_co_3_7.dtd\">");
1382  // set xml header
1383  $glo_xml_writer->xmlHeader();
1384  $glos = new ilObjGlossary($this->getAssignedGlossary(), false);
1385  //$glos->exportHTML($a_target_dir."/glossary", $expLog);
1386  $glos_export = new ilGlossaryExport($glos,"xml");
1387  $glos->exportXML($glo_xml_writer,$glos_export->getInstId(), $a_target_dir."/glossary", $expLog);
1388  $glo_xml_writer->xmlDumpFile($a_target_dir."/glossary/glossary.xml");
1389  $glo_xml_writer->_XmlWriter;
1390  }
1391 
1392  $a_xml_writer = new ilXmlWriter;
1393  // set dtd definition
1394  $a_xml_writer->xmlSetDtdDef("<!DOCTYPE ContentObject SYSTEM \"http://www.ilias.de/download/dtd/ilias_co_3_7.dtd\">");
1395 
1396  // set generated comment
1397  $a_xml_writer->xmlSetGenCmt("Export of ILIAS Content Module ". $this->getId()." of installation ".$a_inst.".");
1398 
1399  // set xml header
1400  $a_xml_writer->xmlHeader();
1401 
1402  global $ilBench;
1403 
1404  $a_xml_writer->xmlStartTag("ContentObject", array("Type"=>"SCORM2004LearningModule"));
1405 
1406  // MetaData
1407  $this->exportXMLMetaData($a_xml_writer);
1408 
1409  $this->exportXMLStructureObjects($a_xml_writer, $a_inst, $expLog);
1410 
1411  // SCO Objects
1412  $expLog->write(date("[y-m-d H:i:s] ")."Start Export Sco Objects");
1413  $this->exportXMLScoObjects($a_inst, $a_target_dir, $ver, $expLog);
1414  $expLog->write(date("[y-m-d H:i:s] ")."Finished Export Sco Objects");
1415 
1416  $a_xml_writer->xmlEndTag("ContentObject");
1417  $a_xml_writer->xmlDumpFile($a_target_dir.'/index.xml', false);
1418 
1419  if ($ver == "2004 4th") {
1420  $revision ="4th";
1421  $ver = "2004";
1422  }
1423 
1424  if ($ver == "2004 3rd") {
1425  $revision ="3rd";
1426  $ver = "2004";
1427  }
1428 
1429  // add content css (note: this is also done per item)
1430  $css_dir = $a_target_dir."/ilias_css_4_2";
1431  ilUtil::makeDir($css_dir);
1432  include_once("./Modules/Scorm2004/classes/class.ilScormExportUtil.php");
1433  ilScormExportUtil::exportContentCSS($this, $css_dir);
1434 
1435  // add manifest
1436  include_once("./Modules/Scorm2004/classes/class.ilContObjectManifestBuilder.php");
1437  $manifestBuilder = new ilContObjectManifestBuilder($this);
1438  $manifestBuilder->buildManifest($ver,$revision);
1439  $manifestBuilder->dump($a_target_dir);
1440 
1441  $xsl = file_get_contents("./Modules/Scorm2004/templates/xsl/module.xsl");
1442  $args = array( '/_xml' => file_get_contents($a_target_dir."/imsmanifest.xml"), '/_xsl' => $xsl );
1443  $xh = xslt_create();
1444  $output = xslt_process($xh,"arg:/_xml","arg:/_xsl",NULL,$args,NULL);
1445  xslt_free($xh);
1446  fputs(fopen($a_target_dir.'/index.html','w+'),$output);
1447  // copy xsd files to target
1448  switch ($ver)
1449  {
1450  case "2004":
1451  if ($revision == "3rd") {
1452  ilUtil::rCopy('./Modules/Scorm2004/templates/xsd/adlcp_130_export_2004',$a_target_dir,false);
1453  }
1454 
1455  if ($revision == "4th") {
1456  ilUtil::rCopy('./Modules/Scorm2004/templates/xsd/adlcp_130_export_2004_4th',$a_target_dir,false);
1457  }
1458  break;
1459  case "12":
1460  ilUtil::rCopy('./Modules/Scorm2004/templates/xsd/adlcp_120_export_12',$a_target_dir,false);
1461  break;
1462  }
1463 
1464  $a_xml_writer->_XmlWriter;
1465  }
1466 
1467 
1468  function exportHTML4PDF($a_inst, $a_target_dir, &$expLog)
1469  {
1470  global $ilBench;
1471  $tree = new ilTree($this->getId());
1472  $tree->setTableNames('sahs_sc13_tree', 'sahs_sc13_tree_node');
1473  $tree->setTreeTablePK("slm_id");
1474  foreach($tree->getSubTree($tree->getNodeData($tree->getRootId()),true,'sco') as $sco)
1475  {
1476  include_once("./Modules/Scorm2004/classes/class.ilSCORM2004Sco.php");
1477  $sco_folder = $a_target_dir."/".$sco['obj_id'];
1478  ilUtil::makeDir($sco_folder);
1479  $node = new ilSCORM2004Sco($this,$sco['obj_id']);
1480  $node->exportHTML4PDF($a_inst, $sco_folder, $expLog);
1481  }
1482  }
1483 
1484  function exportPDF($a_inst, $a_target_dir, &$expLog)
1485  {
1486  global $ilBench;
1487  $a_xml_writer = new ilXmlWriter;
1488  $a_xml_writer->xmlStartTag("ContentObject", array("Type"=>"SCORM2004SCO"));
1489  $this->exportXMLMetaData($a_xml_writer);
1490  $tree = new ilTree($this->getId());
1491  $tree->setTableNames('sahs_sc13_tree', 'sahs_sc13_tree_node');
1492  $tree->setTreeTablePK("slm_id");
1493  foreach($tree->getSubTree($tree->getNodeData($tree->getRootId()),true,'sco') as $sco)
1494  {
1495  include_once("./Modules/Scorm2004/classes/class.ilSCORM2004Sco.php");
1496  $sco_folder = $a_target_dir."/".$sco['obj_id'];
1497  ilUtil::makeDir($sco_folder);
1498  $node = new ilSCORM2004Sco($this,$sco['obj_id']);
1499  $node->exportPDFPrepareXmlNFiles($a_inst, $a_target_dir, $expLog, $a_xml_writer);
1500  }
1501  if($this->getAssignedGlossary()!=0)
1502  {
1503  ilUtil::makeDir($a_target_dir."/glossary");
1504  include_once("./Modules/Glossary/classes/class.ilObjGlossary.php");
1505  include_once("./Modules/Glossary/classes/class.ilGlossaryExport.php");
1506  $glos = new ilObjGlossary($this->getAssignedGlossary(), false);
1507  $glos_export = new ilGlossaryExport($glos,"xml");
1508  $glos->exportXML($a_xml_writer,$glos_export->getInstId(), $a_target_dir."/glossary", $expLog);
1509  }
1510  $a_xml_writer->xmlEndTag("ContentObject");
1511  include_once 'Services/Transformation/classes/class.ilXML2FO.php';
1512  $xml2FO = new ilXML2FO();
1513  $xml2FO->setXSLTLocation('./Modules/Scorm2004/templates/xsl/contentobject2fo.xsl');
1514  $xml2FO->setXMLString($a_xml_writer->xmlDumpMem());
1515  $xml2FO->setXSLTParams(array ('target_dir' => $a_target_dir));
1516  $xml2FO->transform();
1517  $fo_string = $xml2FO->getFOString();
1518  $fo_xml = simplexml_load_string($fo_string);
1519  $fo_ext = $fo_xml->xpath("//fo:declarations");
1520  $fo_ext = $fo_ext[0];
1521  $results = array();
1522  include_once "./Services/Utilities/classes/class.ilFileUtils.php";
1523  ilFileUtils::recursive_dirscan($a_target_dir."/objects", $results);
1524  if (is_array($results["file"]))
1525  {
1526  foreach ($results["file"] as $key => $value)
1527  {
1528  $e = $fo_ext->addChild("fox:embedded-file","","http://xml.apache.org/fop/extensions");
1529  $e->addAttribute("src",$results[path][$key].$value);
1530  $e->addAttribute("name",$value);
1531  $e->addAttribute("desc","");
1532  }
1533  }
1534  $fo_string = $fo_xml->asXML();
1535  $a_xml_writer->_XmlWriter;
1536  return $fo_string;
1537  }
1538 
1539  function exportHTMLOne($a_inst, $a_target_dir, &$expLog)
1540  {
1541  $one_file = fopen($a_target_dir.'/index.html','w+');
1542  $this->exportHTML($a_inst, $a_target_dir, $expLog, $one_file);
1543  fclose($one_file);
1544  }
1545 
1549  function exportHTML($a_inst, $a_target_dir, &$expLog, $a_one_file = "")
1550  {
1551 
1552 // $a_xml_writer = new ilXmlWriter;
1553  // set dtd definition
1554 // $a_xml_writer->xmlSetDtdDef("<!DOCTYPE ContentObject SYSTEM \"http://www.ilias.de/download/dtd/ilias_co_3_7.dtd\">");
1555 
1556  // set generated comment
1557 // $a_xml_writer->xmlSetGenCmt("Export of ILIAS Content Module ". $this->getId()." of installation ".$a_inst.".");
1558 
1559  // set xml header
1560 // $a_xml_writer->xmlHeader();
1561 
1562 // global $ilBench;
1563 
1564 // $a_xml_writer->xmlStartTag("ContentObject", array("Type"=>"SCORM2004LearningModule"));
1565 
1566 // $expLog->write(date("[y-m-d H:i:s] ")."Start Export Sco Objects");
1567  $this->exportHTMLScoObjects($a_inst, $a_target_dir, $expLog, $a_one_file);
1568 // $expLog->write(date("[y-m-d H:i:s] ")."Finished Export Sco Objects");
1569 
1570 // $a_xml_writer->xmlEndTag("ContentObject");
1571 
1572 
1573  /*$toc_tpl = new ilTemplate("tpl.main.html", true, true, false);
1574  $style_name = $ilUser->prefs["style"].".css";
1575  $tpl->setCurrentBlock("css_file");
1576  $tpl->setVariable("CSS_FILE", $style_name);
1577  $tpl->parseCurrentBlock();*/
1578 
1579  if ($a_one_file == "")
1580  {
1581  include_once("./Modules/Scorm2004/classes/class.ilContObjectManifestBuilder.php");
1582  $manifestBuilder = new ilContObjectManifestBuilder($this);
1583  $manifestBuilder->buildManifest('12');
1584 
1585  include_once("Services/Frameset/classes/class.ilFramesetGUI.php");
1586  $fs_gui = new ilFramesetGUI();
1587  $fs_gui->setFramesetTitle($this->getTitle());
1588  $fs_gui->setMainFrameSource("");
1589  $fs_gui->setSideFrameSource("toc.html");
1590  $fs_gui->setMainFrameName("content");
1591  $fs_gui->setSideFrameName("toc");
1592  $output = $fs_gui->get();
1593  fputs(fopen($a_target_dir.'/index.html','w+'),$output);
1594 
1595  $xsl = file_get_contents("./Modules/Scorm2004/templates/xsl/module.xsl");
1596  $xml = simplexml_load_string($manifestBuilder->writer->xmlDumpMem());
1597  $args = array( '/_xml' => $xml->organizations->organization->asXml(), '/_xsl' => $xsl );
1598  $xh = xslt_create();
1599  $output = xslt_process($xh,"arg:/_xml","arg:/_xsl",NULL,$args,NULL);
1600  xslt_free($xh);
1601  fputs(fopen($a_target_dir.'/toc.html','w+'),$output);
1602  }
1603 // $a_xml_writer->_XmlWriter;
1604  }
1605 
1612  function exportXMLMetaData(&$a_xml_writer)
1613  {
1614  include_once("Services/MetaData/classes/class.ilMD2XML.php");
1615  $md2xml = new ilMD2XML($this->getId(), 0, $this->getType());
1616  $md2xml->setExportMode(true);
1617  $md2xml->startExport();
1618  $a_xml_writer->appendXML($md2xml->getXML());
1619  }
1620 
1627  function exportXMLStructureObjects(&$a_xml_writer, $a_inst, &$expLog)
1628  {
1629  include_once("Services/MetaData/classes/class.ilMD2XML.php");
1630  $tree = new ilTree($this->getId());
1631  $tree->setTableNames('sahs_sc13_tree', 'sahs_sc13_tree_node');
1632  $tree->setTreeTablePK("slm_id");
1633  $a_xml_writer->xmlStartTag("StructureObject");
1634  foreach($tree->getFilteredSubTree($tree->getRootId(),Array('page')) as $obj)
1635  {
1636  if($obj['type']=='') continue;
1637 
1638  //$md2xml = new ilMD2XML($obj['obj_id'], 0, $obj['type']);
1639  $md2xml = new ilMD2XML($this->getId(), $obj['obj_id'], $obj['type']);
1640  $md2xml->setExportMode(true);
1641  $md2xml->startExport();
1642  $a_xml_writer->appendXML($md2xml->getXML());
1643  }
1644  $a_xml_writer->xmlEndTag("StructureObject");
1645  }
1646 
1647 
1654  function exportXMLScoObjects($a_inst, $a_target_dir, $ver, &$expLog)
1655  {
1656  global $ilBench;
1657  $tree = new ilTree($this->getId());
1658  $tree->setTableNames('sahs_sc13_tree', 'sahs_sc13_tree_node');
1659  $tree->setTreeTablePK("slm_id");
1660  foreach($tree->getSubTree($tree->getNodeData($tree->getRootId()),true,array('sco','ass')) as $sco)
1661  {
1662  if ($sco['type'] == "sco")
1663  {
1664  include_once("./Modules/Scorm2004/classes/class.ilSCORM2004Sco.php");
1665  $sco_folder = $a_target_dir."/".$sco['obj_id'];
1666  ilUtil::makeDir($sco_folder);
1667  $node = new ilSCORM2004Sco($this,$sco['obj_id']);
1668  $node->exportScorm($a_inst, $sco_folder, $ver, $expLog);
1669  }
1670  if ($sco['type'] == "ass")
1671  {
1672  include_once("./Modules/Scorm2004/classes/class.ilSCORM2004Asset.php");
1673  $sco_folder = $a_target_dir."/".$sco['obj_id'];
1674  ilUtil::makeDir($sco_folder);
1675  $node = new ilSCORM2004Asset($this,$sco['obj_id']);
1676  $node->exportScorm($a_inst, $sco_folder, $ver, $expLog);
1677  }
1678 
1679  }
1680  }
1681 
1682  /* export page objects to xml (see ilias_co.dtd)
1683  *
1684  * @param object $a_xml_writer ilXmlWriter object that receives the
1685  * xml data
1686  */
1687  function exportHTMLScoObjects($a_inst, $a_target_dir, &$expLog, $a_one_file = "")
1688  {
1689  global $ilBench;
1690 
1691  $tree = new ilTree($this->getId());
1692  $tree->setTableNames('sahs_sc13_tree', 'sahs_sc13_tree_node');
1693  $tree->setTreeTablePK("slm_id");
1694 
1695  // copy all necessary files now
1696  if ($a_one_file != "")
1697  {
1698  $this->prepareHTMLExporter($a_target_dir);
1699 
1700  // put header into file
1701  $sco_tpl = new ilTemplate("tpl.sco.html", true, true, "Modules/Scorm2004");
1702  include_once("./Services/COPage/classes/class.ilCOPageHTMLExport.php");
1703  $sco_tpl = ilCOPageHTMLExport::getPreparedMainTemplate($sco_tpl);
1704 
1705  $sco_tpl->setCurrentBlock("js_file");
1706  $sco_tpl->setVariable("JS_FILE", "./js/pure.js");
1707  $sco_tpl->parseCurrentBlock();
1708  $sco_tpl->setCurrentBlock("js_file");
1709  $sco_tpl->setVariable("JS_FILE", "./js/question_handling.js");
1710  $sco_tpl->parseCurrentBlock();
1711 
1712 
1713  $sco_tpl->setCurrentBlock("head");
1714  $sco_tpl->parseCurrentBlock();
1715  fputs($a_one_file, $sco_tpl->get("head"));
1716 
1717  // toc
1718  include_once("./Modules/Scorm2004/classes/class.ilContObjectManifestBuilder.php");
1719  $manifestBuilder = new ilContObjectManifestBuilder($this);
1720  $manifestBuilder->buildManifest('12');
1721  $xsl = file_get_contents("./Modules/Scorm2004/templates/xsl/module.xsl");
1722  $xml = simplexml_load_string($manifestBuilder->writer->xmlDumpMem());
1723  $args = array( '/_xml' => $xml->organizations->organization->asXml(), '/_xsl' => $xsl );
1724  $xh = xslt_create();
1725  $params = array("one_page" => "y");
1726  $output = xslt_process($xh,"arg:/_xml","arg:/_xsl",NULL,$args,$params);
1727  xslt_free($xh);
1728  fputs($a_one_file, $output);
1729 
1730  }
1731 
1732  foreach($tree->getSubTree($tree->getNodeData($tree->getRootId()),true,'sco') as $sco)
1733  {
1734  include_once("./Modules/Scorm2004/classes/class.ilSCORM2004Sco.php");
1735  $sco_folder = $a_target_dir."/".$sco['obj_id'];
1736  ilUtil::makeDir($sco_folder);
1737  $node = new ilSCORM2004Sco($this,$sco['obj_id']);
1738 
1739  if ($a_one_file == "")
1740  {
1741  $node->exportHTML($a_inst, $sco_folder, $expLog, $a_one_file);
1742  }
1743  else
1744  {
1745  $node->exportHTMLPageObjects($a_inst, $a_target_dir, $expLog, 'full',
1746  "sco", $a_one_file, $sco_tpl);
1747  }
1748  if($this->getAssignedGlossary()!=0)
1749  {
1750  include_once("./Modules/Glossary/classes/class.ilObjGlossary.php");
1751  $glos = new ilObjGlossary($this->getAssignedGlossary(),false);
1752  //$glos->exportHTML($sco_folder."/glossary", $expLog);
1753  }
1754  }
1755 
1756  // copy all necessary files now
1757  if ($a_one_file != "")
1758  {
1759  // put tail into file
1760  fputs($a_one_file, $sco_tpl->get("tail"));
1761  }
1762 
1763  }
1764 
1771  function prepareHTMLExporter($a_target_dir)
1772  {
1773  // system style html exporter
1774  include_once("./Services/Style/classes/class.ilSystemStyleHTMLExport.php");
1775  $this->sys_style_html_export = new ilSystemStyleHTMLExport($a_target_dir);
1776  $this->sys_style_html_export->export();
1777 
1778  // init co page html exporter
1779  include_once("./Services/COPage/classes/class.ilCOPageHTMLExport.php");
1780  $this->co_page_html_export = new ilCOPageHTMLExport($a_target_dir);
1781  include_once("./Services/Style/classes/class.ilObjStyleSheet.php");
1782  $this->co_page_html_export->setContentStyleId(
1784  $this->co_page_html_export->createDirectories();
1785  $this->co_page_html_export->exportStyles();
1786  $this->co_page_html_export->exportSupportScripts();
1787 
1788  include_once("./Services/MediaObjects/classes/class.ilPlayerUtil.php");
1789  $this->flv_dir = $a_target_dir."/".ilPlayerUtil::getFlashVideoPlayerDirectory();
1790 
1791  ilUtil::makeDir($a_target_dir.'/css/yahoo');
1792  ilUtil::makeDir($a_target_dir.'/objects');
1793  ilUtil::makeDir($a_target_dir.'/players');
1794  ilUtil::makeDir($this->flv_dir);
1795 
1796  include_once("./Services/MediaObjects/classes/class.ilPlayerUtil.php");
1797 // copy(ilPlayerUtil::getFlashVideoPlayerFilename(true),
1798 // $a_target_dir.'/js/'.ilPlayerUtil::getFlashVideoPlayerFilename());
1800 
1801  copy('./Modules/Scorm2004/scripts/scorm_2004.js',$a_target_dir.'/js/scorm.js');
1802  copy('./Modules/Scorm2004/scripts/pager.js',$a_target_dir.'/js/pager.js');
1803  copy('./Modules/Scorm2004/scripts/questions/pure.js',$a_target_dir.'/js/pure.js');
1804  copy('./Modules/Scorm2004/scripts/questions/question_handling.js',
1805  $a_target_dir.'/js/question_handling.js');
1806 
1807  }
1808 
1816  function getPublicExportFile($a_type)
1817  {
1818  return $this->public_export_file[$a_type];
1819  }
1820 
1825  function exportFileItems($a_target_dir, &$expLog)
1826  {
1827  include_once("./Modules/File/classes/class.ilObjFile.php");
1828 
1829  foreach ($this->file_ids as $file_id)
1830  {
1831  $expLog->write(date("[y-m-d H:i:s] ")."File Item ".$file_id);
1832  $file_obj = new ilObjFile($file_id, false);
1833  $file_obj->export($a_target_dir);
1834  unset($file_obj);
1835  }
1836  }
1837 
1841  function setPublicExportFile($a_type, $a_file)
1842  {
1843  $this->public_export_file[$a_type] = $a_file;
1844  }
1845 
1856  public static function _getMaxScoreForUser($a_id, $a_user)
1857  {
1858  global $ilDB;
1859 
1860  $scos = array();
1861 
1862  $result = $ilDB->query(
1863  'SELECT cp_node.cp_node_id '
1864  .'FROM cp_node, cp_resource, cp_item '
1865  .'WHERE cp_item.cp_node_id = cp_node.cp_node_id '
1866  .'AND cp_item.resourceId = cp_resource.id '
1867  .'AND scormType = '.$ilDB->quote('sco', 'text').' '
1868  .'AND nodeName = '.$ilDB->quote('item', 'text').' '
1869  .'AND cp_node.slm_id = '.$ilDB->quote($a_id, 'integer').' '
1870  .'GROUP BY cp_node.cp_node_id'
1871  );
1872 
1873  while($row = $ilDB->fetchAssoc($result))
1874  {
1875  array_push($scos, $row['cp_node_id']);
1876  }
1877 
1878  $set = 0; //numbers of SCO that set cmi.score.scaled
1879  $max = null;
1880  for($i = 0; $i < count($scos); $i++)
1881  {
1882  $res = $ilDB->queryF(
1883  'SELECT c_max FROM cmi_node WHERE (user_id = %s AND cp_node_id = %s)',
1884  array('integer', 'integer'),
1885  array($a_user, $scos[$i])
1886  );
1887 
1888  if($ilDB->numRows($res) > 0)
1889  {
1890  $row = $ilDB->fetchAssoc($res);
1891  if($row['c_max'] != null)
1892  {
1893  $set++;
1894  $max = $row['c_max'];
1895  }
1896  }
1897  }
1898  $retVal = ($set == 1) ? $max : null;
1899 
1900  return $retVal;
1901  }
1902 
1903  public static function _getScores2004ForUser($a_cp_node_id, $a_user) {
1904  global $ilDB;
1905  $retAr = array("raw" => null, "max" => null, "scaled" => null);
1906  $val_set = $ilDB->queryF("SELECT c_raw, c_max, scaled FROM cmi_node WHERE (user_id = %s AND cp_node_id = %s)",
1907  array('integer', 'integer'),
1908  array($a_user, $a_cp_node_id)
1909  );
1910  if ($val_set->numRows()>0)
1911  {
1912  $val_rec = $ilDB->fetchAssoc($val_set);
1913  $retAr["raw"] = $val_rec['c_raw'];
1914  $retAr["max"] = $val_rec['c_max'];
1915  $retAr["scaled"] = $val_rec['scaled'];
1916  if ($val_rec['scaled']==null && $val_rec['c_raw']!=null && $val_rec['c_max']!=null) {
1917  $retAr["scaled"] = ($val_rec['c_raw'] / $val_rec['c_max']);
1918  }
1919  }
1920  return $retAr;
1921  }
1922 
1929  function copyAuthoredContent($a_new_obj)
1930  {
1931  global $ilias;
1932 
1933  // set/copy stylesheet
1934  include_once("./Services/Style/classes/class.ilObjStyleSheet.php");
1935  $style_id = $this->getStyleSheetId();
1936  if ($style_id > 0 && !ilObjStyleSheet::_lookupStandard($style_id))
1937  {
1938  $style_obj = $ilias->obj_factory->getInstanceByObjId($style_id);
1939  $new_id = $style_obj->ilClone();
1940  $a_new_obj->setStyleSheetId($new_id);
1941  $a_new_obj->update();
1942  }
1943 
1944  $a_new_obj->createScorm2004Tree();
1945  $source_tree = $this->getTree();
1946  $target_tree_root_id = $a_new_obj->getTree()->readRootId();
1947  $childs = $source_tree->getChilds($source_tree->readRootId());
1948  $a_copied_nodes = array();
1949  include_once("./Modules/Scorm2004/classes/class.ilSCORM2004Node.php");
1950  foreach ($childs as $c)
1951  {
1952  ilSCORM2004Node::pasteTree($a_new_obj, $c["child"], $target_tree_root_id,
1953  IL_LAST_NODE, "", $a_copied_nodes, true, false);
1954  }
1955  }
1956 
1957 }
1958 ?>
const LP_STATUS_COMPLETED_NUM
xslt_create()
static _lookupLastAccess($a_obj_id, $a_usr_id)
Return the last access timestamp for a given user.
_getTrackingItems($a_obj_id)
get all tracking items of scorm object
getStyleSheetId()
get ID of assigned style sheet object
copyAuthoredContent($a_new_obj)
Copy authored content (everything done with the editor.
print $file
Class ilSCORM2004Sco.
$_POST['username']
Definition: cron.php:12
exportHTML4PDF($a_inst, $a_target_dir, &$expLog)
exportHTMLScoObjects($a_inst, $a_target_dir, &$expLog, $a_one_file="")
$result
xmlSetDtdDef($dtdDef)
Sets dtd definition.
static rCopy($a_sdir, $a_tdir, $preserveTimeAttributes=false)
Copies content of a directory $a_sdir recursively to a directory $a_tdir.
HTML export class for pages.
copyPlayerFilesToTargetDirectory($a_target_dir)
Copy css files to target dir.
ilObjSCORM2004LearningModule($a_id=0, $a_call_by_reference=true)
Constructor public.
static exportContentCSS($a_slm_object, $a_target_dir)
Export lm content css to a directory.
Class ilObjGlossary.
xslt_free(&$proc)
static pasteTree($a_target_slm, $a_item_id, $a_parent_id, $a_target, $a_insert_time, &$a_copied_nodes, $a_as_copy=false, $a_from_clipboard=true, $a_source_parent_type="")
Paste item (tree) from clipboard or other learning module to target scorm learning module...
const LP_STATUS_NOT_ATTEMPTED
static _updateStatus($a_obj_id, $a_usr_id, $a_obj=null, $a_percentage=false, $a_force_raise=false)
Update status.
xmlStartTag($tag, $attrs=NULL, $empty=FALSE, $encode=TRUE, $escape=TRUE)
Writes a starttag.
HTML export class for system styles.
removeCMIDataForUserAndPackage($user_id, $packageId)
const LP_STATUS_IN_PROGRESS_NUM
XML writer class.
_ISODurationToCentisec($str)
convert ISO 8601 Timeperiods to centiseconds ta
$target_id
Definition: goto.php:88
getAssignedGlossary()
get assigned glossary
SCORM 2004 Editing tree.
prepareHTMLExporter($a_target_dir)
Prepare HTML exporter.
const IL_CAL_UNIX
_secondsToString($seconds, $force_with_seconds=false, $a_lng=null)
converts seconds to string: Long: 7 days 4 hour(s) ...
getPreparedMainTemplate($a_tpl="")
Get prepared main template.
static now()
Return current timestamp in Y-m-d H:i:s format.
static _getScores2004ForUser($a_cp_node_id, $a_user)
exportXMLStructureObjects(&$a_xml_writer, $a_inst, &$expLog)
export structure objects to xml (see ilias_co.dtd)
const LP_STATUS_IN_PROGRESS
setImportSequencing($a_val)
Set import sequencing.
getDataDirectory($mode="filesystem")
get data directory of lm
exportHTMLOne($a_inst, $a_target_dir, &$expLog)
$r
Definition: example_031.php:79
$data
const LP_STATUS_FAILED
exportFileItems($a_target_dir, &$expLog)
export files of file itmes
getId()
get object id public
static getInstance($a_slm_object, $a_id=0, $a_halt=true)
validate($directory)
Validate all XML-Files in a SCOM-Directory.
deleteTrackingDataOfUsers($a_users)
get all tracked items of current user
getTrackedItems()
get all tracked items of current user
exportXMLMetaData(&$a_xml_writer)
export content objects meta data to xml (see ilias_co.dtd)
const IL_FIRST_NODE
Definition: class.ilTree.php:5
special template class to simplify handling of ITX/PEAR
static getEffectiveContentStyleId($a_style_id, $a_type="")
Get effective Style Id.
executeDragDrop($source_id, $target_id, $first_child, $as_subitem=false, $movecopy="move")
Execute Drag Drop Action.
Class ilObjFile.
static formatDate(ilDateTime $date)
Format a date public.
static _getUniqueScaledScoreForUser($a_id, $a_user)
Get the Unique Scaled Score of a course Conditions: Only one SCO may set cmi.score.scaled.
getTitle()
get object title public
static getFlashVideoPlayerDirectory()
Get flash video player directory.
Date and time handling
redirection script todo: (a better solution should control the processing via a xml file) ...
$n
Definition: RandomTest.php:80
$results
Class ilSCORM2004Sequencing.
getType()
get object type public
Tree class data representation in hierachical trees using the Nested Set Model with Gaps by Joe Celco...
importSuccessForSahsUser($user_id, $last_access, $status, $attempts=null, $percentage_completed=null, $sco_total_time_sec=null)
static makeDir($a_dir)
creates a new directory and inherits all filesystem permissions of the parent directory You may pass ...
const LP_STATUS_NOT_ATTEMPTED_NUM
const IL_LAST_NODE
Definition: class.ilTree.php:4
_lookupStandard($a_id)
Lookup standard flag.
exportXMLScoObjects($a_inst, $a_target_dir, $ver, &$expLog)
export page objects to xml (see ilias_co.dtd)
_refreshStatus($a_obj_id, $a_users=null)
Set dirty.
getAttemptsForUser($a_user_id)
get number of atttempts for a certain user and package
exportHTML($a_inst, $a_target_dir, &$expLog, $a_one_file="")
Export SCORM package to HTML.
global $ilUser
Definition: imgupload.php:15
static _deleteReadEventsForUsers($a_obj_id, array $a_user_ids)
Class ilObjSCORM2004LearningModule.
recursive_dirscan($dir, &$arr)
Recursively scans a given directory and writes path and filename into referenced array.
global $ilBench
Definition: ilias.php:18
global $ilDB
Class ilSCORM2004Asset.
createScorm2004Tree()
Create Scorm 2004 Tree used by Editor.
exportPDF($a_inst, $a_target_dir, &$expLog)
static _getMaxScoreForUser($a_id, $a_user)
Returns score.max for the learning module, refered to the last sco where score.max is set...
Export class for content objects.
getPublicExportFile($a_type)
get public export file
static yn2tf($a_yn)
convert "y"/"n" to true/false
static getInstance($a_obj_id)
Class ilObjSCORMLearningModule.
$params
Definition: example_049.php:96
static _getCourseCompletionForUser($a_id, $a_user)
Get the completion of a SCORM module for a given user.
Content Object (ILIAS native learning module / digilib book) Manifest export class.
exportScorm($a_inst, $a_target_dir, $ver, &$expLog)
Export (authoring) scorm package.
const LP_STATUS_FAILED_NUM
Class ilFramesetGUI.
getModuleVersionForUser($a_user_id)
get module version that tracking data for a user was recorded on