Prelaunch post cmi5LearnerPreference (agent profile) post LMS.LaunchData.
221 : array
222 {
224 $DIC->language()->loadLanguageModule(
"cmix");
225
227 $lrsType = $this->object->getLrsType();
228 $defaultLrs = $lrsType->getLrsEndpoint();
229 $defaultBasicAuth = $lrsType->getBasicAuth();
230
231 $defaultHeaders = [
232 'X-Experience-API-Version: 1.0.3',
233 'Authorization: ' . $defaultBasicAuth,
234 'Content-Type: application/json;charset=utf-8',
235 'Cache-Control: no-cache, no-store, must-revalidate'
236 ];
237
238 $registration = $this->cmixUser->getRegistration();
239 if ($registration == '') {
241 }
242
243 $activityId = $this->object->getActivityId();
244
245
246 $profileParams = [
247 'agent' => json_encode($this->
object->getStatementActor($this->cmixUser)),
248 'profileId' => 'cmi5LearnerPreferences'
249 ];
251
252
253 $launchDataParams = [
254 'agent' => json_encode($this->
object->getStatementActor($this->cmixUser)),
255 'activityId' => $activityId,
256 'activity_id' => $activityId,
257 'registration' => $registration,
258 'stateId' => 'LMS.LaunchData'
259 ];
261
263 $cmi5LearnerPreferences = json_encode($cmi5LearnerPreferencesObj);
264 $lang = $cmi5LearnerPreferencesObj['languagePreference'];
266
268 $oldSession = $tokenObject->getCmi5Session();
269 $oldSessionLaunchedTimestamp = '';
270 $abandoned = false;
271
272 if ($oldSession != null && !empty($oldSession)) {
273 $oldSessionData = json_decode($tokenObject->getCmi5SessionData());
274 $oldSessionLaunchedTimestamp = $oldSessionData->launchedTimestamp;
275 $tokenObject->delete();
278 $lastStatement = $this->object->getLastStatement($oldSession);
279 if (isset($lastStatement[0]['statement']['verb']['id']) &&
281 $abandoned = true;
282 $start = new DateTime($oldSessionLaunchedTimestamp);
283 $end = new DateTime($lastStatement[0]['statement']['timestamp']);
284 $diff = $end->diff($start);
286 }
287 }
288
289 $satisfied = false;
290 $lpMode = $this->object->getLPMode();
292 $satisfied = true;
293 }
294
295 $tokenObject->setCmi5Session($cmi5_session);
297 $sessionData = [
298 'cmi5LearnerPreferences' => $cmi5LearnerPreferencesObj,
299 'launchedTimestamp' => $now->toXapiTimestamp()
300 ];
301 $tokenObject->setCmi5SessionData(json_encode($sessionData));
302 $tokenObject->update();
303
304 $defaultStatementsUrl = $defaultLrs . "/statements";
305
306
307 $launchData = json_encode($this->
object->getLaunchData($DIC->language()->txt(
'cmiexit'), $this->cmixUser));
308 $launchedStatement = $this->object->getLaunchedStatement($this->cmixUser);
309 $launchedStatementUrl = $defaultStatementsUrl . '?statementId=' . urlencode($launchedStatement['id']);
310
311 $requests = [
312 ['url' => $defaultProfileUrl, 'method' => 'POST', 'body' => $cmi5LearnerPreferences],
313 ['url' => $defaultLaunchDataUrl, 'method' => 'PUT', 'body' => $launchData],
314 ['url' => $launchedStatementUrl, 'method' => 'PUT', 'body' => json_encode($launchedStatement)]
315 ];
316
317 if ($abandoned) {
318 $abandonedStatement = $this->
object->getAbandonedStatement($oldSession,
$duration, $this->cmixUser);
319 $requests[] = [
320 'url' => $defaultStatementsUrl . '?statementId=' . urlencode($abandonedStatement['id']),
321 'method' => 'PUT',
322 'body' => json_encode($abandonedStatement)
323 ];
324 }
325
326 if ($satisfied) {
327 $satisfiedStatement = $this->object->getSatisfiedStatement($this->cmixUser);
328 $requests[] = [
329 'url' => $defaultStatementsUrl . '?statementId=' . urlencode($satisfiedStatement['id']),
330 'method' => 'PUT',
331 'body' => json_encode($satisfiedStatement)
332 ];
333 }
334
335
336 $mh = curl_multi_init();
337 $chs = [];
338
339 foreach ($requests as
$req) {
340 $ch = curl_init();
341 curl_setopt_array($ch, [
342 CURLOPT_URL =>
$req[
'url'],
343 CURLOPT_CUSTOMREQUEST =>
$req[
'method'],
344 CURLOPT_HTTPHEADER => $defaultHeaders,
345 CURLOPT_POSTFIELDS =>
$req[
'body'],
346 CURLOPT_RETURNTRANSFER => true,
347 CURLOPT_TIMEOUT => 10,
348 CURLOPT_SSL_VERIFYPEER => true,
349 ]);
350 curl_multi_add_handle(
$mh, $ch);
351 $chs[] = $ch;
352 }
353
354
355 $running = 0;
356 do {
357 curl_multi_exec(
$mh, $running);
358 curl_multi_select(
$mh);
359
360 } while ($running > 0);
361
362
363 foreach ($chs as $ch) {
364 $status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
365 $body = curl_multi_getcontent($ch);
366 if (!in_array($status, [200, 204])) {
367 $this->
log()->error(
"CMI5preLaunch HTTP error $status: $body");
368 }
369 curl_multi_remove_handle(
$mh, $ch);
370 curl_close($ch);
371 }
372
373 curl_multi_close(
$mh);
374
375 return [
376 'cmi5_session' => $cmi5_session,
378 ];
379 }
static buildQuery(array $params, $encoding=PHP_QUERY_RFC3986)
static getInstanceByToken(string $token)
static dateIntervalToISO860Duration(\DateInterval $d)
getCmi5LearnerPreferences()
static generateRegistration(ilObjCmiXapi $obj, ilObjUser $user)
const LP_MODE_DEACTIVATED
static guidv4(?string $data=null)
if(empty($ltiMessageHint)) $mh
catch(\Exception $e) $req