ILIAS  trunk Revision v11.0_alpha-3011-gc6b235a2e85
class.ilObjLTIConsumerGUI.php
Go to the documentation of this file.
1<?php
2
19declare(strict_types=1);
20
23
42{
43 public const CFORM_CUSTOM_NEW = 99;
44 public const CFORM_DYNAMIC_REGISTRATION = 98; //
45
46 public const TAB_ID_INFO = 'tab_info';
47 public const TAB_ID_CONTENT = 'tab_content';
48 public const TAB_ID_SETTINGS = 'tab_settings';
49 public const TAB_ID_STATEMENTS = 'tab_statements';
50 public const TAB_ID_SCORING = 'tab_scoring';
51 public const TAB_ID_GRADE_SYNCHRONIZATION = 'tab_grade_synchronization';
52 public const TAB_ID_METADATA = 'tab_metadata';
53 public const TAB_ID_LEARNING_PROGRESS = 'learning_progress';
54 public const TAB_ID_PERMISSIONS = 'perm_settings';
55
56 public const DEFAULT_CMD = 'launch';
57
58 public ?ilObject $object = null;
60 protected LOMServices $lom_services;
61
62 public int $parent_node_id = 0; //check
63
64 public function __construct(int $a_id = 0, int $a_id_type = self::REPOSITORY_NODE_ID, int $a_parent_node_id = 0)
65 {
66 global $DIC;
67 /* @var \ILIAS\DI\Container $DIC */
68
69 parent::__construct($a_id, $a_id_type, $a_parent_node_id);
70 $this->parent_node_id = $a_parent_node_id;
71 if ($this->object instanceof ilObjLTIConsumer) {
72 $this->ltiAccess = new ilLTIConsumerAccess($this->object);
73 }
74 $this->lom_services = $DIC->learningObjectMetadata();
75
76 $DIC->language()->loadLanguageModule("lti");
77 $DIC->language()->loadLanguageModule("rep");
78 }
79
80 public function getType(): string
81 {
82 return 'lti';
83 }
84
88 protected function initCreateForm(string $a_new_type): array
89 {
90 $forms = array(
91 self::CFORM_NEW => $this->initNewForm($a_new_type)
92 );
93
95 $forms[self::CFORM_DYNAMIC_REGISTRATION] = $this->initDynRegForm($a_new_type);
96 $forms[self::CFORM_CUSTOM_NEW] = $this->initCustomCreateForm($a_new_type);
97 }
98
99 return $forms;
100 }
101
102 public function saveObject(): void
103 {
104 // create permission is already checked in createObject. This check here is done to prevent hacking attempts
105 if (!$this->checkPermissionBool("create", "", $this->requested_new_type)) {
106 $this->error->raiseError($this->lng->txt("no_create_permission"), $this->error->MESSAGE);
107 }
108
109 $this->lng->loadLanguageModule($this->requested_new_type);
110 $this->ctrl->setParameter($this, "new_type", $this->requested_new_type);
111
112 $forms = $this->initCreateForm($this->requested_new_type);
113
114 foreach ($forms as $form) {
115 if ($form->checkInput()) {
116 $this->ctrl->setParameter($this, "new_type", "");
117
118 $class_name = "ilObj" . $this->obj_definition->getClassName($this->requested_new_type);
119 $newObj = new $class_name();
120 $newObj->setType($this->requested_new_type);
121 $newObj->setTitle($form->getInput("title"));
122 $newObj->setDescription($form->getInput("desc"));
123 $newObj->processAutoRating();
124 $newObj->create();
125
126 $this->putObjectInTree($newObj);
127
128 $dtpl = $this->getDidacticTemplateVar("dtpl");
129 if ($dtpl) {
130 $newObj->applyDidacticTemplate($dtpl);
131 }
132
133 $this->afterSave($newObj);
134 }
135
136 $form->setValuesByPost();
137 $this->tpl->setContent($form->getHTML());
138 }
139
140 }
141
142 protected function getCreationFormsHTML(StandardForm|ilPropertyFormGUI|array $forms): string
143 {
144 if (!is_array($forms)) {
145 throw new Exception('We only deal with arrays here.');
146 }
147
148 $acc = new ilAccordionGUI();
149 $acc->setBehaviour(ilAccordionGUI::FIRST_OPEN);
150 array_walk(
151 $forms,
152 function (ilPropertyFormGUI $v, string $k) use ($acc): void {
153 $acc->addItem(
154 $v->getTitle(),
155 $v->getHTML()
156 );
157 }
158 );
159
160 return $acc->getHTML();
161 }
162
163 protected function initNewForm(string $a_new_type): \ilLTIConsumerProviderSelectionFormTableGUI
164 {
165 return $this->buildProviderSelectionForm($a_new_type);
166 }
167
168 public function initDynRegForm(string $a_new_type): \ilLTIConsumeProviderFormGUI
169 {
170 global $DIC;
171 /* @var \ILIAS\DI\Container $DIC */
174 $form->initDynRegForm($this->ctrl->getFormAction($this, "cancelDynReg"));
175 $form->setTitle($DIC->language()->txt($a_new_type . '_dynamic_registration'));
176 return $form;
177 }
178
179 public function initShowToolConfig(string $a_new_type, int $a_provider_id): \ilLTIConsumeProviderFormGUI
180 {
181 global $DIC;
182
183 //ToDo: Error Handling
184 $provider = new ilLTIConsumeProvider($a_provider_id);
185
187
188 $form->initToolConfigForm($this->ctrl->getFormAction($this, "cancelDynReg"), '', '');
189
190 $form->clearCommandButtons();
191 $form->addCommandButton("saveDynReg", $this->lng->txt('save'));
192 $form->addCommandButton("cancelDynReg", $this->lng->txt("cancel"));
193
194 $form->setTitle($DIC->language()->txt($a_new_type . '_custom_new'));
195
196 return $form;
197 }
198
199 public function initCustomCreateForm(string $a_new_type): \ilLTIConsumeProviderFormGUI
200 {
201 global $DIC;
202 /* @var \ILIAS\DI\Container $DIC */
203
205
207
208 $form->initForm($this->ctrl->getFormAction($this, "save"), '', '');
209
210 $form->clearCommandButtons();
211 $form->addCommandButton("saveCustom", $this->lng->txt($a_new_type . "_add_own_provider"));
212 $form->addCommandButton("cancel", $this->lng->txt("cancel"));
213
214 $form->setTitle($DIC->language()->txt($a_new_type . '_custom_new'));
215
216 return $form;
217 }
218
220 {
222 $a_new_type,
223 $this,
224 'create',
225 );
226 }
227
228 protected function createNewObject(string $newType, string $title, string $description): ilObject
229 {
230 $classname = "ilObj" . $this->obj_definition->getClassName($newType);
231
232 $newObj = new $classname();
233 $newObj->setType($newType);
234 $newObj->setTitle($title);
235 $newObj->setDescription($description);
236 $newObj->create();
237 $this->putObjectInTree($newObj);
238 return $newObj;
239 }
240
241 public function saveCustom(): void
242 {
244 throw new ilLtiConsumerException('permission denied!');
245 }
246
247 global $DIC;
248 /* @var \ILIAS\DI\Container $DIC */
249
250 $new_type = $this->getRequestValue("new_type");
251
252 $DIC->ctrl()->setParameter($this, "new_type", $new_type);
253
254 $DIC->language()->loadLanguageModule($new_type);
255
256 $form = $this->initCustomCreateForm($new_type);
257
258 if ($form->checkInput()) {
259 $DIC->ctrl()->setParameter($this, "new_type", "");
260
261 // create object
262 $newObj = $this->createNewObject(
263 $new_type,
264 $form->getInput('title'),
265 $form->getInput('desc')
266 );
267
268 // apply didactic template?
269 $dtpl = $this->getDidacticTemplateVar("dtpl");
270 if ($dtpl) {
271 $newObj->applyDidacticTemplate($dtpl);
272 }
273
274 $this->afterSave($newObj);
275
276 return;
277 }
278
279 $form->setValuesByPost();
280
281 $DIC->ui()->mainTemplate()->setContent($form->getHtml());
282 }
283
284 public function addDynReg(): void
285 {
286 global $DIC;
288 throw new ilLtiConsumerException('permission denied!');
289 }
290 $new_type = $this->getRequestValue("new_type");
291
292 $DIC->ctrl()->setParameter($this, "new_type", $new_type);
293
294 $DIC->language()->loadLanguageModule($new_type);
295 $form = $this->initDynRegForm($new_type);
296 $error = ($this->getRequestValue('error') != null) ? $this->getRequestValue('error') : "";
297 $form->setValuesByPost();
298 if (!empty($error)) {
299 $DIC->ctrl()->setParameter($this, "new_type", "");
300 $DIC->ui()->mainTemplate()->setOnScreenMessage('failure', base64_decode($error));
301 $DIC->ui()->mainTemplate()->setContent($form->getDynRegError());
302 return;
303 }
304 if ($form->checkInput()) {
305 $DIC->ctrl()->setParameter($this, "new_type", "");
306 $DIC->ui()->mainTemplate()->setContent($form->getDynRegRequest());
307 return;
308 }
309 $DIC->ui()->mainTemplate()->setContent($form->getHTML());
310 }
311
312 public function cancelDynReg(): void
313 {
314 global $DIC;
316 throw new ilLtiConsumerException('permission denied!');
317 }
318 $new_type = $this->getRequestValue("new_type");
319 //$provider_id = $this->getRequestValue("provider_id");
320 if (ilSession::has('lti_dynamic_registration_client_id')) {
321 $providerId = ilLTIConsumeProvider::getProviderIdFromClientId(ilSession::get('lti_dynamic_registration_client_id'));
322 if ($providerId > 0) {
323 try {
325 //ToDo: check if provider is in use? should never happen...
326 $provider->delete();
327 } catch (\ILIAS\Filesystem\Exception\IOException $e) {
328 //ToDo: error handling
329 }
330 }
331 }
332 $DIC->ctrl()->setParameterByClass(ilRepositoryGUI::class, 'new_type', $new_type);
333 $DIC->ctrl()->redirectByClass(ilRepositoryGUI::class, 'create');
334 }
335
336 public function showToolConfig(): void
337 {
338 global $DIC;
340 throw new ilLtiConsumerException('permission denied!');
341 }
342 $new_type = $this->getRequestValue("new_type");
343 $DIC->ctrl()->setParameter($this, "new_type", $new_type);
344 $provider_id = $this->getRequestValue("provider_id");
345 $DIC->ctrl()->setParameter($this, "provider_id", $provider_id);
346 $DIC->language()->loadLanguageModule($new_type);
347 $form = $this->initShowToolConfig($new_type, (int) $provider_id);
348 $DIC->ui()->mainTemplate()->setContent($form->getHTML());
349 }
350
351 public function saveDynReg(): void
352 {
353 global $DIC;
355 throw new ilLtiConsumerException('permission denied!');
356 }
357 $new_type = $this->getRequestValue("new_type");
358 $DIC->ctrl()->setParameter($this, "new_type", $new_type);
359 $provider_id = $this->getRequestValue("provider_id");
360 $DIC->ctrl()->setParameter($this, "provider_id", $provider_id);
361 $DIC->language()->loadLanguageModule($new_type);
362 ilSession::clear('lti_dynamic_registration_client_id');
363 ilSession::clear('lti_dynamic_registration_custom_params');
364 $form = $this->initShowToolConfig($new_type, (int) $provider_id);
365 $form->setValuesByPost();
366 if ($form->checkInput()) { // update only overridable fields
367 $provider = $form->getProvider();
368 $form->initProvider($provider);
369 $provider->update();
370 // jump to provider selection is one option:
371 // $DIC->ctrl()->redirectByClass([ilRepositoryGUI::class, ilObjLTIConsumerGUI::class],"create");
372 // direct redirection to save is onle less click (there is a switch for save | contentSelection in GUI class):
373 $DIC->ctrl()->redirectByClass([ilRepositoryGUI::class, ilObjLTIConsumerGUI::class], "save");
374 return;
375 }
376 $DIC->ui()->mainTemplate()->setContent($form->getHTML());
377 }
378
379 public function contentSelection(string $providerId, string $newType, string $refId, ilLTIConsumeProvider $provider): void
380 {
381 global $DIC;
383 throw new ilLtiConsumerException('permission denied!');
384 }
385 $DIC->ctrl()->setParameter($this, "new_type", $newType);
386 $DIC->ctrl()->setParameter($this, "provider_id", $providerId);
387 $DIC->ctrl()->setParameter($this, "ref_id", $refId);
388
390 $formaction = $this->ctrl->getFormAction($this, "cancelContentSelection");
391 $DIC->ui()->mainTemplate()->setContent($form->getContentSelectionFrame($formaction));
392 }
393
394 public function contentSelectionRequest(): void
395 {
396 global $DIC;
398 throw new ilLtiConsumerException('permission denied!');
399 }
400 $new_type = $this->getRequestValue("new_type");
401 $DIC->ctrl()->setParameter($this, "new_type", $new_type);
402 $provider_id = $this->getRequestValue("provider_id");
403 $DIC->ctrl()->setParameter($this, "provider_id", $provider_id);
404 $ref_id = $this->getRequestValue("ref_id");
405 $DIC->ctrl()->setParameter($this, "ref_id", $ref_id);
406 $DIC->language()->loadLanguageModule($new_type);
407 $provider = new ilLTIConsumeProvider((int) $provider_id);
408 $redirectUrl = $DIC->ctrl()->getLinkTarget($this, 'contentSelectionRequest');
409
410 if (!ilSession::has('lti13_login_data')) {
411 $userIdLTI = ilCmiXapiUser::getIdentAsId($provider->getPrivacyIdent(), $DIC->user());
412 //$emailPrimary = ilCmiXapiUser::getIdent($provider->getPrivacyIdent(), $DIC->user());
413 $ltiMessageHint = (string) $ref_id . ":" . CLIENT_ID . ":" . base64_encode($redirectUrl);
414 $tplLogin = new ilTemplate("tpl.lti_initial_login.html", true, true, "components/ILIAS/LTIConsumer");
415 $tplLogin->setVariable("LTI_INITIAL_LOGIN_ACTION", $provider->getInitiateLogin());
416 $tplLogin->setVariable("ISS", ilObjLTIConsumer::getIliasHttpPath());
417 $tplLogin->setVariable("TARGET_LINK_URL", $provider->getProviderUrl());
418 $tplLogin->setVariable("LOGIN_HINT", $userIdLTI);
419 $tplLogin->setVariable("LTI_MESSAGE_HINT", $ltiMessageHint);
420 $tplLogin->setVariable("CLIENT_ID", $provider->getClientId());
421 $tplLogin->setVariable("LTI_DEPLOYMENT_ID", (string) $provider->getId());
422 echo $tplLogin->get();
423 exit; //TODO: no exit
424 } else {
425 $loginData = ilSession::get('lti13_login_data');
426 // ToDo: correct Link!! replace ILIAS_HTTP_PATH
427 $data = ilObjLTIConsumer::buildContentSelectionParameters($provider, (int) $ref_id, ilObjLTIConsumer::getIliasHttpPath() . "/" . $DIC->ctrl()->getLinkTarget($this, 'contentSelectionResponse'), $loginData['nonce']);
428 $tplContentSelection = new ilTemplate("tpl.lti_jwt_autosubmit.html", true, true, "components/ILIAS/LTIConsumer");
429 $tplContentSelection->setVariable("LTI_JWT_FORM_ACTION", $provider->getContentItemUrl());
430 $tplContentSelection->setVariable("LTI_JWT_ID_TOKEN", $data['id_token']);
431 $tplContentSelection->setVariable("LTI_JWT_STATE", $loginData['state']);
432 ilSession::clear('lti13_login_data');
433 echo $tplContentSelection->get();
434 exit; //TODO: no exit
435 }
436 }
437
438 public function contentSelectionResponse(): void
439 {
440 global $DIC;
442 throw new ilLtiConsumerException('permission denied!');
443 }
444 $new_type = $this->getRequestValue("new_type");
445 $DIC->ctrl()->setParameter($this, "new_type", $new_type);
446 $provider_id = $this->getRequestValue("provider_id");
447 $DIC->ctrl()->setParameter($this, "provider_id", $provider_id);
448 $ref_id = $this->getRequestValue("ref_id");
449 $DIC->ctrl()->setParameter($this, "ref_id", $ref_id);
450 $DIC->language()->loadLanguageModule($new_type);
451 $token = '';
452 if ($DIC->http()->wrapper()->post()->has('JWT')) {
453 $token = $DIC->http()->wrapper()->post()->retrieve('JWT', $DIC->refinery()->kindlyTo()->string());
454 }
455 if ($DIC->http()->wrapper()->post()->has('jwt')) {
456 $token = $DIC->http()->wrapper()->post()->retrieve('jwt', $DIC->refinery()->kindlyTo()->string());
457 }
458 if (!empty($token)) {
459 $provider = new ilLTIConsumeProvider((int) $provider_id);
461 } else {
462 echo "no token";
463 exit;
464 //ToDo:
465 }
466 }
467
468 public function cancelContentSelection(): void
469 {
470 global $DIC;
472 throw new ilLtiConsumerException('permission denied!');
473 }
474 $new_type = $this->getRequestValue("new_type");
475 $DIC->ctrl()->setParameterByClass(ilRepositoryGUI::class, 'new_type', $new_type);
476 $DIC->ctrl()->redirectByClass(ilRepositoryGUI::class, 'create');
477 }
478
480 {
481 if ($provider->getKeyType() == 'RSA_KEY') {
482 $key = $provider->getPublicKey();
483 $keys = new Firebase\JWT\Key($key, "RS256");
484 } else {
485 $jwks = file_get_contents($provider->getPublicKeyset());
486 //ToDo: Errorhandling
487 $keyset = json_decode($jwks, true);
488 $keys = Firebase\JWT\JWK::parseKeySet($keyset);
489 }
490 $data = Firebase\JWT\JWT::decode($token, $keys);
491 //ilObjLTIConsumer::getLogger()->debug(var_export($data,TRUE));
492 $refId = $this->getRequestValue('ref_id');
493
494 foreach ($data->{'https://purl.imsglobal.org/spec/lti-dl/claim/content_items'} as $item) {
495 $gui = new ilObjLTIConsumerGUI(0, self::REPOSITORY_NODE_ID, (int) $refId);
496 $description = "";
497 if (isset($item->description)) {
498 $description = $item->description;
499 }
500 $newObj = $gui->createNewObject('lti', $item->title, $description);
501 $dtpl = $gui->getDidacticTemplateVar("dtpl");
502 if ($dtpl) {
503 $newObj->applyDidacticTemplate($dtpl);
504 }
505
506 $newObj->setProviderId($provider->getId());
507 $newObj->setProvider($provider);
508 // custom params
509 $customParams = [];
510 foreach ($item->{'custom'} as $key => $value) {
511 $customParams[] = $key . "=" . $value;
512 }
513 if (count($customParams) > 0) {
514 $newObj->setCustomParams(implode(";", $customParams));
515 }
516 $newObj->save();
517 $this->initMetadata($newObj);
518 }
520 $template = new ilTemplate('tpl.lti_content_selection_finished.html', true, true, 'components/ILIAS/LTIConsumer');
521 $redirect = ilObjLTIConsumer::getIliasHttpPath() . "/" . "goto.php?target=" . $type . "_" . $refId;
522 $template->setVariable("CONTENT_SELECTION_REDIRECT", $redirect);
523 echo $template->get();
524 exit;
525 }
526
534 protected function afterSave(\ilObject $newObject): void
535 {
536 global $DIC; //check
537 if ($DIC->http()->wrapper()->query()->has('provider_id')) {
538 $newObject->setProviderId((int) $DIC->http()->wrapper()->query()->retrieve('provider_id', $DIC->refinery()->kindlyTo()->int()));
539 $newObject->initProvider();
540 $newObject->save();
541
542 $newObject->setTitle($newObject->getProvider()->getTitle());
543 $newObject->setMasteryScore($newObject->getProvider()->getMasteryScore());
544 $newObject->update();
545
546 $this->initMetadata($newObject);
547 $DIC->ctrl()->redirectByClass(ilLTIConsumerSettingsGUI::class);
548 }
549
551 throw new ilLtiConsumerException('permission denied!');
552 }
553
554 $form = $this->initCustomCreateForm($newObject->getType());
555
556 if ($form->checkInput()) {
558 $form->initProvider($provider);
560 $provider->setIsGlobal(false);
561 $provider->setCreator($DIC->user()->getId());
562 $provider->save();
563
564 $newObject->setProviderId($provider->getId());
565 $newObject->setProvider($provider);
566 $newObject->save();
567
568 $newObject->setTitle($provider->getTitle());
569 $newObject->setMasteryScore($newObject->getProvider()->getMasteryScore());
570 $newObject->update();
571
572 $this->initMetadata($newObject);
573 $DIC->ctrl()->redirectByClass([ilLTIConsumerSettingsGUI::class, ilLTIConsumeProviderSettingsGUI::class]);
574 }
575 throw new ilLtiConsumerException(
576 'form validation seems to not have worked in ilObjLTIConsumer::saveCustom()!'
577 );
578 }
579
580 public function initMetadata(\ilObject $object): void
581 {
582 // create LOM set from scratch
583 $this->lom_services->derive()
584 ->fromBasicProperties($object->getTitle())
585 ->forObject($object->getId(), $object->getId(), $object->getType());
586
587 // in a second step, set the keywords
588 $keywords = [];
589 foreach ($object->getProvider()->getKeywordsArray() as $keyword) {
590 if ($keyword !== '') {
591 $keywords[] = $keyword;
592 }
593 }
594 $this->lom_services->manipulate($object->getId(), $object->getId(), $object->getType())
595 ->prepareCreateOrUpdate(
596 $this->lom_services->paths()->keywords(),
597 ...$keywords
598 )->execute();
599 }
600
605 protected function initHeaderAction(?string $a_sub_type = null, ?int $a_sub_id = null): ?\ilObjectListGUI
606 {
607 global $DIC;
608 /* @var \ILIAS\DI\Container $DIC */
609
610 $return = parent::initHeaderAction($a_sub_type, $a_sub_id);
611
612 if ($this->creation_mode) {
613 return $return;
614 }
615
616 $validator = new ilCertificateDownloadValidator();
617 if ($validator->isCertificateDownloadable($DIC->user()->getId(), $this->object->getId())) {
618 $certLink = $DIC->ctrl()->getLinkTargetByClass(
619 [ilObjLTIConsumerGUI::class, ilLTIConsumerSettingsGUI::class],
621 );
622
623 $DIC->language()->loadLanguageModule('certificate');
624
625 $return->addCustomCommand($certLink, 'download_certificate');
626
627 $return->addHeaderIcon(
628 'cert_icon',
629 ilUtil::getImagePath('standard/icon_cert.svg'),
630 $DIC->language()->txt('download_certificate'),
631 null,
632 null,
633 $certLink
634 );
635 }
636
637 return $return;
638 }
639
640 public static function _goto(string $a_target): void
641 {
642 global $DIC;
643 $main_tpl = $DIC->ui()->mainTemplate();
644 /* @var \ILIAS\DI\Container $DIC */
645 $err = $DIC['ilErr'];
646 /* @var ilErrorHandling $err */
647 $ctrl = $DIC->ctrl();
648 $request = $DIC->http()->request();
649 $access = $DIC->access();
650 $lng = $DIC->language();
651
652 $targetParameters = explode('_', $a_target);
653 $id = (int) $targetParameters[0];
654
655 if ($id <= 0) {
656 $err->raiseError($lng->txt('msg_no_perm_read'), $err->FATAL);
657 }
658
659 if ($access->checkAccess('read', '', $id)) {
660 $ctrl->setTargetScript('ilias.php');
661 $ctrl->setParameterByClass(ilObjLTIConsumerGUI::class, 'ref_id', $id);
662 $ctrl->redirectByClass([ilRepositoryGUI::class, ilObjLTIConsumerGUI::class]);
663 } elseif ($access->checkAccess('visible', '', $id)) {
665 } elseif ($access->checkAccess('read', '', ROOT_FOLDER_ID)) {
666 $main_tpl->setOnScreenMessage(
667 'info',
668 sprintf(
669 $DIC->language()->txt('msg_no_perm_read_item'),
671 ),
672 true
673 );
674
676 }
677
678 $err->raiseError($DIC->language()->txt("msg_no_perm_read_lm"), $err->FATAL);
679 }
680
684 public function executeCommand(): void
685 {
686 global $DIC;
687 /* @var \ILIAS\DI\Container $DIC */
688
689 // TODO: general access checks (!)
690
692 $this->prepareOutput();
693 $this->addHeaderAction();
694 }
695
696 if (!$this->creation_mode) {
697 $this->trackObjectReadEvent();
698
699 if ($this->object->getProvider()->hasProviderIcon()) {
700 $DIC->ui()->mainTemplate()->setTitleIcon(
701 $this->object->getProvider()->getProviderIcon()->getAbsoluteFilePath(),
702 'Icon ' . $this->object->getProvider()->getTitle()
703 );
704 }
705
706 $link = ilLink::_getLink($this->object->getRefId(), $this->object->getType());
707 $navigationHistory = $DIC['ilNavigationHistory'];
708 /* @var ilNavigationHistory $navigationHistory */
709 $navigationHistory->addItem($this->object->getRefId(), $link, $this->object->getType());
710 }
711
713 $obj = $this->object;
714
715 switch ($DIC->ctrl()->getNextClass()) {
716 case strtolower(ilObjectCopyGUI::class):
717
718 $gui = new ilObjectCopyGUI($this);
719 $gui->setType($this->getType());
720 $DIC->ctrl()->forwardCommand($gui);
721 break;
722
723 case strtolower(ilCommonActionDispatcherGUI::class):
724
725 $gui = ilCommonActionDispatcherGUI::getInstanceFromAjaxCall();
726 $DIC->ctrl()->forwardCommand($gui);
727 break;
728
729 case strtolower(ilLearningProgressGUI::class):
730
731 $DIC->tabs()->activateTab(self::TAB_ID_LEARNING_PROGRESS);
732
733 $gui = new ilLearningProgressGUI(
735 $this->object->getRefId()
736 );
737
738 $DIC->ctrl()->forwardCommand($gui);
739
740 break;
741
742 case strtolower(ilObjectMetaDataGUI::class):
743
744 $DIC->tabs()->activateTab(self::TAB_ID_METADATA);
745
746 $gui = new ilObjectMetaDataGUI($obj);
747 $DIC->ctrl()->forwardCommand($gui);
748 break;
749
750 case strtolower(ilPermissionGUI::class):
751
752 $DIC->tabs()->activateTab(self::TAB_ID_PERMISSIONS);
753
754 $gui = new ilPermissionGUI($this);
755 $DIC->ctrl()->forwardCommand($gui);
756 break;
757
758 case strtolower(ilLTIConsumerSettingsGUI::class):
759
760 $DIC->tabs()->activateTab(self::TAB_ID_SETTINGS);
761
762 $gui = new ilLTIConsumerSettingsGUI($obj, $this->ltiAccess);
763 $DIC->ctrl()->forwardCommand($gui);
764 break;
765
766 case strtolower(ilLTIConsumerXapiStatementsGUI::class):
767
768 $DIC->tabs()->activateTab(self::TAB_ID_STATEMENTS);
769
770 $gui = new ilLTIConsumerXapiStatementsGUI($obj);
771 $DIC->ctrl()->forwardCommand($gui);
772
773 break;
774
775 case strtolower(ilLTIConsumerScoringGUI::class):
776
777 $DIC->tabs()->activateTab(self::TAB_ID_SCORING);
778
779 $gui = new ilLTIConsumerScoringGUI($obj);
780 $DIC->ctrl()->forwardCommand($gui);
781
782 break;
783
784 case strtolower(ilLTIConsumerGradeSynchronizationGUI::class):
785
786 $DIC->tabs()->activateTab(self::TAB_ID_GRADE_SYNCHRONIZATION);
787
789 $DIC->ctrl()->forwardCommand($gui);
790
791 break;
792
793 case strtolower(ilLTIConsumerContentGUI::class):
794
795 $DIC->tabs()->activateTab(self::TAB_ID_CONTENT);
796
797 $gui = new ilLTIConsumerContentGUI($obj);
798 $DIC->ctrl()->forwardCommand($gui);
799
800 break;
801
802 case strtolower(ilInfoScreenGUI::class):
803
804 $DIC->tabs()->activateTab(self::TAB_ID_INFO);
805 $info = new ilInfoScreenGUI($this);
806 $this->configureInfoScreen($info);
807 $this->ctrl->forwardCommand($info);
808 break;
809
810 default:
811 if ($DIC->ctrl()->getCmd() === 'save') {
812 $this->checkContentSelection();
813 } else {
814 if (isset($this->object) && !$this->isContentTabAvailable()) {
815 $DIC->ctrl()->redirectToURL($this->ctrl->getLinkTargetByClass(ilInfoScreenGUI::class));
816 }
817 $command = $DIC->ctrl()->getCmd(self::DEFAULT_CMD);
818 $this->{$command}();
819 }
820 }
821 }
822
823 protected function checkContentSelection(): void
824 {
825 global $DIC;
826 $providerId = $this->getRequestValue('provider_id');
827 $newType = $this->getRequestValue('new_type');
828 $refId = $this->getRequestValue('ref_id');
829 if ($providerId !== null && $newType == 'lti' && $refId != null) {
831 // check if post variables from contentSelectionResponse
832 if ($DIC->http()->wrapper()->post()->has('JWT')) {
833 // ToDo:
834 } else {
835 if ($provider->isContentItem() && !empty($provider->getContentItemUrl())) {
836 $this->contentSelection($providerId, $newType, $refId, $provider);
837 } else {
838 $this->saveObject();
839 }
840 }
841 } else {
842 $this->saveObject();
843 }
844 }
845
846 public function isContentTabAvailable(): bool
847 {
848 if (!$this->object->getOfflineStatus() &&
849 $this->object->getProvider()->getAvailability() != ilLTIConsumeProvider::AVAILABILITY_NONE) {
850 return true;
851 }
852 return false;
853 }
854
855 protected function setTabs(): void
856 {
857 global $DIC;
858
859 /* @var \ILIAS\DI\Container $DIC */
860 $DIC->language()->loadLanguageModule('lti');
861
862 if (isset($this->object) && $this->isContentTabAvailable()) {
863 $DIC->tabs()->addTab(
864 self::TAB_ID_CONTENT,
865 $DIC->language()->txt(self::TAB_ID_CONTENT),
866 $DIC->ctrl()->getLinkTargetByClass(ilLTIConsumerContentGUI::class)
867 );
868 }
869
870 $DIC->tabs()->addTab(
871 self::TAB_ID_INFO,
872 $DIC->language()->txt(self::TAB_ID_INFO),
873 $this->ctrl->getLinkTargetByClass(ilInfoScreenGUI::class)
874 );
875
876 if ($this->ltiAccess->hasWriteAccess()) {
877 $DIC->tabs()->addTab(
878 self::TAB_ID_SETTINGS,
879 $DIC->language()->txt(self::TAB_ID_SETTINGS),
880 $DIC->ctrl()->getLinkTargetByClass(ilLTIConsumerSettingsGUI::class)
881 );
882 }
883
884 if ($this->ltiAccess->hasStatementsAccess()) {
885 $DIC->tabs()->addTab(
886 self::TAB_ID_STATEMENTS,
887 $DIC->language()->txt(self::TAB_ID_STATEMENTS),
888 $DIC->ctrl()->getLinkTargetByClass(ilLTIConsumerXapiStatementsGUI::class)
889 );
890 }
891
892 if ($this->ltiAccess->hasHighscoreAccess()) {
893 //$DIC->language()->loadLanguageModule('lti');
894 $DIC->tabs()->addTab(
895 self::TAB_ID_SCORING,
896 $DIC->language()->txt(self::TAB_ID_SCORING),
897 $DIC->ctrl()->getLinkTargetByClass(ilLTIConsumerScoringGUI::class)
898 );
899 }
900
901 if ($this->object->getProvider()->isGradeSynchronization()) {
902 $DIC->tabs()->addTab(
903 self::TAB_ID_GRADE_SYNCHRONIZATION,
904 $DIC->language()->txt(self::TAB_ID_GRADE_SYNCHRONIZATION),
905 $DIC->ctrl()->getLinkTargetByClass(ilLTIConsumerGradeSynchronizationGUI::class)
906 );
907 }
908
909 if ($this->ltiAccess->hasLearningProgressAccess() && $this->object->getProvider()->getHasOutcome()) {
910 $DIC->tabs()->addTab(
911 self::TAB_ID_LEARNING_PROGRESS,
912 $DIC->language()->txt(self::TAB_ID_LEARNING_PROGRESS),
913 $DIC->ctrl()->getLinkTargetByClass(ilLearningProgressGUI::class)
914 );
915 }
916
917 if ($this->ltiAccess->hasWriteAccess()) {
918 $gui = new ilObjectMetaDataGUI($this->object);
919 $link = $gui->getTab();
920
921 if (strlen($link)) {
922 $DIC->tabs()->addTab(
923 self::TAB_ID_METADATA,
924 $DIC->language()->txt('meta_data'),
925 $link
926 );
927 }
928 }
929
930 if ($this->ltiAccess->hasEditPermissionsAccess()) {
931 $DIC->tabs()->addTab(
932 self::TAB_ID_PERMISSIONS,
933 $DIC->language()->txt(self::TAB_ID_PERMISSIONS),
934 $DIC->ctrl()->getLinkTargetByClass(ilPermissionGUI::class, 'perm')
935 );
936 }
937
938 // if (defined('DEVMODE') && DEVMODE) {
939 // $DIC->tabs()->addTab(
940 // 'debug',
941 // 'DEBUG',
942 // $DIC->ctrl()->getLinkTarget($this, 'debug')
943 // );
944 // }
945 }
946
947 // protected function debug(): void
948 // {
949 // global $DIC;
950 // /* @var \ILIAS\DI\Container $DIC */
951 //
952 // $DIC->tabs()->activateTab('debug');
953 //
954 // $filter = new ilCmiXapiStatementsReportFilter();
955 // $filter->setActivityId($this->object->getActivityId());
956 //
957 // $aggregateEndPointUrl = str_replace(
958 // 'data/xAPI',
959 // 'api/statements/aggregate',
960 // $this->object->getProvider()->getXapiLaunchUrl() // should be named endpoint not launch url
961 // );
962 //
963 // $linkBuilder = new ilCmiXapiHighscoreReportLinkBuilder(
964 // $this->object->getId(),
965 // $aggregateEndPointUrl,
966 // $filter
967 // );
968 //
969 // $basicAuth = ilCmiXapiLrsType::buildBasicAuth(
970 // $this->object->getProvider()->getXapiLaunchKey(),
971 // $this->object->getProvider()->getXapiLaunchSecret()
972 // );
973 //
974 // $request = new ilCmiXapiHighscoreReportRequest(
975 // $basicAuth,
976 // $linkBuilder
977 // );
978 //
979 // try {
980 // $report = $request->queryReport($this->object->getId());
981 //
982 // $DIC->ui()->mainTemplate()->setContent(
983 // $report->getResponseDebug()
984 // );
985 //
986 // //ilUtil::sendSuccess('Object ID: '.$this->object->getId());
987 // $DIC->ui()->mainTemplate()->setOnScreenMessage('info', $linkBuilder->getPipelineDebug());
988 // $DIC->ui()->mainTemplate()->setOnScreenMessage('question', '<pre>' . print_r($report->getTableData(), true) . '</pre>');
989 // } catch (Exception $e) {
990 // $this->tpl->setOnScreenMessage('failure', $e->getMessage());
991 // }
992 // }
993
994 protected function addLocatorItems(): void
995 {
996 global $DIC;
997 /* @var \ILIAS\DI\Container $DIC */
998
999 $locator = $DIC['ilLocator'];
1000 /* @var ilLocatorGUI $locator */
1001 $locator->addItem(
1002 $this->object->getTitle(),
1003 $this->ctrl->getLinkTarget($this, self::DEFAULT_CMD),
1004 "",
1005 $this->object->getRefId()
1006 );
1007 }
1008
1009 protected function trackObjectReadEvent(): void
1010 {
1011 global $DIC;
1012 /* @var \ILIAS\DI\Container $DIC */
1013
1015 $this->object->getType(),
1016 $this->object->getRefId(),
1017 $this->object->getId(),
1018 $DIC->user()->getId()
1019 );
1020
1021 ilLPStatusWrapper::_updateStatus($this->object->getId(), $DIC->user()->getId());
1022 }
1023
1024 protected function launch(): void
1025 {
1027 $obj = $this->object;
1028 $this->tabs_gui->activateTab(self::TAB_ID_CONTENT);
1029 $gui = new ilLTIConsumerContentGUI($obj);
1030 $this->ctrl->forwardCommand($gui);
1031 }
1032
1033 protected function infoScreen(): void
1034 {
1035 $this->ctrl->redirectByClass(ilInfoScreenGUI::class, "showSummary");
1036 }
1037
1039 {
1040 global $DIC;
1041 /* @var \ILIAS\DI\Container $DIC */
1042 $ilErr = $DIC['ilErr'];
1043 /* @var ilErrorHandling $ilErr */
1044
1045 if (!$this->checkPermissionBool("visible") && !$this->checkPermissionBool("read")) {
1046 $ilErr->raiseError($DIC->language()->txt("msg_no_perm_read"), $ilErr->MESSAGE);
1047 }
1048
1049 $this->handleAvailablityMessage();
1050
1051
1052 $info->enablePrivateNotes();
1053
1054 if ($this->checkPermissionBool("read")) {
1055 $info->enableNews();
1056 }
1057
1058 $info->enableNewsEditing(false);
1059
1060 if ($this->checkPermissionBool("write")) {
1061 $news_set = new ilSetting("news");
1062 $enable_internal_rss = $news_set->get("enable_rss_for_internal");
1063
1064 if ($enable_internal_rss) {
1065 //todo check
1066 $info->setBlockProperty("news", "settings", "true");
1067 $info->setBlockProperty("news", "public_notifications_option", "true");
1068 }
1069 }
1070
1071 // standard meta data
1072 $info->addMetaDataSections($this->object->getId(), 0, $this->object->getType());
1073
1074 if (DEVMODE) {
1075 // Development Info
1076 $info->addSection('DEVMODE Info');
1077 $info->addProperty('Local Object ID', (string) $this->object->getId());
1078 $info->addProperty('Current User ID', (string) $DIC->user()->getId());
1079 }
1080 if ($this->object->getProvider()->getHasOutcome() && ilLPObjSettings::_lookupDBMode($this->object->getId()) != 0) {
1081 $info->addSection($DIC->language()->txt("lti_info_learning_progress_section"));
1082 $info->addProperty(
1083 $DIC->language()->txt("mastery_score"),
1084 ($this->object->getMasteryScorePercent()) . ' %'
1085 );
1086 }
1087
1088 // LTI Ressource Info about privacy
1089 $info->addSection($DIC->language()->txt("lti_info_privacy_section"));
1090
1091 $info->addProperty(
1092 $DIC->language()->txt("lti_con_prov_url"),
1093 $this->object->getProvider()->getProviderUrl()
1094 );
1095
1096 $info->addProperty(
1097 $DIC->language()->txt("conf_privacy_name"),
1098 $DIC->language()->txt('conf_privacy_name_' . ilObjCmiXapiGUI::getPrivacyNameString($this->object->getProvider()->getPrivacyName()))
1099 );
1100
1101 $info->addProperty(
1102 $DIC->language()->txt("conf_privacy_ident"),
1103 $DIC->language()->txt('conf_privacy_ident_' . ilObjCmiXapiGUI::getPrivacyIdentString($this->object->getProvider()->getPrivacyIdent()))
1104 );
1105 if ($this->object->getProvider()->isExternalProvider()) {
1106 $info->addProperty(
1107 $DIC->language()->txt("lti_info_external_provider_label"),
1108 $DIC->language()->txt('lti_info_external_provider_info')
1109 );
1110 }
1111
1112 if ($this->object->getProvider()->getUseXapi()) {
1113 $info->addProperty(
1114 $DIC->language()->txt("lti_con_prov_xapi_launch_url"),
1115 $this->object->getProvider()->getXapiLaunchUrl()
1116 );
1117 }
1118
1119 }
1120
1121 protected function handleAvailablityMessage(): void
1122 {
1123 global $DIC;
1124 /* @var \ILIAS\DI\Container $DIC */
1125 if ($this->object->getProvider()->getProviderUrl() == '') {
1126 $this->tpl->setOnScreenMessage('failure', $DIC->language()->txt('lti_provider_not_set_msg'));
1127 } elseif ($this->object->getProvider()->getAvailability() == ilLTIConsumeProvider::AVAILABILITY_NONE) {
1128 $this->tpl->setOnScreenMessage('failure', $DIC->language()->txt('lti_provider_not_avail_msg'));
1129 }
1130 }
1131
1132 protected function getRequestValue(string $key): ?string
1133 {
1134 if ($this->request_wrapper->has($key)) {
1135 return $this->request_wrapper->retrieve($key, $this->refinery->kindlyTo()->string());
1136 }
1137 return null;
1138 }
1139}
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
Definition: plugin.php:23
error(string $a_errmsg)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
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, bool $isCatchupWriteEvents=true, $a_ext_rc=null, $a_ext_time=null)
static getIdentAsId(int $userIdentMode, ilObjUser $user)
Class ilCommonActionDispatcherGUI.
Class ilInfoScreenGUI.
addProperty(string $a_name, string $a_value, string $a_link="")
add a property to current section
static _lookupDBMode(int $a_obj_id)
static _updateStatus(int $a_obj_id, int $a_usr_id, ?object $a_obj=null, bool $a_percentage=false, bool $a_force_raise=false)
static getProviderIdFromClientId(string $clientId)
Class ilObjUserTrackingGUI.
static getPrivacyNameString(int $ident)
static getPrivacyIdentString(int $ident)
getType()
Functions that must be overwritten.
static _goto(string $a_target)
contentSelection(string $providerId, string $newType, string $refId, ilLTIConsumeProvider $provider)
configureInfoScreen(ilInfoScreenGUI $info)
initShowToolConfig(string $a_new_type, int $a_provider_id)
initDynRegForm(string $a_new_type)
addLocatorItems()
Functions to be overwritten.
ilLTIConsumerAccess $ltiAccess
initCreateForm(string $a_new_type)
initCustomCreateForm(string $a_new_type)
saveContentSelection(ilLTIConsumeProvider $provider, string $token)
initNewForm(string $a_new_type)
buildProviderSelectionForm(string $a_new_type)
initHeaderAction(?string $a_sub_type=null, ?int $a_sub_id=null)
__construct(int $a_id=0, int $a_id_type=self::REPOSITORY_NODE_ID, int $a_parent_node_id=0)
afterSave(\ilObject $newObject)
getCreationFormsHTML(StandardForm|ilPropertyFormGUI|array $forms)
setTabs()
create tabs (repository/workspace switch)
createNewObject(string $newType, string $title, string $description)
static buildContentSelectionParameters(ilLTIConsumeProvider $provider, int $refId, string $returnUrl, string $nonce)
New implementation of ilObjectGUI.
ilErrorHandling $error
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.
GUI class for the workflow of copying objects.
static getTypeByRefId(int $ref_id, bool $stop_on_error=true)
get object type by reference id
static _gotoRepositoryRoot(bool $raise_error=false)
Goto repository root.
getDidacticTemplateVar(string $type)
Get didactic template setting from creation screen.
static _gotoRepositoryNode(int $ref_id, string $cmd="")
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.
static get(string $a_var)
static clear(string $a_var)
static has($a_var)
ILIAS Setting Class.
special template class to simplify handling of ITX/PEAR
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 CLIENT_ID
Definition: constants.php:41
const ROOT_FOLDER_ID
Definition: constants.php:32
exit
$info
Definition: entry_point.php:21
This describes a standard form.
Definition: Standard.php:29
$ltiMessageHint
Definition: ltiauth.php:50
$provider
Definition: ltitoken.php:80
if(empty($clientId)) $providerId
Definition: ltitoken.php:79
__construct(Container $dic, ilPlugin $plugin)
@inheritDoc
Interface Observer \BackgroundTasks Contains several chained tasks and infos about them.
global $lng
Definition: privfeed.php:31
$ilErr
Definition: raiseError.php:33
global $DIC
Definition: shib_login.php:26
$token
Definition: xapitoken.php:70
$refId
Definition: xapitoken.php:58