ILIAS  release_5-0 Revision 5.0.0-1144-gc4397b1f87
class.ilSCORMOfflineMode.php
Go to the documentation of this file.
1 <?php
2 
3 /* Copyright (c) 1998-2011 ILIAS open source, Extended GPL, see docs/LICENSE */
4 //require_once "./Services/Object/classes/class.ilObject.php";
5 
17 {
18  var $type;
19  var $obj_id;
21 
28  function __construct()
29  {
30  global $ilias;
31  $this->ilias =& $ilias;
32  $this->id = $_GET['ref_id'];
33  $this->obj_id = ilObject::_lookupObjectId($_GET['ref_id']);
34  include_once "./Modules/ScormAicc/classes/class.ilObjSAHSLearningModule.php";
35  $this->type = ilObjSAHSLearningModule::_lookupSubType($this->obj_id);
36  $this->read();
37  }
38 
39  function il2sop() {
40  global $ilUser, $ilias;
41  $this->setOfflineMode("il2sop");
42  header('Content-Type: text/javascript; charset=UTF-8');
43 
44  include_once "./Modules/ScormAicc/classes/class.ilObjSAHSLearningModule.php";
45  $ob = new ilObjSAHSLearningModule($this->id);
46  $module_version = $ob->getModuleVersion();
47  $sahs_user = $this->il2sopSahsUser();
48  $support_mail = "";//TODO
49  $scorm_version = "1.2";
50  if ($this->type == "scorm2004") $scorm_version = "2004";
51  $tree="";
52 
53  $learning_progress_enabled = 1;
54  include_once './Services/Object/classes/class.ilObjectLP.php';
55  $olp = ilObjectLP::getInstance($this->obj_id);
56  if ($olp->getCurrentMode() == 0) $learning_progress_enabled = 0;
57 
58  $certificate_enabled = 0;
59 
60  $adlact_data = null;
61  $ilias_version = $ilias->getSetting("ilias_version");
62 
63  if ($this->type == 'scorm2004') {
64  include_once "./Modules/Scorm2004/classes/ilSCORM13Player.php";
65  $ob2004 = new ilSCORM13Player();
66  $init_data = $ob2004->getConfigForPlayer();
67  $resources = json_decode($ob2004->getCPDataInit());
68  $cmi = $ob2004->getCMIData($ilUser->getID(), $this->obj_id);
69  $max_attempt = $ob2004->get_max_attempts();
70  $adlact_data = json_decode($ob2004->getADLActDataInit());
71  //$globalobj_data = $ob2004->readGObjectiveInit();
72  } else {
73  include_once "./Modules/ScormAicc/classes/SCORM/class.ilObjSCORMInitData.php";
74  $slm_obj =& new ilObjSCORMLearningModule($_GET["ref_id"]);
75  $init_data = ilObjSCORMInitData::getIliasScormVars($slm_obj);
76  $resources = json_decode(ilObjSCORMInitData::getIliasScormResources($this->obj_id));
77  $tree = json_decode(ilObjSCORMInitData::getIliasScormTree($this->obj_id));
78  $cmi = json_decode(ilObjSCORMInitData::getIliasScormData($this->obj_id));
79  $max_attempt = ilObjSCORMInitData::get_max_attempts($this->obj_id);
80  }
81  if ($max_attempt == null) $max_attempt = 0;
82  $result = array(
83  'client_data' => array(
84  $support_mail
85  ),
86  'user_data' => $this->il2sopUserData(),
87  'lm' => array(
88  ilObject::_lookupTitle($this->obj_id),
89  ilObject::_lookupDescription($this->obj_id),
90  $scorm_version,
91  1,//active
92  $init_data,
93  $resources,
94  $tree,
95  $module_version,
96  "", //offline_zip_created!!!!!!!!
97  $learning_progress_enabled,
98  $certificate_enabled,
99  $max_attempt,
100  $adlact_data,
101  $ilias_version
102  ),
103  'sahs_user' => $sahs_user,
104  'cmi' => $cmi
105  );
106 
107  print(json_encode($result));
108  }
109 
110  function getClientIdSop() {
111  $iliasDomain = substr(ILIAS_HTTP_PATH,7);
112  if (substr($iliasDomain,0,1) == "\/") $iliasDomain = substr($iliasDomain,1);
113  if (substr($iliasDomain,0,4) == "www.") $iliasDomain = substr($iliasDomain,4);
114  return $iliasDomain.';'.CLIENT_ID;
115  }
116 
117  function il2sopUserData() {
118  global $ilUser;
119  return array(
120  $ilUser->getLogin(),
121  "",
122  $ilUser->getFirstname(),
123  $ilUser->getLastname(),
124  $ilUser->getUTitle(),
125  $ilUser->getGender(),
126  $ilUser->getID()
127  );
128  }
129  function il2sopSahsUser() {
130  global $ilDB,$ilUser;
131  $package_attempts = 0;
132  $module_version = 1;//if module_version in sop is different...
133  $last_visited = "";
134  $first_access = null;
135  $last_access = null;
136  $last_status_change = null;
137  $total_time_sec = null;
138  $sco_total_time_sec = 0;
139  $status = 0;
140  $percentage_completed = 0;
141  $user_data = "";
142 
143  global $ilDB,$ilUser;
144  $res = $ilDB->queryF('SELECT * FROM sahs_user WHERE obj_id=%s AND user_id=%s',
145  array('integer','integer'),
146  array($this->obj_id,$ilUser->getID())
147  );
148  while($row = $ilDB->fetchAssoc($res))
149  {
150  $package_attempts = $row['package_attempts'];
151  $module_version = $row['module_version'];
152  $last_visited = $row['last_visited'];
153  if ($row['first_access'] != null) {
154  $first_access = strtotime($row['first_access'])*1000;//check Oracle!
155  }
156  if ($row['last_access'] != null) {
157  $last_access = strtotime($row['last_access'])*1000;//check Oracle!
158  }
159  $total_time_sec = $row['total_time_sec'];
160  $sco_total_time_sec = $row['sco_total_time_sec'];
161  $status = $row['status'];
162  $percentage_completed = $row['percentage_completed'];
163  }
164  if ($first_access == null) {
165  include_once './Services/Tracking/classes/class.ilChangeEvent.php';
166  $all = ilChangeEvent::_lookupReadEvents($this->obj_id,$ilUser->getID());
167  foreach($all as $event)
168  {
169  $first_access = strtotime($event['first_access'])*1000;//
170  }
171  }
172  return array($package_attempts, $module_version, $last_visited, $first_access, $last_access, $last_status_change, $total_time_sec, $sco_total_time_sec, $status, $percentage_completed, $user_data);
173  }
174 
175  function sop2il() {
176 // sleep(5);
177  global $ilDB,$ilUser;
178  $in = file_get_contents("php://input");
179  $GLOBALS['ilLog']->write($in);
180  $ret = array('msg'=>array(),'err'=>array());
181 
182  if (!$in || $in == "") {
183  $ret['err'][] = "no post data recieved";
184  print(json_encode($ret));
185  exit;
186  }
187  $userId=$ilUser->getID();
188  $result=true;
189 
190  if ($this->type == 'scorm2004') {
191  $lm_set = $ilDB->queryF('SELECT default_lesson_mode, interactions, objectives, comments FROM sahs_lm WHERE id = %s', array('integer'),array($this->obj_id));
192  while($lm_rec = $ilDB->fetchAssoc($lm_set))
193  {
194  $defaultLessonMode=($lm_rec["default_lesson_mode"]);
195  $interactions=(ilUtil::yn2tf($lm_rec["interactions"]));
196  $objectives=(ilUtil::yn2tf($lm_rec["objectives"]));
197  $comments=(ilUtil::yn2tf($lm_rec["comments"]));
198  }
199  include_once './Modules/Scorm2004/classes/class.ilSCORM2004StoreData.php';
200  $data = json_decode($in);
201  $GLOBALS['ilLog']->write('cmi_count='.count($data->cmi));
202  for ($i=0; $i<count($data->cmi); $i++) {
203  if($result==true) {
204  //$a_r=array();
205  $cdata=$data->cmi[$i];
207  $userId,
208  $this->obj_id,
209  $data->cmi[$i],//json_decode($data->cmi[$i]),
210  $comments,
211  $interactions,
212  $objectives
213  );
214  if (!is_array($a_r)) $result=false;
215  }
216  }
217  if ($result==true) {
218  $result=ilSCORM2004StoreData::syncGlobalStatus($userId, $this->obj_id, $data, $data->now_global_status);
219  }
220  } else {
221  include_once "./Modules/ScormAicc/classes/SCORM/class.ilObjSCORMTracking.php";
222  $data = json_decode($in);
223  $result=ilObjSCORMTracking::storeJsApiCmi($userId,$this->obj_id,$data);
224  if ($result==true) {
225  $result=ilObjSCORMTracking::syncGlobalStatus($userId, $this->obj_id, $data, $data->now_global_status);
226  }
227  }
228  if ($result==true) {
229  $result=self::scormPlayerUnloadForSOP2il($data);
230  }
231 
232  if ($result==false) {
233  $ret['err'][] = "invalid post data recieved";
234  } else {
235  $ret['msg'][] = "post data recieved";
236  }
237  header('Content-Type: text/plain; charset=UTF-8');
238  print json_encode($ret);
239  }
240 
242  global $ilDB,$ilUser;
243  $first_access=null;
244  if($data->first_access != null) $first_access=date('Y-m-d H:i:s',round($data->first_access/1000));
245  $last_access=null;
246  $i_last_access=null;
247  if($data->last_access != null) {
248  $i_last_access = round($data->last_access/1000);
249  $last_access=date('Y-m-d H:i:s',$i_last_access);
250  include_once("./Services/Tracking/classes/class.ilChangeEvent.php");
251  ilChangeEvent::_updateAccessForScormOfflinePlayer($this->obj_id,$ilUser->getId(), $i_last_access, $first_access);
252  }
253  $last_status_change=null;
254  if($data->last_status_change != null) $last_status_change=date('Y-m-d H:i:s',round($data->last_status_change/1000));
255  $GLOBALS['ilLog']->write('first_access='.$first_access);
256  $res = $ilDB->queryF('UPDATE sahs_user SET first_access=%s, last_access=%s, last_status_change=%s, last_visited=%s, module_version=%s WHERE obj_id=%s AND user_id=%s',
257  array('timestamp','timestamp','timestamp','text','integer','integer','integer'),
258  array($first_access,$last_access,$last_status_change,$data->last_visited,$data->module_version, $this->obj_id,$ilUser->getId())
259  );
260 
261  //populate last_status_change
262  return true;
263  }
264 
265  //offlineMode: offline, online, il2sop, sop2il
266  function setOfflineMode($a_mode) {
267  global $ilDB,$ilUser;
268  $res = $ilDB->queryF('UPDATE sahs_user SET offline_mode=%s WHERE obj_id=%s AND user_id=%s',
269  array('text','integer','integer'),
270  array($a_mode, $this->obj_id,$ilUser->getId())
271  );
272  $this->offlineMode=$a_mode;
273  }
274  function getOfflineMode() {
275  return $this->offlineMode;
276  }
277 
278  private function read() {
279  global $ilDB,$ilUser;
280  $res = $ilDB->queryF('SELECT offline_mode FROM sahs_user WHERE obj_id=%s AND user_id=%s',
281  array('integer','integer'),
282  array($this->obj_id,$ilUser->getId())
283  );
284  while($row = $ilDB->fetchAssoc($res))
285  {
286  if ($row['offline_mode'] != null) {
287  $this->offlineMode = $row['offline_mode'];
288  } else {
289  $this->offlineMode = "online";
290  }
291  }
292  }
293 
294  public function checkIfAnyoneIsInOfflineMode($obj_id) {
295  global $ilDB;
296  $res = $ilDB->queryF("SELECT count(*) cnt FROM sahs_user WHERE obj_id=%s AND offline_mode = 'offline'",
297  array('integer'),
298  array($obj_id)
299  );
300  $val_rec = $ilDB->fetchAssoc($res);
301  if ($val_rec["cnt"] == 0) return false;
302  return true;
303  }
304 
305  public function usersInOfflineMode($obj_id) {
306  global $ilDB;
307  $users = array();
308  $res = $ilDB->queryF("SELECT user_id, lastname, firstname FROM sahs_user, usr_data "
309  ."WHERE sahs_user.obj_id=%s AND sahs_user.offline_mode = 'offline' AND sahs_user.user_id=usr_data.usr_id",
310  array('integer'),
311  array($obj_id)
312  );
313  while($row = $ilDB->fetchAssoc($res))
314  {
315  $users[] = $row;
316  }
317  return $users;
318  }
319 
320  public function stopOfflineModeForUser($obj_id,$user_id) {
321  global $ilDB;
322  $res = $ilDB->queryF("UPDATE sahs_user SET offline_mode='online' WHERE obj_id=%s AND user_id=%s",
323  array('integer','integer'),
324  array($obj_id,$user_id)
325  );
326  }
327 }
_updateAccessForScormOfflinePlayer($obj_id, $usr_id, $i_last_access, $t_first_access)
_updateAccessForScormOfflinePlayer needed to synchronize last_access and first_access when learning m...
syncGlobalStatus($userId, $packageId, $data, $new_global_status)
exit
Definition: login.php:54
$result
$_GET["client_id"]
static _lookupTitle($a_id)
lookup object title
storeJsApiCmi($user_id, $obj_id, $data)
static _lookupObjectId($a_ref_id)
lookup object id
$GLOBALS['ct_recipient']
static _lookupDescription($a_id)
lookup object description
get_max_attempts($a_packageId)
Get max.
_lookupSubType($a_obj_id)
lookup subtype id (scorm, aicc, hacp)
redirection script todo: (a better solution should control the processing via a xml file) ...
setCMIData($userId, $packageId, $data, $getComments, $getInteractions, $getObjectives)
static _lookupReadEvents($obj_id, $usr_id=null)
Reads all read events which occured on the object which happened after the last time the user caught ...
syncGlobalStatus($userId, $packageId, $data, $new_global_status, $time_from_lms)
stopOfflineModeForUser($obj_id, $user_id)
$lm_set
global $ilUser
Definition: imgupload.php:15
global $ilDB
Class ilSCORMOfflineMode.
static yn2tf($a_yn)
convert "y"/"n" to true/false
static getInstance($a_obj_id)
Class ilObjSCORMLearningModule.
Class ilObjSCORMLearningModule.