ILIAS  trunk Revision v12.0_alpha-377-g3641b37b9db
class.ilObjCmiXapiGUI.php
Go to the documentation of this file.
1<?php
2
19declare(strict_types=1);
20
22
45{
46 public const TAB_ID_INFO = 'tab_info';
47 public const TAB_ID_SETTINGS = 'tab_settings';
48 public const TAB_ID_STATEMENTS = 'tab_statements';
49 public const TAB_ID_SCORING = 'tab_scoring';
50 public const TAB_ID_LEARNING_PROGRESS = 'learning_progress';
51 public const TAB_ID_METADATA = 'tab_metadata';
52 public const TAB_ID_EXPORT = 'tab_export';
53 public const TAB_ID_PERMISSIONS = 'perm_settings';
54
55 public const CMD_INFO_SCREEN = 'infoScreen';
56 public const CMD_FETCH_XAPI_STATEMENTS = 'fetchXapiStatements';
57
59
60 public const NEW_OBJ_TITLE = "";
61
63 private LOMServices $lom_services;
64
65 public function __construct(int $a_id = 0, int $a_id_type = self::REPOSITORY_NODE_ID, int $a_parent_node_id = 0)
66 {
67 global $DIC;
68
69 parent::__construct($a_id, $a_id_type, $a_parent_node_id);
70
71 if ($this->object instanceof ilObjCmiXapi) {
72 $this->cmixAccess = ilCmiXapiAccess::getInstance($this->object);
73 }
74
75 $this->lng->loadLanguageModule("cmix");
76 $this->lom_services = $DIC->learningObjectMetadata();
77 }
78
79 public function getType(): string
80 {
81 return 'cmix';
82 }
83
87 protected function initCreateForm(string $a_new_type): \ilPropertyFormGUI
88 {
89 $form = new ilPropertyFormGUI();
90 $form->setTarget("_top");
91 $form->setFormAction($this->ctrl->getFormAction($this, "save"));
92 $form->setTitle($this->lng->txt($a_new_type . "_new"));
93
94 $form = $this->initDidacticTemplate($form);
95
96 $title = new ilHiddenInputGUI('title');
97 $title->setValue(self::NEW_OBJ_TITLE);
98 $form->addItem($title);
99
100 $type = new ilRadioGroupInputGUI('Type', 'content_type');
101 $type->setRequired(true);
102
103 $typeLearningModule = new ilRadioOption($this->lng->txt('cmix_add_cmi5_lm'), ilObjCmiXapi::CONT_TYPE_CMI5);
104 $typeLearningModule->setInfo($this->lng->txt('cmix_add_cmi5_lm_info'));
105 $type->addOption($typeLearningModule);
106
107 $typeGenericModule = new ilRadioOption(
108 $this->lng->txt('cmix_add_xapi_standard_object'),
110 );
111 $typeGenericModule->setInfo($this->lng->txt('cmix_add_xapi_standard_object_info'));
112 $type->addOption($typeGenericModule);
113
114 $form->addItem($type);
115
116 $item = new ilRadioGroupInputGUI($this->lng->txt('cmix_add_lrs_type'), 'lrs_type_id');
117 $item->setRequired(true);
119 foreach ($types as $type) {
120 $option = new ilRadioOption((string) $type['title'], (string) $type['type_id'], (string) $type['description']);
121 $item->addOption($option);
122 }
123 $form->addItem($item);
124
125 $source = new ilRadioGroupInputGUI($this->lng->txt('cmix_add_source'), 'source_type');
126 $source->setRequired(true);
127
128 $srcRemoteContent = new ilRadioOption($this->lng->txt('cmix_add_source_url'), 'resource');
129 $srcRemoteContent->setInfo($this->lng->txt('cmix_add_source_url_info'));
130 $source->addOption($srcRemoteContent);
131
132 $srcUploadContent = new ilRadioOption($this->lng->txt('cmix_add_source_local_dir'), 'upload');
133 $srcUploadContent->setInfo($this->lng->txt('cmix_add_source_local_dir_info'));
134 $source->addOption($srcUploadContent);
135
136 $srcUpload = new ilFileInputGUI($this->lng->txt("select_file"), "uploadfile");
137 $srcUpload->setAllowDeletion(false);
138 $srcUpload->setSuffixes(['zip', 'xml']);
139 $srcUpload->setRequired(true);
140 $srcUploadContent->addSubItem($srcUpload);
141
143 $srcServerContent = new ilRadioOption($this->lng->txt('cmix_add_source_upload_dir'), 'server');
144 $srcServerContent->setInfo($this->lng->txt('cmix_add_source_upload_dir_info'));
145 $source->addOption($srcServerContent);
146
147 $options = ['' => $this->lng->txt('cmix_add_source_upload_select')];
148
149 foreach (ilUploadFiles::_getUploadFiles() as $file) {
150 $options[$file] = $file;
151 }
152
153 $srcSelect = new ilSelectInputGUI($this->lng->txt("select_file"), "serverfile");
154 $srcSelect->setOptions($options);
155 $srcServerContent->addSubItem($srcSelect);
156 }
157
158 $srcExternalApp = new ilRadioOption($this->lng->txt('cmix_add_source_external_app'), 'external');
159 $srcExternalApp->setInfo($this->lng->txt('cmix_add_source_external_app_info'));
160 $source->addOption($srcExternalApp);
161
162 $form->addItem($source);
163
164 $form->addCommandButton("save", $this->lng->txt($a_new_type . "_add"));
165 $form->addCommandButton("cancel", $this->lng->txt("cancel"));
166
167 return $form;
168 }
169
170 public function save(): void
171 {
172 // create permission is already checked in createObject. This check here is done to prevent hacking attempts
173 if (!$this->checkPermissionBool("create", "", $this->requested_new_type)) {
174 $this->error->raiseError($this->lng->txt("no_create_permission"), $this->error->MESSAGE);
175 }
176
177 $this->lng->loadLanguageModule($this->requested_new_type);
178 $this->ctrl->setParameter($this, "new_type", $this->requested_new_type);
179
180 $form = $this->initCreateForm($this->requested_new_type);
181
182 $this->ctrl->setParameter($this, 'new_type', '');
183
184 $class_name = 'ilObj' . $this->obj_definition->getClassName($this->requested_new_type);
185
186 $new_obj = new $class_name();
187 $new_obj->setType($this->requested_new_type);
188 $new_obj->processAutoRating();
189 $new_obj->create();
190
191 $this->putObjectInTree($new_obj);
192
193 $dtpl = $data['didactic_templates'] ?? null;
194 if ($dtpl !== null) {
195 $dtpl_id = $this->parseDidacticTemplateVar($dtpl, 'dtpl');
196 $new_obj->applyDidacticTemplate($dtpl_id);
197 }
198
199 $this->afterSave($new_obj);
200 }
201
202
203 protected function afterSave(ilObject $newObject): void
204 {
205 /* @var ilObjCmiXapi $newObject */
206 $form = $this->initCreateForm($newObject->getType());
207
208 if ($form->checkInput()) {
209 $newObject->setContentType($form->getInput('content_type'));
210
211 $newObject->setLrsTypeId((int) $form->getInput('lrs_type_id'));
212 $newObject->initLrsType();
213
214 $newObject->setPrivacyIdent($newObject->getLrsType()->getPrivacyIdent());
215 $newObject->setPrivacyName($newObject->getLrsType()->getPrivacyName());
216
217 switch ($form->getInput('source_type')) {
218 case 'resource': // remote resource
219
220 $newObject->setTitle($form->getInput('title'));
221 $newObject->setSourceType(ilObjCmiXapi::SRC_TYPE_REMOTE);
222 break;
223
224 case 'upload': // upload from local client
225
226 try {
227 $uploadImporter = new ilCmiXapiContentUploadImporter($newObject);
228 $uploadImporter->importFormUpload((array) $form->getInput('uploadfile'));
229
230 $newObject->setSourceType(ilObjCmiXapi::SRC_TYPE_LOCAL);
232 $form->getItemByPostVar('uploadfile')->setAlert($e->getMessage());
233 $this->tpl->setOnScreenMessage('failure', 'something went wrong!', true);
234 $this->ctrl->redirectByClass(self::class, 'create');
235 }
236
237 break;
238
239 case 'server': // from upload directory
240
242 throw new ilCmiXapiException('access denied!');
243 }
244
245 $serverFile = $form->getInput('serverfile');
246
247 if (!ilUploadFiles::_checkUploadFile($serverFile)) {
248 throw new ilCmiXapiException($this->lng->txt('upload_error_file_not_found'));
249 }
250
251 $uploadImporter = new ilCmiXapiContentUploadImporter($newObject);
252
253 $uploadImporter->importServerFile(implode(DIRECTORY_SEPARATOR, [
255 $serverFile
256 ]));
257
258 $newObject->setSourceType(ilObjCmiXapi::SRC_TYPE_LOCAL);
259
260 break;
261
262 case 'external':
263
264 $newObject->setSourceType(ilObjCmiXapi::SRC_TYPE_EXTERNAL);
265 $newObject->setBypassProxyEnabled(true);
266 break;
267 }
268
269 $newObject->save();
270
271 $this->initMetadata($newObject);
272
273 $this->ctrl->redirectByClass(ilCmiXapiSettingsGUI::class);
274 }
275
276 throw new ilCmiXapiException('invalid creation form submit!');
277 }
278
279 public function initMetadata(ilObjCmiXapi $object): void
280 {
281 $this->lom_services->derive()
282 ->fromBasicProperties($object->getTitle())
283 ->forObject($object->getId(), $object->getId(), $object->getType());
284 }
285
286 protected function initHeaderAction(?string $sub_type = null, ?int $sub_id = null): ?ilObjectListGUI
287 {
288 $return = parent::initHeaderAction($sub_type, $sub_id);
289
290 if ($this->creation_mode) {
291 return $return;
292 }
293
294 $validator = new ilCertificateDownloadValidator();
295 if ($validator->isCertificateDownloadable((int) $this->user->getId(), $this->object->getId())) {
296 $certLink = $this->ctrl->getLinkTargetByClass(
297 [ilObjCmiXapiGUI::class, ilCmiXapiSettingsGUI::class],
299 );
300
301 $this->lng->loadLanguageModule('certificate');
302
303 $return->addCustomCommand($certLink, 'download_certificate');
304
305 $return->addHeaderIcon(
306 'cert_icon',
307 ilUtil::getImagePath('standard/icon_cert.svg'),
308 $this->lng->txt('download_certificate'),
309 null,
310 null,
311 $certLink
312 );
313 }
314
315 return $return;
316 }
317
318 public static function _goto(string $a_target): void
319 {
320 global $DIC;
321 $main_tpl = $DIC->ui()->mainTemplate();
322 /* @var \ILIAS\DI\Container $DIC */
323 $err = $DIC['ilErr'];
324 /* @var ilErrorHandling $err */
325 $ctrl = $DIC->ctrl();
326 $request = $DIC->http()->request();
327 $access = $DIC->access();
328 $lng = $DIC->language();
329
330 $targetParameters = explode('_', $a_target);
331 $id = (int) $targetParameters[0];
332
333 if ($id <= 0) {
334 $err->raiseError($lng->txt('msg_no_perm_read'), $err->FATAL);
335 }
336
337 if ($access->checkAccess('read', '', $id)) {
338 $ctrl->setTargetScript('ilias.php');
339 $ctrl->setParameterByClass(ilObjCmiXapiGUI::class, 'ref_id', $id);
340 $ctrl->redirectByClass([ilRepositoryGUI::class, ilObjCmiXapiGUI::class]);
341 } elseif ($access->checkAccess('visible', '', $id)) {
343 } elseif ($access->checkAccess('read', '', ROOT_FOLDER_ID)) {
344 $main_tpl->setOnScreenMessage('info', sprintf(
345 $lng->txt('msg_no_perm_read_item'),
347 ), true);
348
350 }
351
352 $err->raiseError($lng->txt("msg_no_perm_read_lm"), $err->FATAL);
353 }
354
355 public function executeCommand(): void
356 {
357 global $DIC;
358 /* @var \ILIAS\DI\Container $DIC */
359
360 // TODO: access checks (!)
361
362 if (!$this->creation_mode) {
363 $link = ilLink::_getLink($this->object->getRefId(), $this->object->getType());
364 $navigationHistory = $DIC['ilNavigationHistory'];
365 /* @var ilNavigationHistory $navigationHistory */
366 $navigationHistory->addItem($this->object->getRefId(), $link, $this->object->getType());
367 $this->trackObjectReadEvent();
368 }
369
370 $this->prepareOutput();
371 $this->addHeaderAction();
372
374 $obj = $this->object;
375
376 switch ($DIC->ctrl()->getNextClass()) {
377 case strtolower(ilObjectCopyGUI::class):
378
379 $gui = new ilObjectCopyGUI($this);
380 $gui->setType($this->getType());
381 $DIC->ctrl()->forwardCommand($gui);
382
383 break;
384
385 case strtolower(ilCommonActionDispatcherGUI::class):
386
387 $gui = ilCommonActionDispatcherGUI::getInstanceFromAjaxCall();
388 $this->ctrl->forwardCommand($gui);
389
390 break;
391
392 case strtolower(ilLearningProgressGUI::class):
393
394 $DIC->tabs()->activateTab(self::TAB_ID_LEARNING_PROGRESS);
395
396 $gui = new ilLearningProgressGUI(
398 $this->object->getRefId()
399 );
400
401 $DIC->ctrl()->forwardCommand($gui);
402
403 break;
404
405 case strtolower(ilInfoScreenGUI::class):
406 $DIC->tabs()->activateTab(self::TAB_ID_INFO);
407 $this->infoScreenForward();
408 break;
409
410 case strtolower(ilCommentGUI::class):
411 $DIC->ctrl()->redirectByClass(ilCommentGUI::class, "getListHTML");
412 break;
413
414 case strtolower(ilObjectMetaDataGUI::class):
415
416 $DIC->tabs()->activateTab(self::TAB_ID_METADATA);
417
418 $gui = new ilObjectMetaDataGUI($this->object);
419 $DIC->ctrl()->forwardCommand($gui);
420 break;
421
422 case strtolower(ilPermissionGUI::class):
423
424 $DIC->tabs()->activateTab(self::TAB_ID_PERMISSIONS);
425
426 $gui = new ilPermissionGUI($this);
427 $DIC->ctrl()->forwardCommand($gui);
428
429 break;
430
431 case strtolower(ilCmiXapiSettingsGUI::class):
432
433 $DIC->tabs()->activateTab(self::TAB_ID_SETTINGS);
434
435 $gui = new ilCmiXapiSettingsGUI($obj);
436 $DIC->ctrl()->forwardCommand($gui);
437
438 break;
439
440 case strtolower(ilCmiXapiStatementsGUI::class):
441
442 $DIC->tabs()->activateTab(self::TAB_ID_STATEMENTS);
443
444 $gui = new ilCmiXapiStatementsGUI($obj);
445 $DIC->ctrl()->forwardCommand($gui);
446
447 break;
448
449 case strtolower(ilCmiXapiScoringGUI::class):
450
451 $DIC->tabs()->activateTab(self::TAB_ID_SCORING);
452
453 $gui = new ilCmiXapiScoringGUI($obj);
454 $DIC->ctrl()->forwardCommand($gui);
455
456 break;
457
458 case strtolower(ilCmiXapiExportGUI::class):
459
460 $DIC->tabs()->activateTab(self::TAB_ID_EXPORT);
461
462 $gui = new ilCmiXapiExportGUI($this);
463 $DIC->ctrl()->forwardCommand($gui);
464
465 break;
466
467 case strtolower(ilCmiXapiRegistrationGUI::class):
468
469 $DIC->tabs()->activateTab(self::TAB_ID_INFO);
470
471 $gui = new ilCmiXapiRegistrationGUI($obj);
472 $DIC->ctrl()->forwardCommand($gui);
473
474 break;
475
476 case strtolower(ilCmiXapiLaunchGUI::class):
477
478 $gui = new ilCmiXapiLaunchGUI($obj);
479 $DIC->ctrl()->forwardCommand($gui);
480
481 break;
482
483 default:
484
485 $command = $DIC->ctrl()->getCmd(self::DEFAULT_CMD);
486 $this->{$command}();
487 }
488 }
489
490 protected function settings(): void
491 {
492 $this->ctrl->redirectByClass(ilCmiXapiSettingsGUI::class, "show");
493 }
494
495 protected function showSummary(): void
496 {
497 $this->infoScreen();
498 }
499
500 protected function setTabs(): void
501 {
502 global $DIC;
503 /* @var \ILIAS\DI\Container $DIC */
504
505 $DIC->tabs()->addTab(
506 self::TAB_ID_INFO,
507 $DIC->language()->txt(self::TAB_ID_INFO),
508 $DIC->ctrl()->getLinkTargetByClass(ilInfoScreenGUI::class)
509 );
510
511 if ($this->cmixAccess->hasWriteAccess()) {
512 $DIC->tabs()->addTab(
513 self::TAB_ID_SETTINGS,
514 $DIC->language()->txt(self::TAB_ID_SETTINGS),
515 $DIC->ctrl()->getLinkTargetByClass(ilCmiXapiSettingsGUI::class)
516 );
517 }
518
519 if ($this->cmixAccess->hasStatementsAccess()) {
520 $DIC->tabs()->addTab(
521 self::TAB_ID_STATEMENTS,
522 $DIC->language()->txt(self::TAB_ID_STATEMENTS),
523 $DIC->ctrl()->getLinkTargetByClass(ilCmiXapiStatementsGUI::class)
524 );
525 }
526
527 if ($this->cmixAccess->hasHighscoreAccess()) {
528 $DIC->tabs()->addTab(
529 self::TAB_ID_SCORING,
530 $DIC->language()->txt(self::TAB_ID_SCORING),
531 $DIC->ctrl()->getLinkTargetByClass(ilCmiXapiScoringGUI::class)
532 );
533 }
534
535 if ($this->cmixAccess->hasLearningProgressAccess()) {
536 $DIC->tabs()->addTab(
537 self::TAB_ID_LEARNING_PROGRESS,
538 $DIC->language()->txt(self::TAB_ID_LEARNING_PROGRESS),
539 $DIC->ctrl()->getLinkTargetByClass(ilLearningProgressGUI::class)
540 );
541 }
542
543 if ($this->cmixAccess->hasWriteAccess()) {
544 $gui = new ilObjectMetaDataGUI($this->object);
545 $link = $gui->getTab();
546
547 if (strlen($link)) {
548 $DIC->tabs()->addTab(
549 self::TAB_ID_METADATA,
550 $DIC->language()->txt('meta_data'),
551 $link
552 );
553 }
554 }
555
556 if ($this->cmixAccess->hasWriteAccess()) {
557 $DIC->tabs()->addTab(
558 self::TAB_ID_EXPORT,
559 $DIC->language()->txt(self::TAB_ID_EXPORT),
560 $DIC->ctrl()->getLinkTargetByClass(ilCmiXapiExportGUI::class)
561 );
562 }
563
564 if ($this->cmixAccess->hasEditPermissionsAccess()) {
565 $DIC->tabs()->addTab(
566 self::TAB_ID_PERMISSIONS,
567 $DIC->language()->txt(self::TAB_ID_PERMISSIONS),
568 $DIC->ctrl()->getLinkTargetByClass(ilPermissionGUI::class, 'perm')
569 );
570 }
571
572 if (defined('DEVMODE') && DEVMODE) {
573 $DIC->tabs()->addTab(
574 'debug',
575 'DEBUG',
576 $DIC->ctrl()->getLinkTarget($this, 'debug')
577 );
578 }
579 }
580
581 protected function debug(): void
582 {
583 global $DIC;
584 /* @var \ILIAS\DI\Container $DIC */
585
586 $DIC->tabs()->activateTab('debug');
587
588 $filter = new ilCmiXapiStatementsReportFilter();
589 $filter->setActivityId($this->object->getActivityId());
590
591 $linkBuilder = new ilCmiXapiHighscoreReportLinkBuilder(
592 $this->object->getId(),
593 $this->object->getLrsType()->getLrsEndpointStatementsAggregationLink(),
594 $filter
595 );
596
598 $this->object->getLrsType()->getBasicAuth(),
599 $linkBuilder
600 );
601
602 try {
603 $report = $request->queryReport($this->object->getId());
604
605 $DIC->ui()->mainTemplate()->setContent(
606 $report->getResponseDebug()
607 );
608 //ilUtil::sendSuccess('Object ID: '.$this->object->getId());
609 $this->tpl->setOnScreenMessage('info', $linkBuilder->getPipelineDebug());
610 $this->tpl->setOnScreenMessage('question', '<pre>' . print_r($report->getTableData(), true) . '</pre>');
611 } catch (Exception $e) {
612 $this->tpl->setOnScreenMessage('failure', $e->getMessage());
613 }
614 }
615
616 protected function addLocatorItems(): void
617 {
618 global $DIC;
619 /* @var \ILIAS\DI\Container $DIC */
620
621 $locator = $DIC['ilLocator'];
622 /* @var ilLocatorGUI $locator */
623 $locator->addItem(
624 $this->object->getTitle(),
625 $this->ctrl->getLinkTarget($this, self::DEFAULT_CMD),
626 "",
627 $DIC->http()->wrapper()->query()->retrieve("ref_id", $DIC->refinery()->kindlyTo()->int())
628 );
629 }
630
631 protected function trackObjectReadEvent(): void
632 {
633 global $DIC;
634 /* @var \ILIAS\DI\Container $DIC */
635
637 $this->object->getType(),
638 $this->object->getRefId(),
639 $this->object->getId(),
640 $DIC->user()->getId()
641 );
642 }
643
644 public function infoScreen(): void
645 {
646 global $DIC;
647
648 $DIC->tabs()->activateTab(self::TAB_ID_INFO);
649 $this->ctrl->redirectByClass(ilInfoScreenGUI::class, 'showSummary');
650 }
651
652 public function infoScreenForward(): void
653 {
654 global $DIC;
655 /* @var \ILIAS\DI\Container $DIC */
656 $ilErr = $DIC['ilErr'];
657 /* @var ilErrorHandling $ilErr */
658
659 if (!$this->checkPermissionBool("visible") && !$this->checkPermissionBool("read")) {
660 $ilErr->raiseError($DIC->language()->txt("msg_no_perm_read"), $ilErr->MESSAGE);
661 }
662
664 $this->initInfoScreenToolbar();
665
666 $info = new ilInfoScreenGUI($this);
667
668 $info->enablePrivateNotes();
669
670 if ($this->checkPermissionBool("read")) {
671 $info->enableNews();
672 }
673
674 $info->enableNewsEditing(false);
675
676 if ($this->checkPermissionBool("write")) {
677 $news_set = new ilSetting("news");
678 $enable_internal_rss = $news_set->get("enable_rss_for_internal");
679
680 if ($enable_internal_rss) {
681 $info->setBlockProperty("news", "settings", (string) true);
682 $info->setBlockProperty("news", "public_notifications_option", (string) true);
683 }
684 }
685
686 if (DEVMODE) {
687 // Development Info
688 $info->addSection('DEVMODE Info');
689 $info->addProperty('Local Object ID', (string) $this->object->getId());
690 $info->addProperty('Current User ID', (string) $DIC->user()->getId());
691 }
692
693 // standard meta data
694 $info->addMetaDataSections($this->object->getId(), 0, $this->object->getType());
695
696 // Info about privacy
697 if ($this->object->isSourceTypeExternal()) {
698 $info->addSection($DIC->language()->txt("cmix_info_privacy_section"));
699 } else {
700 $info->addSection($DIC->language()->txt("cmix_info_privacy_section_launch"));
701 }
702
703 $info->addProperty($DIC->language()->txt('cmix_lrs_type'), $this->object->getLrsType()->getTitle());
704
705 if ($this->object->isSourceTypeExternal()) {
706 $cmixUser = new ilCmiXapiUser(
707 $this->object->getId(),
708 $DIC->user()->getId(),
709 $this->object->getPrivacyIdent()
710 );
711 if ($cmixUser->getUsrIdent()) {
712 $info->addProperty(
713 $DIC->language()->txt("conf_user_registered_mail"),
714 $cmixUser->getUsrIdent()
715 );
716 }
717 } else {
718 $info->addProperty(
719 $DIC->language()->txt("conf_privacy_name"),
720 $DIC->language()->txt('conf_privacy_name_' . self::getPrivacyNameString($this->object->getPrivacyName()))
721 );
722
723 $info->addProperty(
724 $DIC->language()->txt("conf_privacy_ident"),
725 $DIC->language()->txt('conf_privacy_ident_' . self::getPrivacyIdentString($this->object->getPrivacyIdent()))
726 );
727 }
728
729 if ($this->object->getLrsType()->getExternalLrs()) {
730 $info->addProperty(
731 $DIC->language()->txt("cmix_info_external_lrs_label"),
732 $DIC->language()->txt('cmix_info_external_lrs_info')
733 );
734 }
735
736 if (strlen($this->object->getLrsType()->getPrivacyCommentDefault())) {
737 $info->addProperty(
738 $DIC->language()->txt("cmix_indication_to_user"),
739 nl2br($this->object->getLrsType()->getPrivacyCommentDefault())
740 );
741 }
742
743 // FINISHED INFO SCREEN, NOW FORWARD
744
745 $this->ctrl->forwardCommand($info);
746 }
747
748 protected function initInfoScreenToolbar(): void
749 {
750 global $DIC;
751 /* @var \ILIAS\DI\Container $DIC */
752
753 if (!$this->object->getOfflineStatus() && $this->object->getLrsType()->isAvailable() && $this->checkPermissionBool("read")) {
754 // TODO : check if this is the correct query
755 // p.e. switched to another privacyIdent before: user exists but not with the new privacyIdent
756 // re_check for isSourceTypeExternal
757 //$cmixUserExists = ilCmiXapiUser::exists($this->object->getId(), $DIC->user()->getId());
758
759 if ($this->object->isSourceTypeExternal()) {
760 $extCmiUserExists = ilCmiXapiUser::exists($this->object->getId(), $DIC->user()->getId());
761 // $registerButton = ilLinkButton::getInstance();
762 //
763 // if ($extCmiUserExists) {
764 // $registerButton->setCaption('change_registration');
765 // } else {
766 // $registerButton->setPrimary(true);
767 // $registerButton->setCaption('create_registration');
768 // }
769 //
770 // $registerButton->setUrl($DIC->ctrl()->getLinkTargetByClass(
771 // ilCmiXapiRegistrationGUI::class
772 // ));
773 //
774 // $DIC->toolbar()->addButtonInstance($registerButton);
775
776 if ($extCmiUserExists) {
777 $label = $this->lng->txt('change_registration');
778 } else {
779 // $registerButton->setPrimary(true);
780 $label = $this->lng->txt('create_registration');
781 }
782 $button = $DIC->ui()->factory()->button()->primary(
783 $label,
784 $DIC->ctrl()->getLinkTargetByClass(ilCmiXapiRegistrationGUI::class)
785 );
786 $DIC->toolbar()->addComponent($button);
787 } else {
788 $launchButton = ilLinkButton::getInstance();
789 $launchButton->setPrimary(true);
790 $launchButton->setCaption('launch');
791
792 if ($this->object->getLaunchMethod() == ilObjCmiXapi::LAUNCH_METHOD_NEW_WIN) {
793 $launchButton->setTarget('_blank');
794 }
795
796 $launchButton->setUrl($DIC->ctrl()->getLinkTargetByClass(
797 ilCmiXapiLaunchGUI::class
798 ));
799
800 $DIC->toolbar()->addButtonInstance($launchButton);
801
802 //todo
803 // if ($this->object->getLaunchMethod() == ilObjCmiXapi::LAUNCH_METHOD_NEW_WIN) {
804 // setTarget('_blank');
805 // }
806 // $button = $DIC->ui()->factory()->button()->primary(
807 // $this->lng->txt('launch'),
808 // $DIC->ctrl()->getLinkTargetByClass(ilCmiXapiLaunchGUI::class)
809 // );
810 // $DIC->toolbar()->addComponent($button);
811 }
812
818 $cmiUserExists = ilCmiXapiUser::exists(
819 $this->object->getId(),
820 $DIC->user()->getId(),
821 $this->object->getPrivacyIdent()
822 );
823
824 if ($cmiUserExists) {
825 $cmixUser = new ilCmiXapiUser(
826 $this->object->getId(),
827 $DIC->user()->getId(),
828 $this->object->getPrivacyIdent()
829 );
830
831 if ($this->isFetchXapiStatementsRequired($cmixUser)) {
832 $button = $DIC->ui()->factory()->button()->primary(
833 $this->lng->txt('fetch_xapi_statements'),
834 $DIC->ctrl()->getLinkTarget(
835 $this,
836 self::CMD_FETCH_XAPI_STATEMENTS
837 )
838 );
839 $DIC->toolbar()->addComponent($button);
840 $this->sendLastFetchInfo($cmixUser);
841 }
842 }
843 }
844 }
845
846 protected function handleAvailablityMessage(): void
847 {
848 global $DIC;
849
850 if ($this->object->getLrsType()->getAvailability() == ilCmiXapiLrsType::AVAILABILITY_NONE) {
851 $DIC->language()->loadLanguageModule('cmix');
852 $this->tpl->setOnScreenMessage('failure', $DIC->language()->txt('lrs_type_not_avail_msg'));
853 }
854 }
855
856 protected function isFetchXapiStatementsRequired(ilCmiXapiUser $cmixUser): bool
857 {
858 global $DIC;
859 if ($this->object->getLaunchMode() != ilObjCmiXapi::LAUNCH_MODE_NORMAL) {
860 return false;
861 }
862
863 if ($this->object->isBypassProxyEnabled()) {
864 return true;
865 }
866
867 if (!$cmixUser->hasProxySuccess()) {
868 return true;
869 }
870
871 return false;
872 }
873
874 protected function sendLastFetchInfo(ilCmiXapiUser $cmixUser): void
875 {
876 global $DIC;
877 /* @var \ILIAS\DI\Container $DIC */
878
879 if (!$cmixUser->getFetchUntil()->get(IL_CAL_UNIX)) {
880 $info = $DIC->language()->txt('xapi_statements_not_fetched_yet');
881 } else {
882 $info = $DIC->language()->txt('xapi_statements_last_fetch_date') . ' ' . ilDatePresentation::formatDate(
883 $cmixUser->getFetchUntil()
884 );
885 }
886
887 $this->tpl->setOnScreenMessage('info', $info);
888 }
889
890 protected function fetchXapiStatements(): void
891 {
892 global $DIC;
893 /* @var \ILIAS\DI\Container $DIC */
894 $logger = ilLoggerFactory::getLogger($this->object->getType());
895
896 if ($this->object->getLaunchMode() != ilObjCmiXapi::LAUNCH_MODE_NORMAL) {
897 throw new ilCmiXapiException('access denied!');
898 }
899
900 $cmixUser = new ilCmiXapiUser($this->object->getId(), $DIC->user()->getId(), $this->object->getPrivacyIdent());
901
902 $fetchedUntil = $cmixUser->getFetchUntil();
903 $now = new ilCmiXapiDateTime(time(), IL_CAL_UNIX);
904
905 $report = $this->getXapiStatementsReport($fetchedUntil, $now);
906
907 if ($report->hasStatements()) {
908 $evaluation = new ilXapiStatementEvaluation($logger, $this->object);
909 $evaluation->evaluateReport($report);
910
911 //$logger->debug('update lp for object (' . $this->object->getId() . ')');
912 //ilLPStatusWrapper::_updateStatus($this->object->getId(), $DIC->user()->getId());
913 }
914
915 $cmixUser->setFetchUntil($now);
916 $cmixUser->save();
917
918 $this->tpl->setOnScreenMessage('success', $DIC->language()->txt('xapi_statements_fetched_successfully'), true);
919 $DIC->ctrl()->redirect($this, self::CMD_INFO_SCREEN);
920 }
921
922 protected function getXapiStatementsReport(
923 ilCmiXapiDateTime $since,
924 ilCmiXapiDateTime $until
926 $filter = $this->buildReportFilter($since, $until);
927
928 $linkBuilder = new ilCmiXapiStatementsReportLinkBuilder(
929 $this->object->getId(),
930 $this->object->getLrsType()->getLrsEndpointStatementsAggregationLink(),
931 $filter
932 );
933
935 $this->object->getLrsType()->getBasicAuth(),
936 $linkBuilder
937 );
938
939 return $request->queryReport($this->object->getId());
940 }
941
942 protected function buildReportFilter(
943 ilCmiXapiDateTime $since,
944 ilCmiXapiDateTime $until
946 global $DIC;
947 /* @var \ILIAS\DI\Container $DIC */
948
949 $filter = new ilCmiXapiStatementsReportFilter();
950
951 $filter->setActor(new ilCmiXapiUser($this->object->getId(), $DIC->user()->getId()));
952 $filter->setActivityId($this->object->getActivityId());
953
954 $filter->setStartDate($since);
955 $filter->setEndDate($until);
956
957 $start = $filter->getStartDate()->get(IL_CAL_DATETIME);
958 $end = $filter->getEndDate()->get(IL_CAL_DATETIME);
959 ilLoggerFactory::getLogger($this->object->getType())->debug("use filter from ($start) until ($end)");
960
961 return $filter;
962 }
963
964 public static function getPrivacyIdentString(int $ident): string
965 {
966 switch ($ident) {
967 case 0:
968 return "il_uuid_user_id";
969 case 1:
970 return "il_uuid_ext_account";
971 case 2:
972 return "il_uuid_login";
973 case 3:
974 return "real_email";
975 case 4:
976 return "il_uuid_random";
977 case 5:
978 return "il_uuid_sha256";
979 case 6:
980 return "il_uuid_sha256url";
981 }
982 return '';
983 }
984
985 public static function getPrivacyNameString(int $ident): string
986 {
987 switch ($ident) {
988 case 0:
989 return "none";
990 case 1:
991 return "firstname";
992 case 2:
993 return "lastname";
994 case 3:
995 return "fullname";
996 }
997 return '';
998 }
999}
const IL_CAL_UNIX
const IL_CAL_DATETIME
error(string $a_errmsg)
Validates if an active certificate is stored in the database and can be downloaded by the user.
static _recordReadEvent(string $a_type, int $a_ref_id, int $obj_id, int $usr_id, $a_ext_rc=null, $a_ext_time=null)
static getInstance(ilObjCmiXapi $object)
static getTypesData(bool $a_extended=false, ?int $a_availability=null)
Get basic data array of all types (without field definitions)
static exists(int $objId, int $usrId, int $privacyIdent=999)
Class ilCommonActionDispatcherGUI.
redirectByClass( $a_class, ?string $a_cmd=null, ?string $a_anchor=null, bool $is_async=false)
@inheritDoc
setTargetScript(string $a_target_script)
@inheritDoc
setParameterByClass(string $a_class, string $a_parameter, $a_value)
@inheritDoc
static formatDate(ilDateTime $date, bool $a_skip_day=false, bool $a_include_wd=false, bool $include_seconds=false, ?ilObjUser $user=null,)
This class represents a file property in a property form.
This class represents a hidden form property in a property form.
Class ilInfoScreenGUI.
txt(string $a_topic, string $a_default_lang_fallback_mod="")
gets the text for a given topic if the topic is not in the list, the topic itself with "-" will be re...
Class ilObjUserTrackingGUI.
static getLogger(string $a_component_id)
Get component logger.
sendLastFetchInfo(ilCmiXapiUser $cmixUser)
isFetchXapiStatementsRequired(ilCmiXapiUser $cmixUser)
__construct(int $a_id=0, int $a_id_type=self::REPOSITORY_NODE_ID, int $a_parent_node_id=0)
setTabs()
create tabs (repository/workspace switch)
static getPrivacyNameString(int $ident)
addLocatorItems()
Functions to be overwritten.
afterSave(ilObject $newObject)
Post (successful) object creation hook.
static _goto(string $a_target)
ilCmiXapiAccess $cmixAccess
initCreateForm(string $a_new_type)
getType()
Functions that must be overwritten.
initHeaderAction(?string $sub_type=null, ?int $sub_id=null)
Add header action menu.
static getPrivacyIdentString(int $ident)
getXapiStatementsReport(ilCmiXapiDateTime $since, ilCmiXapiDateTime $until)
initMetadata(ilObjCmiXapi $object)
buildReportFilter(ilCmiXapiDateTime $since, ilCmiXapiDateTime $until)
New implementation of ilObjectGUI.
executeCommand()
execute command
ilAccessHandler $access
checkPermissionBool(string $perm, string $cmd="", string $type="", ?int $node_id=null)
putObjectInTree(ilObject $obj, ?int $parent_node_id=null)
Add object to tree at given position.
ilLocatorGUI $locator
prepareOutput(bool $show_sub_objects=true)
GUI class for the workflow of copying objects.
static _gotoRepositoryRoot(bool $raise_error=false)
Goto repository root.
initDidacticTemplate(ilPropertyFormGUI $form)
addHeaderAction()
Add header action menu.
static _gotoRepositoryNode(int $ref_id, string $cmd="")
ServerRequestInterface $request
parseDidacticTemplateVar(string $var, string $type)
Class ilObjectMetaDataGUI.
Class ilObject Basic functions for all objects.
setTitle(string $title)
static _lookupObjId(int $ref_id)
static _lookupTitle(int $obj_id)
This class represents a property form user interface.
This class represents a property in a property form.
This class represents an option in a radio group.
This class represents a selection list property in a property form.
ILIAS Setting Class.
static _checkUploadFile(string $a_file)
static _getUploadDirectory()
static getImagePath(string $image_name, string $module_path="", string $mode="output", bool $offline=false)
get image path (for images located in a template directory)
const ROOT_FOLDER_ID
Definition: constants.php:32
$info
Definition: entry_point.php:21
checkAccess(string $a_permission, string $a_cmd, int $a_ref_id, string $a_type="", ?int $a_obj_id=null, ?int $a_tree_id=null)
check access for an object (provide $a_type and $a_obj_id if available for better performance)
__construct(Container $dic, ilPlugin $plugin)
@inheritDoc
$ilErr
Definition: raiseError.php:33
global $DIC
Definition: shib_login.php:26