Prelaunch post cmi5LearnerPreference (agent profile) post LMS.LaunchData.
223 : array
224 {
226 $lrsType = $this->object->getLrsType();
227 $defaultLrs = $lrsType->getLrsEndpoint();
228
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
240 if ($registration == '') {
242 }
243
244 $activityId = $this->object->getActivityId();
245
246
247 $profileParams = [];
248 $defaultAgentProfileUrl = $defaultLrs . "/agents/profile";
249 $profileParams[
'agent'] = json_encode($this->
object->getStatementActor($this->cmixUser));
250 $profileParams['profileId'] = 'cmi5LearnerPreferences';
252
253
254 $launchDataParams = [];
255 $defaultStateUrl = $defaultLrs . "/activities/state";
256
257 $launchDataParams[
'agent'] = json_encode($this->
object->getStatementActor($this->cmixUser));
258 $launchDataParams['activityId'] = $activityId;
259 $launchDataParams['activity_id'] = $activityId;
260 $launchDataParams['registration'] = $registration;
261 $launchDataParams['stateId'] = 'LMS.LaunchData';
264 $cmi5LearnerPreferences = json_encode($cmi5LearnerPreferencesObj);
265 $lang = $cmi5LearnerPreferencesObj[
'languagePreference'];
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
280 if (isset($lastStatement[0][
'statement'][
'verb'][
'id']) && $lastStatement[0][
'statement'][
'verb'][
'id'] !=
ilCmiXapiVerbList::getInstance()->getVerbUri(
'terminated')) {
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
290
291
292
293 $satisfied = false;
294 $lpMode = $this->object->getLPMode();
295
296
298 $satisfied = true;
299 }
300
301 $tokenObject->setCmi5Session($cmi5_session);
302 $sessionData = array();
303 $sessionData['cmi5LearnerPreferences'] = $cmi5LearnerPreferencesObj;
304
306 $sessionData['launchedTimestamp'] = $now->toXapiTimestamp();
307 $tokenObject->setCmi5SessionData(json_encode($sessionData));
308 $tokenObject->update();
309 $defaultStatementsUrl = $defaultLrs . "/statements";
310
311
312 $launchData = json_encode($this->
object->getLaunchData($this->cmixUser,
$lang));
313 $launchedStatement = $this->object->getLaunchedStatement($this->cmixUser);
314 $launchedStatementParams = [];
315 $launchedStatementParams['statementId'] = $launchedStatement['id'];
317
318
319 if ($abandoned) {
320 $abandonedStatement = $this->
object->getAbandonedStatement($oldSession,
$duration, $this->cmixUser);
321 $abandonedStatementParams = [];
322 $abandonedStatementParams['statementId'] = $abandonedStatement['id'];
324 }
325
326 if ($satisfied) {
327 $satisfiedStatement = $this->object->getSatisfiedStatement($this->cmixUser);
328 $satisfiedStatementParams = [];
329 $satisfiedStatementParams['statementId'] = $satisfiedStatement['id'];
331 }
332 $client =
new GuzzleHttp\Client();
333 $req_opts = array(
334 GuzzleHttp\RequestOptions::VERIFY => true,
335 GuzzleHttp\RequestOptions::CONNECT_TIMEOUT => 10,
336 GuzzleHttp\RequestOptions::HTTP_ERRORS => false
337 );
338 $defaultProfileRequest = new GuzzleHttp\Psr7\Request(
339 'POST',
340 $defaultProfileUrl,
341 $defaultHeaders,
342 $cmi5LearnerPreferences
343 );
344 $defaultLaunchDataRequest = new GuzzleHttp\Psr7\Request(
345 'PUT',
346 $defaultLaunchDataUrl,
347 $defaultHeaders,
348 $launchData
349 );
350 $defaultLaunchedStatementRequest = new GuzzleHttp\Psr7\Request(
351 'PUT',
352 $defaultLaunchedStatementUrl,
353 $defaultHeaders,
354 json_encode($launchedStatement)
355 );
356 if ($abandoned) {
357 $defaultAbandonedStatementRequest = new GuzzleHttp\Psr7\Request(
358 'PUT',
359 $defaultAbandonedStatementUrl,
360 $defaultHeaders,
361 json_encode($abandonedStatement)
362 );
363 }
364 if ($satisfied) {
365 $defaultSatisfiedStatementRequest = new GuzzleHttp\Psr7\Request(
366 'PUT',
367 $defaultSatisfiedStatementUrl,
368 $defaultHeaders,
369 json_encode($satisfiedStatement)
370 );
371 }
372 $promises = array();
373 $promises[
'defaultProfile'] =
$client->sendAsync($defaultProfileRequest, $req_opts);
374 $promises[
'defaultLaunchData'] =
$client->sendAsync($defaultLaunchDataRequest, $req_opts);
375 $promises[
'defaultLaunchedStatement'] =
$client->sendAsync($defaultLaunchedStatementRequest, $req_opts);
376 if ($abandoned) {
377 $promises[
'defaultAbandonedStatement'] =
$client->sendAsync($defaultAbandonedStatementRequest, $req_opts);
378 }
379 if ($satisfied) {
380 $promises[
'defaultSatisfiedStatement'] =
$client->sendAsync($defaultSatisfiedStatementRequest, $req_opts);
381 }
382 try {
383 $responses = GuzzleHttp\Promise\Utils::settle($promises)->wait();
384 $body = '';
387 }
388 }
catch (Exception
$e) {
389 $this->
log()->error(
'error:' . $e->getMessage());
390 }
391 return array(
'cmi5_session' => $cmi5_session,
'token' =>
$token);
392 }
static buildQuery(array $params, $encoding=PHP_QUERY_RFC3986)
static checkResponse(array $response, &$body, array $allowedStatus=[200, 204])
static getInstanceByToken(string $token)
static dateIntervalToISO860Duration(\DateInterval $d)
getCmi5LearnerPreferences()
static generateRegistration(ilObjCmiXapi $obj, ilObjUser $user)
const LP_MODE_DEACTIVATED
static guidv4(?string $data=null)