ILIAS  trunk Revision v12.0_alpha-1540-g00f839d5fa1
class.ilObjFileGUI.php
Go to the documentation of this file.
1<?php
2
22use Psr\Http\Message\ServerRequestInterface;
42
54{
58
59 public const UPLOAD_MAX_FILES = 100;
60 public const PARAM_FILES = 'files';
61 public const PARAM_TITLE = 'title';
62 public const PARAM_DESCRIPTION = 'description';
63 public const PARAM_COPYRIGHT_ID = "copyright_id";
64
65 public const PARAM_UPLOAD_ORIGIN = 'origin';
66 public const UPLOAD_ORIGIN_STANDARD = 'standard';
67 public const UPLOAD_ORIGIN_DROPZONE = 'dropzone';
68
69 public const CMD_EDIT = Capabilities::EDIT_SETTINGS->value;
70 public const CMD_VERSIONS = Capabilities::MANAGE_VERSIONS->value;
71 public const CMD_UPLOAD_FILES = "uploadFiles";
72
73 public const CMD_SEND_FILE = Capabilities::DOWNLOAD->value;
75
79 public ?ilObject $object = null;
81 protected UIServices $ui;
84 protected Services $storage;
85 protected ?ilLogger $log = null;
87 protected \ILIAS\Refinery\Factory $refinery;
91 protected \ILIAS\UI\Component\Input\Factory $inputs;
93 protected ServerRequestInterface $request;
96 protected LOMServices $lom_services;
97
101 public function __construct(int $a_id = 0, int $a_id_type = self::REPOSITORY_NODE_ID, int $a_parent_node_id = 0)
102 {
103 global $DIC;
104 $this->refinery = $DIC->refinery();
105 $this->file_service_settings = $DIC->fileServiceSettings();
106 $this->user = $DIC->user();
107 $this->lng = $DIC->language();
109 $this->ui = $DIC->ui();
110 $this->storage = $DIC->resourceStorage();
111 $this->upload_handler = new ilObjFileUploadHandlerGUI();
112 $this->stakeholder = new ilObjFileStakeholder();
113 $this->general_settings = new General();
114 parent::__construct($a_id, $a_id_type, $a_parent_node_id);
115 $this->obj_service = $DIC->object();
116 $this->lng->loadLanguageModule(ilObjFile::OBJECT_TYPE);
117 $this->icon_repo = new IconDatabaseRepository();
118 $this->inputs = $DIC->ui()->factory()->input();
119 $this->renderer = $DIC->ui()->renderer();
120 $this->request = $DIC->http()->request();
121 $this->data_factory = new Factory();
122 $this->action_repo = new ActionDBRepository($DIC->database());
123 $this->lom_services = $DIC->learningObjectMetadata();
124
125 $capability_builder = new CapabilityBuilder(
127 $this->access,
128 $this->ctrl,
129 $this->action_repo,
130 $DIC->http(),
131 $DIC['static_url.uri_builder']
132 );
133
134 $capability_context = new Context(
135 $this->object_id,
136 $this->ref_id,
137 ($a_id_type === self::WORKSPACE_NODE_ID) ? Context::CONTEXT_WORKSPACE : Context::CONTEXT_REPO
138 );
139
140 $this->capabilities = $capability_builder->get($capability_context);
141 }
142
143 protected function recordReadEvent(): void
144 {
145 // Record read event and catchup with write events
147 $this->object->getType(),
148 $this->object->getRefId(),
149 $this->object->getId(),
150 $this->user->getId()
151 );
152 $this->updateLearningProgress();
153 }
154
155 protected function updateLearningProgress(): void
156 {
157 if ($this->object->getLPMode() === ilLPObjSettings::LP_MODE_CONTENT_VISITED) {
159 $this->object->getId(),
160 $this->user->getId(),
161 null,
162 false,
163 true
164 );
165 }
166 }
167
168 public function getType(): string
169 {
171 }
172
173 public function getParentId(): int
174 {
175 return $this->parent_id;
176 }
177
178 #[\Override]
179 public function executeCommand(): void
180 {
181 global $DIC;
182 $ilNavigationHistory = $DIC['ilNavigationHistory'];
183 $ilUser = $DIC['ilUser'];
184 $ilTabs = $DIC['ilTabs'];
185 $ilErr = $DIC['ilErr'];
186
187 $next_class = $this->ctrl->getNextClass($this);
188 $cmd = $this->ctrl->getCmd();
189
190 if (
191 !$this->getCreationMode()
192 && (
193 $this->id_type === self::REPOSITORY_NODE_ID
194 && $this->capabilities->get(Capabilities::DOWNLOAD)->isUnlocked()
195 )) {
196 // add entry to navigation history
197 $ilNavigationHistory->addItem(
198 $this->node_id,
199 (string) $this->capabilities->get(Capabilities::INFO_PAGE)->getUri(),
201 );
202 }
203
204 $this->prepareOutput();
205
206 $info = (new ilObjFileInfoRepository())->getByObjectId($this->obj_id);
207
208 $suffix = $info->getSuffix();
209 $path_file_icon = $this->icon_repo->getIconFilePathBySuffix($suffix);
210 $this->tpl->setTitleIcon($path_file_icon);
211
212 switch ($next_class) {
213 case strtolower(ilInfoScreenGUI::class):
214 $this->infoScreenForward(); // forwards command
215 break;
216
217 case 'ilobjectmetadatagui':
218 if (!$this->capabilities->get(Capabilities::EDIT_SETTINGS)->isUnlocked()) {
219 $ilErr->raiseError($this->lng->txt('permission_denied'), $ilErr->WARNING);
220 }
221
222 $ilTabs->activateTab("id_meta");
223
224 $md_gui = new ilObjectMetaDataGUI($this->object, null, null, $this->call_by_reference);
225
226 // todo: make this work
227 // $md_gui->addMDObserver($this->object,'MDUpdateListener','Technical');
228
229 $this->ctrl->forwardCommand($md_gui);
230 break;
231
232 // repository permissions
233 case 'ilpermissiongui':
234 $this->tabs_gui->activateTab('perm_settings');
235 $perm_gui = new ilPermissionGUI($this);
236 $this->ctrl->forwardCommand($perm_gui);
237 break;
238
239 case "ilexportgui":
240 $ilTabs->activateTab("export");
241 $exp_gui = new ilExportGUI($this);
242 $exp_gui->addFormat();
243 $this->ctrl->forwardCommand($exp_gui);
244 break;
245
246 case 'ilobjectcopygui':
247 $cp = new ilObjectCopyGUI($this);
248 $cp->setType(ilObjFile::OBJECT_TYPE);
249 $this->ctrl->forwardCommand($cp);
250 break;
251
252 // personal workspace permissions
253 case "ilworkspaceaccessgui":
254 $ilTabs->activateTab("id_permissions");
255 $wspacc = new ilWorkspaceAccessGUI($this->node_id, $this->getAccessHandler());
256 $this->ctrl->forwardCommand($wspacc);
257 break;
258
259 case "ilcommonactiondispatchergui":
261 $this->ctrl->forwardCommand($gui);
262 break;
263
264 case "illearningprogressgui":
265 $ilTabs->activateTab('learning_progress');
266 $user_id = $this->request_wrapper->has('user_id')
267 ? $this->request_wrapper->retrieve('user_id', $this->refinery->kindlyTo()->int())
268 : $ilUser->getId();
269 $new_gui = new ilLearningProgressGUI(
271 $this->object->getRefId(),
273 );
274 $this->ctrl->forwardCommand($new_gui);
275 $this->tabs_gui->setTabActive('learning_progress');
276 break;
277 case strtolower(ilFileVersionsGUI::class):
278 $this->tabs_gui->activateTab("id_versions");
279
280 if (!$this->capabilities->get(Capabilities::MANAGE_VERSIONS)->isUnlocked()) {
281 $this->error->raiseError($this->lng->txt("permission_denied"), $this->error->MESSAGE);
282 }
284 $obj = $this->object;
285 $this->ctrl->forwardCommand(
287 $obj,
288 $this->capabilities
289 )
290 );
291 break;
292 case strtolower(ilObjFileUploadHandlerGUI::class):
293 $this->ctrl->forwardCommand(new ilObjFileUploadHandlerGUI());
294 break;
295 case strtolower(ilWOPIEmbeddedApplicationGUI::class):
296 $capability = match($cmd) {
297 ilWOPIEmbeddedApplicationGUI::CMD_VIEW => $this->capabilities->get(Capabilities::VIEW_EXTERNAL),
298 ilWOPIEmbeddedApplicationGUI::CMD_EDIT => $this->capabilities->get(Capabilities::EDIT_EXTERNAL),
299 ilWOPIEmbeddedApplicationGUI::CMD_RETURN => $this->capabilities->get(Capabilities::INFO_PAGE),
300 default => null
301 };
302
303 if ($capability === null || !$capability->isUnlocked()) {
304 $this->error->raiseError($this->lng->txt("permission_denied"), $this->error->MESSAGE);
305 return;
306 }
307 $action = match ($capability->getCapability()) {
308 Capabilities::VIEW_EXTERNAL => $this->action_repo->getViewActionForSuffix($suffix),
309 Capabilities::EDIT_EXTERNAL => $this->action_repo->getEditActionForSuffix($suffix),
310 default => null
311 };
312
313 $this->tabs_gui->activateTab('content');
314 $this->recordReadEvent();
315
316 if ($this->id_type === Context::CONTEXT_WORKSPACE) {
318 $this->node_id,
319 $this->object->getId()
320 );
321 } else {
322 // select best of the following
323 $cap = $this->capabilities->getBestOf(
324 Capabilities::MANAGE_VERSIONS,
325 Capabilities::VIEW_EXTERNAL,
326 Capabilities::INFO_PAGE
327 );
328 $goto_link = (string) $cap->getUri();
329 }
330
331 $embeded_application = new EmbeddedApplication(
332 $this->storage->manage()->find($this->object->getResourceId()),
333 $action,
334 $this->stakeholder,
335 new URI($goto_link),
336 $capability->getCapability() === Capabilities::VIEW_EXTERNAL,
337 $this->lng->getLangKey()
338 );
339
340 $this->ctrl->forwardCommand(
342 $embeded_application
343 )
344 );
345 break;
346
347 case strtolower(ilFileCommonSettingsGUI::class):
348 $this->initSettingsTab();
349 $this->tabs_gui->activateSubTab("service_settings");
350 $this->ctrl->forwardCommand(
352 $this->object,
353 $this->ctrl,
354 $this->tpl,
355 $this->lng,
356 $this->object_service
357 )
358 );
359 break;
360
361 default:
362 // in personal workspace use object2gui
363 if ($this->id_type === self::WORKSPACE_NODE_ID) {
364 $this->addHeaderAction();
365 $ilTabs->clearTargets();
366
367 if (empty($cmd) || $cmd === 'render') {
368 $cmd = Capabilities::INFO_PAGE->value;
369 $this->$cmd();
370 } else {
371 parent::executeCommand();
372 }
373 break; // otherwise subtabs are duplicated
374 }
375
376 if (empty($cmd) || $cmd === 'render') {
377 $cmd = Capabilities::INFO_PAGE->value;
378 }
379
380 $this->$cmd();
381 break;
382 }
383
384 $this->addHeaderAction();
385 }
386
387
388 protected function addUIFormToAccordion(
389 ilAccordionGUI $accordion,
390 Standard $form,
391 int $form_type
392 ): void {
393 // abort if form-type is unknown
394 if (!in_array($form_type, [self::CFORM_NEW, self::CFORM_CLONE, self::CFORM_IMPORT], true)) {
395 return;
396 }
397
398 $inputs = $form->getInputs();
399 // use label of first input as title, because UI Component forms don't support form-titles yet
400 $title = ($inputs === []) ?
401 '' : $inputs[array_key_first($inputs)]->getLabel();
402
403 $tpl = new ilTemplate("tpl.creation_acc_head.html", true, true, "components/ILIAS/ILIASObject");
404 $tpl->setVariable("TITLE", $this->lng->txt("option") . " " . $form_type . ": " . $title);
405
406 $accordion->addItem($tpl->get(), $this->ui->renderer()->render($form));
407 }
408
409 protected function addLegacyFormToAccordion(
410 ilAccordionGUI $accordion,
411 ilPropertyFormGUI $form,
412 int $form_type
413 ): void {
414 // abort if form-type is unknown
415 if (!in_array($form_type, [self::CFORM_NEW, self::CFORM_CLONE, self::CFORM_IMPORT], true)) {
416 return;
417 }
418 $title = $form->getTitle();
419 $form->setTitle(''); // see https://mantis.ilias.de/view.php?id=37786
420
421 $tpl = new ilTemplate("tpl.creation_acc_head.html", true, true, "components/ILIAS/ILIASObject");
422 $tpl->setVariable("TITLE", $this->lng->txt("option") . " " . $form_type . ": " . $title);
423
424 $accordion->addItem($tpl->get(), $form->getHTML());
425 }
426
430 #[\Override]
431 protected function initCreateForm(string $new_type): Standard
432 {
433 return $this->initUploadForm();
434 }
435
436 #[\Override]
437 protected function getCreationFormTitle(): string
438 {
439 return $this->lng->txt('upload_files');
440 }
441
442 public function initUploadForm(): Standard
443 {
444 $this->getLanguage()->loadLanguageModule('file');
445 $inputs = [];
446
447 $this->ctrl->setParameterByClass(self::class, 'new_type', $this->getType());
448 $this->ctrl->setParameterByClass(
449 self::class,
450 self::PARAM_UPLOAD_ORIGIN,
451 self::UPLOAD_ORIGIN_STANDARD
452 );
453
454
455 $inputs[self::PARAM_FILES] = $this->ui->factory()->input()->field()->file(
456 $this->upload_handler,
457 $this->lng->txt('upload_files'),
458 null,
459 $this->ui->factory()->input()->field()->group([
460 self::PARAM_TITLE => $this->ui->factory()->input()->field()->text(
461 $this->lng->txt('title')
462 )->withAdditionalTransformation(
463 $this->getEmptyStringToNullTransformation()
464 ),
465 self::PARAM_DESCRIPTION => $this->ui->factory()->input()->field()->textarea(
466 $this->lng->txt('description')
467 )->withAdditionalTransformation(
468 $this->getEmptyStringToNullTransformation()
469 ),
470 ])
471 )->withMaxFiles(
472 self::UPLOAD_MAX_FILES
473 )->withRequired(true);
474
475 if ($this->lom_services->copyrightHelper()->isCopyrightSelectionActive()) {
476 $inputs[self::PARAM_COPYRIGHT_ID] = $this->getCopyrightSelectionInput('set_license_for_all_files');
477 }
478
479 return $this->ui->factory()->input()->container()->form()->standard(
480 $this->ctrl->getFormActionByClass(self::class, self::CMD_UPLOAD_FILES),
481 $inputs
482 )->withSubmitLabel($this->lng->txt('upload_files'));
483 }
484
488 protected function uploadFiles(): void
489 {
490 $origin = ($this->request_wrapper->has(self::PARAM_UPLOAD_ORIGIN)) ?
491 $this->request_wrapper->retrieve(
492 self::PARAM_UPLOAD_ORIGIN,
493 $this->refinery->kindlyTo()->string()
494 ) : self::UPLOAD_ORIGIN_STANDARD;
495
496 if (self::UPLOAD_ORIGIN_DROPZONE === $origin) {
497 $dropzone = new ilObjFileUploadDropzone($this->parent_id);
498 $dropzone = $dropzone->getDropzone()->withRequest($this->request);
499 $data = $dropzone->getData();
500 } else {
501 $form = $this->initUploadForm()->withRequest($this->request);
502 $data = $form->getData();
503 }
504 $files = $data[self::PARAM_FILES] ?? $data[0] ?? null;
505
506 if (empty($files)) {
507 $form = $this->initUploadForm()->withRequest($this->request);
508 $this->tpl->setContent($this->getCreationFormsHTML($form));
509 return;
510 }
511
512 $processor = new ilObjFileProcessor(
513 $this->stakeholder,
514 $this,
515 $this->storage,
516 $this->file_service_settings
517 );
518
519 $errors = false;
520 foreach ($files as $file_data) {
521 $rid = $this->storage->manage()->find($file_data[0]);
522 if (null !== $rid) {
523 try {
524 $processor->process(
525 $rid,
526 $file_data[1][self::PARAM_TITLE] ?? null,
527 $file_data[1][self::PARAM_DESCRIPTION] ?? null,
528 $data[self::PARAM_COPYRIGHT_ID] ?? null
529 );
530 } catch (Throwable $t) {
531 $errors = true;
532 if (null !== $this->log) {
533 $this->log->error($t->getMessage() . ": " . $t->getTraceAsString());
534 }
535 }
536 }
537 }
538
539 if ($errors) {
540 $this->ui->mainTemplate()->setOnScreenMessage(
541 'failure',
542 $this->lng->txt('could_not_create_file_objs'),
543 true
544 );
545 }
546
547 if ($processor->getInvalidFileNames() !== []) {
548 $this->ui->mainTemplate()->setOnScreenMessage(
549 'info',
550 sprintf(
551 $this->lng->txt('file_upload_info_file_with_critical_extension'),
552 implode(', ', $processor->getInvalidFileNames())
553 ),
554 true
555 );
556 }
557
558 $link = match ($this->id_type) {
559 self::WORKSPACE_NODE_ID => $this->ctrl->getLinkTargetByClass(ilObjWorkspaceRootFolderGUI::class),
560 default => ilLink::_getLink($this->requested_ref_id),
561 };
562
563 $this->ctrl->redirectToURL($link);
564 }
565
566 #[\Override]
567 public function putObjectInTree(ilObject $obj, ?int $parent_node_id = null): void
568 {
569 // this is needed to support multi fileuploads in personal and shared resources
570 $backup_node_id = $this->node_id;
571 parent::putObjectInTree($obj, $parent_node_id);
572 $this->node_id = $backup_node_id;
573 }
574
578 #[\Override]
579 public function update(): void
580 {
581 $data = [];
582 $form = $this->initPropertiesForm();
583 $form = $form->withRequest($this->request);
584 $inputs = $form->getData();
585
589 $title_and_description = $inputs['file_info']['title_and_description'];
590
591 $title = $title_and_description->getTitle();
592 // bugfix mantis 26045:
593 $filename = $this->object->getFileName();
594 if (trim((string) $title) === '') {
595 $title = $filename;
596 }
597 $title = $this->object->appendSuffixToTitle($title, $filename);
598
599 $this->object->handleChangedObjectTitle($title);
600
601 $description = $title_and_description->getLongDescription();
602 $this->object->setDescription($description);
603
604 $updated_title_and_description = new TitleAndDescription($title, $description);
605 $this->object->getObjectProperties()->storePropertyTitleAndDescription($updated_title_and_description);
606
607 $this->object->setImportantInfo($inputs['file_info']['important_info']);
608 $this->object->setRating($inputs['obj_features']['rating'] ?? false);
609 $this->object->setOnclickMode((int) $inputs['file_info']['on_click_action']);
610 $this->object->update();
611
612 $this->object->getObjectProperties()->storePropertyIsOnline($inputs['availability']['online_status']);
613
614 if (($inputs['presentation']['tile_image'] ?? null) !== null) {
615 $this->object->getObjectProperties()->storePropertyTileImage($inputs['presentation']['tile_image']);
616 }
617
618 // BEGIN ChangeEvent: Record update event.
619 if (!empty($data["name"])) {
620 global $DIC;
621 $ilUser = $DIC['ilUser'];
622 ilChangeEvent::_recordWriteEvent($this->object->getId(), $ilUser->getId(), 'update');
623 }
624 // END ChangeEvent: Record update event.
625
626 // Update ecs export settings
627 // $ecs = new ilECSFileSettings($this->object);
628 // $ecs->handleSettingsUpdate(); TODO: reintroduce usage of ECS file settings once they have been made compatible with the new ui components
629
630 $this->tpl->setOnScreenMessage('success', $this->lng->txt("msg_obj_modified"), true);
631 $this->ctrl->redirectByClass(self::class, self::CMD_EDIT);
632 }
633
634 #[\Override]
635 public function edit(): void
636 {
637 global $DIC;
638 $ilErr = $DIC['ilErr'];
639
640 if (!$this->capabilities->get(Capabilities::EDIT_SETTINGS)->isUnlocked()) {
641 $ilErr->raiseError($this->lng->txt("msg_no_perm_write"));
642 }
643
644 $this->initSettingsTab();
645
646 $form = $this->initPropertiesForm();
647
648 // $ecs = new ilECSFileSettings($this->object);
649 // $ecs->addSettingsToForm($form, ilObjFile::OBJECT_TYPE); TODO: reintroduce usage of ECS file settings once they have been made compatible with the new ui components
650
651 $this->tpl->setContent($this->renderer->render($form));
652 }
653
654 protected function initPropertiesForm(): Standard
655 {
656 $title_and_description = $this->object->getObjectProperties()->getPropertyTitleAndDescription()->toForm(
657 $this->lng,
658 $this->ui->factory()->input()->field(),
659 $this->refinery
660 );
661
662 $important_info = $this->inputs->field()->markdown(
664 $this->lng->txt('important_info'),
665 $this->lng->txt('important_info_byline')
666 )->withValue(
667 $this->object->getImportantInfo() ?? ""
668 );
669
670 $on_click_action = $this->inputs->field()->radio(
671 $this->lng->txt('on_click_action')
672 )->withOption(
674 $this->lng->txt('file_action_download'),
675 $this->lng->txt('file_action_download_info'),
676 )->withOption(
678 $this->lng->txt('file_action_show'),
679 $this->lng->txt('file_action_show_info'),
680 )->withValue(
681 (string) $this->object->getOnClickMode()
682 );
683
684 $input_groups = array_filter([
685 "title_and_description" => $title_and_description,
686 "important_info" => $important_info,
687 "on_click_action" => $on_click_action
688 ], static fn(FormInput $input): bool => null !== $input);
689
690 $file_info_section = $this->inputs->field()->section(
691 $input_groups,
692 $this->lng->txt('file_info')
693 );
694
695 $online_status = $this->object->getObjectProperties()->getPropertyIsOnline()->toForm(
696 $this->lng,
697 $this->ui->factory()->input()->field(),
698 $this->refinery
699 );
700 $availability_section = $this->inputs->field()->section(
701 ["online_status" => $online_status],
702 $this->lng->txt('rep_activation_availability')
703 );
704
705 $presentation_section = null;
706 if ($this->id_type === self::REPOSITORY_NODE_ID) {
707 $tile_image = $this->object->getObjectProperties()->getPropertyTileImage()->toForm(
708 $this->lng,
709 $this->ui->factory()->input()->field(),
710 $this->refinery
711 );
712 $presentation_section = $this->inputs->field()->section(
713 ["tile_image" => $tile_image],
714 $this->lng->txt('settings_presentation_header')
715 );
716 }
717
718 $additional_features_section = null;
719 if ($this->id_type === self::REPOSITORY_NODE_ID) {
720 $this->lng->loadLanguageModule('rating');
721
722 $enable_rating = $this->inputs->field()->checkbox(
723 $this->lng->txt('rating_activate_rating'),
724 $this->lng->txt('rating_activate_rating_info')
725 )->withValue(
726 $this->object->hasRating()
727 );
728 $additional_features_section = $this->inputs->field()->section(
729 ["rating" => $enable_rating],
730 $this->lng->txt('obj_features')
731 );
732 }
733
734 $inputs = array_filter([
735 "file_info" => $file_info_section,
736 "availability" => $availability_section,
737 "presentation" => $presentation_section,
738 "obj_features" => $additional_features_section
739 ], static fn(?Section $input): bool => null !== $input);
740
741 return $this->inputs->container()->form()->standard(
742 $this->ctrl->getLinkTargetByClass(self::class, 'update'),
743 $inputs
744 );
745 }
746
747 public function sendFile(): bool
748 {
749 $hist_entry_id = $this->request_wrapper->has('hist_id')
750 ? $this->request_wrapper->retrieve('hist_id', $this->refinery->kindlyTo()->int())
751 : null;
752 try {
753 if (ANONYMOUS_USER_ID === $this->user->getId() && $this->request_wrapper->has('transaction')) {
754 $this->object->sendFile($hist_entry_id);
755 }
756
757 if ($this->capabilities->get(Capabilities::DOWNLOAD)->isUnlocked()) {
758 // Record read event and catchup with write events
759 $this->recordReadEvent();
760
761 $this->object->sendFile($hist_entry_id);
762 } else {
763 $this->error->raiseError($this->lng->txt("permission_denied"), $this->error->MESSAGE);
764 }
765 } catch (FileNotFoundException $e) {
766 $this->error->raiseError($e->getMessage(), $this->error->MESSAGE);
767 }
768
769 return true;
770 }
771
775 public function showSummary(): void
776 {
777 $this->ctrl->redirectToURL(
778 (string) $this->capabilities->get(Capabilities::INFO_PAGE)->getUri()
779 );
780 }
781 public function showSummaryForced(): void
782 {
783 $this->ctrl->redirectToURL(
784 (string) $this->capabilities->get(Capabilities::FORCED_INFO_PAGE)->getUri()
785 );
786 }
787
788 public function versions(): void
789 {
790 $this->ctrl->redirectToURL(
791 (string) $this->capabilities->get(Capabilities::MANAGE_VERSIONS)->getUri()
792 );
793 }
794
795 public function unzipCurrentRevision(): void
796 {
797 $this->ctrl->redirectToURL(
798 (string) $this->capabilities->get(Capabilities::UNZIP)->getUri()
799 );
800 }
801
802 protected function editExternal(): void
803 {
804 $this->ctrl->redirectToURL(
805 (string) $this->capabilities->get(Capabilities::EDIT_EXTERNAL)->getUri()
806 );
807 }
808 protected function viewExternal(): void
809 {
810 $this->ctrl->redirectToURL(
811 (string) $this->capabilities->get(Capabilities::VIEW_EXTERNAL)->getUri()
812 );
813 }
814
818 public function infoScreenForward(): void
819 {
820 $this->tabs_gui->activateTab("id_info");
821
822 if (!$this->capabilities->get(Capabilities::INFO_PAGE)->isUnlocked()) {
823 $GLOBALS['DIC']['ilErr']->raiseError(
824 $this->lng->txt("msg_no_perm_read"),
825 2
826 ); // TODO remove magic number and old ilErr call
827 }
828
829 // add set completed button, if LP mode is active
830 if ($this->object->getLPMode() === ilLPObjSettings::LP_MODE_MANUAL) {
831 if (ilLPStatus::_hasUserCompleted($this->object->getId(), $this->user->getId())) {
832 $label = $this->lng->txt('file_btn_lp_toggle_state_completed');
833 } else {
834 $label = $this->lng->txt('file_btn_lp_toggle_state_not_completed');
835 }
836 $this->toolbar->addComponent(
837 $this->ui->factory()->button()->standard(
838 $label,
839 $this->ctrl->getLinkTarget($this, 'toggleLearningProgress')
840 )
841 );
842 }
843
844 // Add WOPI editor Button
845 if ($this->capabilities->get(Capabilities::EDIT_EXTERNAL)->isUnlocked()) {
846 $external_editor = $this->ui->factory()
847 ->button()
848 ->standard(
849 $this->lng->txt('open_external_editor'),
850 $this->ctrl->getLinkTargetByClass(
851 \ilWOPIEmbeddedApplicationGUI::class,
853 )
854 );
855 $this->toolbar->addComponent($external_editor);
856 }
857
858 $info = $this->buildInfoScreen(false);
859 $this->ctrl->forwardCommand($info);
860 }
861
862 protected function toggleLearningProgress(): void
863 {
865 $this->user->getId(),
866 $this->obj_id,
867 $this->ref_id,
868 'file'
869 );
870
871 $lp_marks = new ilLPMarks($this->obj_id, $this->user->getId());
872 $lp_marks->setCompleted(!ilLPStatus::_hasUserCompleted($this->object->getId(), $this->user->getId()));
873 $lp_marks->update();
874
875 ilLPStatusWrapper::_updateStatus($this->obj_id, $this->user->getId());
876
877 $this->tpl->setOnScreenMessage('success', $this->lng->txt('msg_obj_modified'), true);
878 $this->ctrl->redirect($this, Capabilities::INFO_PAGE->value);
879 }
880
881 public function buildInfoScreen(bool $kiosk_mode): ilInfoScreenGUI
882 {
883 $info = new ilInfoScreenGUI($this);
884
885 if (!$kiosk_mode) { // in kiosk mode we don't want to show the following sections
886 $info->enablePrivateNotes();
887
888 if ($this->capabilities->get(Capabilities::DOWNLOAD)->isUnlocked()) {
889 $info->enableNews();
890 }
891
892 // no news editing for files, just notifications
893 $info->enableNewsEditing(false);
894 if ($this->capabilities->get(Capabilities::MANAGE_VERSIONS)->isUnlocked()) {
895 $news_set = new ilSetting("news");
896 $enable_internal_rss = $news_set->get("enable_rss_for_internal");
897
898 if ($enable_internal_rss) {
899 $info->setBlockProperty("news", "settings", true);
900 $info->setBlockProperty("news", "public_notifications_option", true);
901 }
902 }
903
904 $obj_id = $this->object->getId();
905 $record_gui = new ilAdvancedMDRecordGUI(
907 'file',
908 $obj_id,
909 '',
910 0,
911 $this->call_by_reference
912 );
913 $record_gui->setInfoObject($info);
914 $record_gui->parse();
915 }
916 // show rating is not possible in kiosk mode
917
918 // Important Information
919 $important_info = $this->object->getImportantInfo();
920 if (!empty($important_info)) {
921 $group = new Group(new Factory(), $this->lng);
922 $markdown_to_html = $group->markdown()->toHTML();
923
924 $info->addSection($this->lng->txt("important_info"));
925 $info->addProperty("", $markdown_to_html->transform($important_info));
926 }
927
928 // Download Launcher
929 if ($this->capabilities->get(Capabilities::DOWNLOAD)->isUnlocked()) {
930 // get permanent download link for repository
931 if ($this->id_type === self::REPOSITORY_NODE_ID) {
932 $download_target = ilObjFileAccess::_getPermanentDownloadLink($this->node_id);
933 } else {
934 $download_target = rtrim(ILIAS_HTTP_PATH, '/') . '/' . $this->ctrl->getLinkTarget(
935 $this,
936 self::CMD_SEND_FILE
937 );
938 }
939 $url = $this->data_factory->uri($download_target);
940 $link = $this->data_factory->link($this->lng->txt('file_download'), $url);
941 $download_launcher = $this->ui->factory()->launcher()->inline($link);
942 // create own section for download launcher if there is no important info section
943 if (empty($important_info)) {
944 $info->addSection("");
945 }
946 // add download launcher
947 $info->addProperty("", $this->renderer->render($download_launcher));
948 }
949
950 // standard meta data
951 $info->addMetaDataSections($this->object->getId(), 0, $this->object->getType());
952
953 // in kiosk mode we don't want to show the following sections
954 // links to resource
955 if (!$kiosk_mode && ($this->access->checkAccess("write", "", $this->ref_id) ||
956 $this->access->checkAccess("edit_permissions", "", $this->ref_id))) {
957 $rs = ilObject::_getAllReferences($this->obj_id);
958 $refs = [];
959 foreach ($rs as $r) {
960 if ($this->tree->isInTree($r)) {
961 $refs[] = $r;
962 }
963 }
964 if (count($refs) > 1) {
965 $links = $sep = "";
966 foreach ($refs as $r) {
967 $cont_loc = new ilLocatorGUI();
968 $cont_loc->addContextItems($r, true);
969 $links .= $sep . $cont_loc->getHTML();
970 $sep = "<br />";
971 }
972
973 $info->addProperty(
974 $this->lng->txt("res_links"),
975 '<div class="small">' . $links . '</div>'
976 );
977 }
978 }
979
980 // File Info
981 $info->addSection($this->lng->txt("file_info"));
982 if ($kiosk_mode) {
983 $file_info_for_users = $this->getFileInfoForUsers();
984 foreach ($file_info_for_users as $file_info_entry_key => $file_info_entry_value) {
985 if ($file_info_entry_value !== null) {
986 $info->addProperty($file_info_entry_key, $file_info_entry_value);
987 }
988 }
989 } else {
990 $file_info = $this->getAllFileInfoForCurrentUser();
991 foreach ($file_info as $file_info_block) {
992 foreach ($file_info_block as $file_info_entry_key => $file_info_entry_value) {
993 if ($file_info_entry_value !== null) {
994 $info->addProperty($file_info_entry_key, $file_info_entry_value);
995 }
996 }
997 }
998 }
999
1000 $info->hideFurtherSections(false);
1001
1002 return $info;
1003 }
1004
1005 // get tabs
1006 #[\Override]
1007 protected function setTabs(): void
1008 {
1009 global $DIC;
1010 $ilHelp = $DIC['ilHelp'];
1011 $ilHelp->setScreenIdComponent(ilObjFile::OBJECT_TYPE);
1012
1013 $this->ctrl->setParameter($this, "ref_id", $this->node_id);
1014
1015 if (($c = $this->capabilities->get(Capabilities::VIEW_EXTERNAL)) && $c->isUnlocked()) {
1016 $this->tabs_gui->addTab(
1017 "content",
1018 $this->lng->txt("content"),
1019 $c->getURI()
1020 );
1021 }
1022
1023 if (($c = $this->capabilities->get(Capabilities::MANAGE_VERSIONS)) && $c->isUnlocked()) {
1024 $this->tabs_gui->addTab(
1025 "id_versions",
1026 $this->lng->txt(self::CMD_VERSIONS),
1027 $this->ctrl->getLinkTargetByClass(ilFileVersionsGUI::class, ilFileVersionsGUI::CMD_DEFAULT)
1028 );
1029 }
1030
1031 if (($c = $this->capabilities->get(Capabilities::INFO_PAGE)) && $c->isUnlocked()) {
1032 $this->tabs_gui->addTab(
1033 "id_info",
1034 $this->lng->txt("info_short"),
1035 $this->ctrl->getLinkTargetByClass(["ilobjfilegui", "ilinfoscreengui"], "showSummary")
1036 );
1037 }
1038
1039 if (($c = $this->capabilities->get(Capabilities::EDIT_SETTINGS)) && $c->isUnlocked()) {
1040 $this->tabs_gui->addTab(
1041 "settings",
1042 $this->lng->txt("settings"),
1043 $this->ctrl->getLinkTarget($this, self::CMD_EDIT)
1044 );
1045 }
1046
1047 if (ilLearningProgressAccess::checkAccess($this->object->getRefId())) {
1048 $this->tabs_gui->addTab(
1049 'learning_progress',
1050 $this->lng->txt('learning_progress'),
1051 $this->ctrl->getLinkTargetByClass([self::class, 'illearningprogressgui'], '')
1052 );
1053 }
1054
1055 // meta data
1056 if (($c = $this->capabilities->get(Capabilities::EDIT_SETTINGS)) && $c->isUnlocked()) {
1057 $mdgui = new ilObjectMetaDataGUI($this->object, null, null, $this->call_by_reference);
1058 $mdtab = $mdgui->getTab();
1059 if ($mdtab) {
1060 $this->tabs_gui->addTab(
1061 "id_meta",
1062 $this->lng->txt("meta_data"),
1063 $mdtab
1064 );
1065 }
1066 }
1067
1068 // export
1069 if (($c = $this->capabilities->get(Capabilities::EDIT_SETTINGS)) && $c->isUnlocked()) {
1070 $this->tabs_gui->addTab(
1071 "export",
1072 $this->lng->txt("export"),
1073 $this->ctrl->getLinkTargetByClass("ilexportgui", "")
1074 );
1075 }
1076
1077 // Permissions-tabs, had to add it here, see https://mantis.ilias.de/view.php?id=47417
1078 if ($this->access->checkAccess('edit_permission', '', $this->ref_id)) {
1079 $this->tabs_gui->addTarget(
1080 "perm_settings",
1081 $this->ctrl->getLinkTargetByClass([self::class, ilPermissionGUI::class], "perm"),
1082 ["perm", "info", "owner"],
1083 ilPermissionGUI::class
1084 );
1085 }
1086 }
1087
1088 protected function initSettingsTab(): void
1089 {
1090 $this->tabs_gui->activateTab("settings");
1091 // add subtab for common settings
1092 $this->tabs_gui->addSubTab(
1093 'file_settings',
1094 $this->lng->txt('settings'),
1095 $this->ctrl->getLinkTargetByClass(self::class, self::CMD_EDIT)
1096 );
1097 if (in_array('file', ilAdvancedMDRecord::_getActivatedObjTypes(), true)) {
1098 $this->tabs_gui->addSubTab(
1099 'service_settings',
1100 $this->lng->txt('service_settings'),
1101 $this->ctrl->getLinkTargetByClass(ilFileCommonSettingsGUI::class, ilFileCommonSettingsGUI::CMD_EDIT)
1102 );
1103 }
1104
1105 $this->tabs_gui->activateSubTab("file_settings");
1106 }
1107
1108 public static function _goto($a_target, $a_additional = null): void
1109 {
1110 global $DIC;
1111 $main_tpl = $DIC->ui()->mainTemplate();
1112 $ilErr = $DIC['ilErr'];
1113 $lng = $DIC['lng'];
1114 $ilAccess = $DIC['ilAccess'];
1115
1116 if ($a_additional && str_ends_with((string) $a_additional, "wsp")) {
1118 }
1119
1120 // added support for direct download goto links
1121 if ($a_additional && str_ends_with((string) $a_additional, "download")) {
1122 ilObjectGUI::_gotoRepositoryNode($a_target, "sendfile");
1123 }
1124
1125 // static method, no workspace support yet
1126
1127 if ($ilAccess->checkAccess("visible", "", $a_target)
1128 || $ilAccess->checkAccess("read", "", $a_target)) {
1129 ilObjectGUI::_gotoRepositoryNode($a_target, Capabilities::INFO_PAGE->value);
1130 } elseif ($ilAccess->checkAccess("read", "", ROOT_FOLDER_ID)) {
1131 $main_tpl->setOnScreenMessage(
1132 'failure',
1133 sprintf(
1134 $lng->txt("msg_no_perm_read_item"),
1136 ),
1137 true
1138 );
1140 }
1141
1142 $ilErr->raiseError($lng->txt("msg_no_perm_read"), $ilErr->FATAL);
1143 }
1144
1148 protected function addLocatorItems(): void
1149 {
1150 global $DIC;
1151 $ilLocator = $DIC['ilLocator'];
1152
1153 if (is_object($this->object)) {
1154 $ilLocator->addItem($this->object->getTitle(), $this->ctrl->getLinkTarget($this, ""), "", $this->node_id);
1155 }
1156 }
1157
1158 #[\Override]
1159 protected function initHeaderAction(?string $a_sub_type = null, ?int $a_sub_id = null): ?\ilObjectListGUI
1160 {
1161 $lg = parent::initHeaderAction($a_sub_type, $a_sub_id);
1162 if ($lg instanceof ilObjectListGUI && $this->object->hasRating()) {
1163 $lg->enableRating(
1164 true,
1165 null,
1166 false,
1167 [ilCommonActionDispatcherGUI::class, ilRatingGUI::class]
1168 );
1169 }
1170
1171 return $lg;
1172 }
1173
1174 protected function getCtrl(): \ilCtrl
1175 {
1176 return $this->ctrl;
1177 }
1178
1182 protected function getFileObj(): ilObjFile
1183 {
1184 if (!$this->object instanceof ilObjFile) {
1185 throw new ilFileException("Error: object is not of type ilObjFile or doesn't exist");
1186 }
1187
1188 return $this->object;
1189 }
1190
1192 {
1193 return $this->stakeholder;
1194 }
1195
1196 protected function getGeneralSettings(): General
1197 {
1198 return $this->general_settings;
1199 }
1200
1201 protected function getLanguage(): \ilLanguage
1202 {
1203 return $this->lng;
1204 }
1205
1206 protected function getNodeID(): int
1207 {
1208 return $this->node_id;
1209 }
1210
1211 protected function getRefinery(): \ILIAS\Refinery\Factory
1212 {
1213 return $this->refinery;
1214 }
1215
1216 protected function getUIFactory(): ILIAS\UI\Factory
1217 {
1218 return $this->ui->factory();
1219 }
1220
1221 protected function getUser(): ilObjUser
1222 {
1223 return $this->user;
1224 }
1225}
renderer()
$filename
Definition: buildRTE.php:78
Provides fluid interface to RBAC services.
Definition: UIServices.php:25
Builds data types.
Definition: Factory.php:36
The scope of this class is split ilias-conform URI's into components.
Definition: URI.php:35
Indicates that a file is missing or not found.
error(string $a_errmsg)
return true
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static _getActivatedObjTypes()
get activated obj types
static _recordReadEvent(string $a_type, int $a_ref_id, int $obj_id, int $usr_id, $a_ext_rc=null, $a_ext_time=null)
static _recordWriteEvent(int $obj_id, int $usr_id, string $action, ?int $parent_obj_id=null)
Records a write event.
static getInstanceFromAjaxCall()
(Re-)Build instance from ajax call
Class ilCtrl provides processing control methods.
Export User Interface Class.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
Class ilInfoScreenGUI.
static _updateStatus(int $a_obj_id, int $a_usr_id, ?object $a_obj=null, bool $a_percentage=false, bool $a_force_raise=false)
static _hasUserCompleted(int $a_obj_id, int $a_user_id)
Lookup user object completion.
language handling
static checkAccess(int $a_ref_id, bool $a_allow_only_read=true)
check access to learning progress
Class ilObjUserTrackingGUI.
static _tracProgress(int $a_user_id, int $a_obj_id, int $a_ref_id, string $a_obj_type='')
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static getLogger(string $a_component_id)
Get component logger.
Component logger with individual log levels by component id.
static _getPermanentDownloadLink(int $ref_id)
Gets the permanent download link for the file.
GUI class for file objects.
LOMServices $lom_services
ServerRequestInterface $request
uploadFiles()
MUST be protected, since this is Called from ilObject2GUI when used in Personal Workspace.
ActionDBRepository $action_repo
const UPLOAD_ORIGIN_DROPZONE
initHeaderAction(?string $a_sub_type=null, ?int $a_sub_id=null)
Add header action menu.
addUIFormToAccordion(ilAccordionGUI $accordion, Standard $form, int $form_type)
getType()
Functions that must be overwritten.
putObjectInTree(ilObject $obj, ?int $parent_node_id=null)
Add object to tree at given position.
initCreateForm(string $new_type)
ILIAS UI Component Input Factory $inputs
const UPLOAD_ORIGIN_STANDARD
CapabilityCollection $capabilities
static _goto($a_target, $a_additional=null)
IconDatabaseRepository $icon_repo
ILIAS Refinery Factory $refinery
buildInfoScreen(bool $kiosk_mode)
infoScreenForward()
show information screen
General $general_settings
__construct(int $a_id=0, int $a_id_type=self::REPOSITORY_NODE_ID, int $a_parent_node_id=0)
Constructor.
ilObjectService $obj_service
ilFileServicesSettings $file_service_settings
ResourceStakeholder $stakeholder
addLegacyFormToAccordion(ilAccordionGUI $accordion, ilPropertyFormGUI $form, int $form_type)
addLocatorItems()
Functions to be overwritten.
UploadHandler $upload_handler
setTabs()
create tabs (repository/workspace switch)
Class ilObjFileProcessorInterface.
Class ilObjFileStakeholder.
Class ilObjFile.
const CLICK_MODE_DOWNLOAD
const CLICK_MODE_INFOPAGE
const OBJECT_TYPE
User class.
New implementation of ilObjectGUI.
executeCommand()
execute command
ilGlobalTemplateInterface $tpl
prepareOutput(bool $show_sub_objects=true)
GUI class for the workflow of copying objects.
static _gotoSharedWorkspaceNode(int $wsp_id)
static _gotoRepositoryRoot(bool $raise_error=false)
Goto repository root.
addHeaderAction()
Add header action menu.
static _gotoRepositoryNode(int $ref_id, string $cmd="")
Class ilObjectMetaDataGUI.
Class ilObject Basic functions for all objects.
static _getAllReferences(int $id)
get all reference ids for object ID
static _lookupObjId(int $ref_id)
static _lookupTitle(int $obj_id)
This class represents a property form user interface.
ILIAS Setting Class.
special template class to simplify handling of ITX/PEAR
static getGotoLink(int $a_node_id, int $a_obj_id, string $a_additional="")
const ANONYMOUS_USER_ID
Definition: constants.php:27
const ROOT_FOLDER_ID
Definition: constants.php:32
$c
Definition: deliver.php:25
$info
Definition: entry_point.php:21
setVariable(string $variable, $value='')
Sets the given variable to the given value.
get(string $part=self::DEFAULT_BLOCK)
Renders the given block and returns the html string.
This describes inputs that can be used in forms.
Definition: FormInput.php:33
This describes a standard form.
Definition: Standard.php:30
This describes section inputs.
Definition: Section.php:29
An entity that renders components to a string output.
Definition: Renderer.php:31
__construct(Container $dic, ilPlugin $plugin)
@inheritDoc
Interface Observer \BackgroundTasks Contains several chained tasks and infos about them.
global $lng
Definition: privfeed.php:26
$ilErr
Definition: raiseError.php:33
if(!file_exists('../ilias.ini.php'))
global $DIC
Definition: shib_login.php:26
$url
Definition: shib_logout.php:70
trait ilObjFileCopyrightInput
getLanguage()
trait ilObjFileInfoProvider
trait ilObjFileTransformation
$GLOBALS["DIC"]
Definition: wac.php:54