ILIAS  trunk Revision v12.0_alpha-1227-g7ff6d300864
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 $ilTabs->activateTab("id_permissions");
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(new ilFileVersionsGUI($obj));
286 break;
287 case strtolower(ilObjFileUploadHandlerGUI::class):
288 $this->ctrl->forwardCommand(new ilObjFileUploadHandlerGUI());
289 break;
290 case strtolower(ilWOPIEmbeddedApplicationGUI::class):
291 $capability = match($cmd) {
292 ilWOPIEmbeddedApplicationGUI::CMD_VIEW => $this->capabilities->get(Capabilities::VIEW_EXTERNAL),
293 ilWOPIEmbeddedApplicationGUI::CMD_EDIT => $this->capabilities->get(Capabilities::EDIT_EXTERNAL),
294 ilWOPIEmbeddedApplicationGUI::CMD_RETURN => $this->capabilities->get(Capabilities::INFO_PAGE),
295 default => null
296 };
297
298 if ($capability === null || !$capability->isUnlocked()) {
299 $this->error->raiseError($this->lng->txt("permission_denied"), $this->error->MESSAGE);
300 return;
301 }
302 $action = match ($capability->getCapability()) {
303 Capabilities::VIEW_EXTERNAL => $this->action_repo->getViewActionForSuffix($suffix),
304 Capabilities::EDIT_EXTERNAL => $this->action_repo->getEditActionForSuffix($suffix),
305 default => null
306 };
307
308 $this->tabs_gui->activateTab('content');
309 $this->recordReadEvent();
310
311 if ($this->id_type === Context::CONTEXT_WORKSPACE) {
313 $this->node_id,
314 $this->object->getId()
315 );
316 } else {
317 $goto_link = ilLink::_getLink($this->object->getRefId());
318 }
319
320 $embeded_application = new EmbeddedApplication(
321 $this->storage->manage()->find($this->object->getResourceId()),
322 $action,
323 $this->stakeholder,
324 new URI($goto_link),
325 $capability->getCapability() === Capabilities::VIEW_EXTERNAL,
326 $this->lng->getLangKey()
327 );
328
329 $this->ctrl->forwardCommand(
331 $embeded_application
332 )
333 );
334 break;
335
336 case strtolower(ilFileCommonSettingsGUI::class):
337 $this->initSettingsTab();
338 $this->tabs_gui->activateSubTab("service_settings");
339 $this->ctrl->forwardCommand(
341 $this->object,
342 $this->ctrl,
343 $this->tpl,
344 $this->lng,
345 $this->object_service
346 )
347 );
348 break;
349
350 default:
351 // in personal workspace use object2gui
352 if ($this->id_type === self::WORKSPACE_NODE_ID) {
353 $this->addHeaderAction();
354 $ilTabs->clearTargets();
355
356 if (empty($cmd) || $cmd === 'render') {
357 $cmd = Capabilities::INFO_PAGE->value;
358 $this->$cmd();
359 } else {
360 parent::executeCommand();
361 }
362 break; // otherwise subtabs are duplicated
363 }
364
365 if (empty($cmd) || $cmd === 'render') {
366 $cmd = Capabilities::INFO_PAGE->value;
367 }
368
369 $this->$cmd();
370 break;
371 }
372
373 $this->addHeaderAction();
374 }
375
376
377 protected function addUIFormToAccordion(
378 ilAccordionGUI $accordion,
379 Standard $form,
380 int $form_type
381 ): void {
382 // abort if form-type is unknown
383 if (!in_array($form_type, [self::CFORM_NEW, self::CFORM_CLONE, self::CFORM_IMPORT], true)) {
384 return;
385 }
386
387 $inputs = $form->getInputs();
388 // use label of first input as title, because UI Component forms don't support form-titles yet
389 $title = ($inputs === []) ?
390 '' : $inputs[array_key_first($inputs)]->getLabel();
391
392 $tpl = new ilTemplate("tpl.creation_acc_head.html", true, true, "components/ILIAS/ILIASObject");
393 $tpl->setVariable("TITLE", $this->lng->txt("option") . " " . $form_type . ": " . $title);
394
395 $accordion->addItem($tpl->get(), $this->ui->renderer()->render($form));
396 }
397
398 protected function addLegacyFormToAccordion(
399 ilAccordionGUI $accordion,
400 ilPropertyFormGUI $form,
401 int $form_type
402 ): void {
403 // abort if form-type is unknown
404 if (!in_array($form_type, [self::CFORM_NEW, self::CFORM_CLONE, self::CFORM_IMPORT], true)) {
405 return;
406 }
407 $title = $form->getTitle();
408 $form->setTitle(''); // see https://mantis.ilias.de/view.php?id=37786
409
410 $tpl = new ilTemplate("tpl.creation_acc_head.html", true, true, "components/ILIAS/ILIASObject");
411 $tpl->setVariable("TITLE", $this->lng->txt("option") . " " . $form_type . ": " . $title);
412
413 $accordion->addItem($tpl->get(), $form->getHTML());
414 }
415
419 #[\Override]
420 protected function initCreateForm(string $new_type): Standard
421 {
422 return $this->initUploadForm();
423 }
424
425 #[\Override]
426 protected function getCreationFormTitle(): string
427 {
428 return $this->lng->txt('upload_files');
429 }
430
431 public function initUploadForm(): Standard
432 {
433 $this->getLanguage()->loadLanguageModule('file');
434 $inputs = [];
435
436 $this->ctrl->setParameterByClass(self::class, 'new_type', $this->getType());
437 $this->ctrl->setParameterByClass(
438 self::class,
439 self::PARAM_UPLOAD_ORIGIN,
440 self::UPLOAD_ORIGIN_STANDARD
441 );
442
443
444 $inputs[self::PARAM_FILES] = $this->ui->factory()->input()->field()->file(
445 $this->upload_handler,
446 $this->lng->txt('upload_files'),
447 null,
448 $this->ui->factory()->input()->field()->group([
449 self::PARAM_TITLE => $this->ui->factory()->input()->field()->text(
450 $this->lng->txt('title')
451 )->withAdditionalTransformation(
452 $this->getEmptyStringToNullTransformation()
453 ),
454 self::PARAM_DESCRIPTION => $this->ui->factory()->input()->field()->textarea(
455 $this->lng->txt('description')
456 )->withAdditionalTransformation(
457 $this->getEmptyStringToNullTransformation()
458 ),
459 ])
460 )->withMaxFiles(
461 self::UPLOAD_MAX_FILES
462 )->withRequired(true);
463
464 if ($this->lom_services->copyrightHelper()->isCopyrightSelectionActive()) {
465 $inputs[self::PARAM_COPYRIGHT_ID] = $this->getCopyrightSelectionInput('set_license_for_all_files');
466 }
467
468 return $this->ui->factory()->input()->container()->form()->standard(
469 $this->ctrl->getFormActionByClass(self::class, self::CMD_UPLOAD_FILES),
470 $inputs
471 )->withSubmitLabel($this->lng->txt('upload_files'));
472 }
473
477 protected function uploadFiles(): void
478 {
479 $origin = ($this->request_wrapper->has(self::PARAM_UPLOAD_ORIGIN)) ?
480 $this->request_wrapper->retrieve(
481 self::PARAM_UPLOAD_ORIGIN,
482 $this->refinery->kindlyTo()->string()
483 ) : self::UPLOAD_ORIGIN_STANDARD;
484
485 if (self::UPLOAD_ORIGIN_DROPZONE === $origin) {
486 $dropzone = new ilObjFileUploadDropzone($this->parent_id);
487 $dropzone = $dropzone->getDropzone()->withRequest($this->request);
488 $data = $dropzone->getData();
489 } else {
490 $form = $this->initUploadForm()->withRequest($this->request);
491 $data = $form->getData();
492 }
493 $files = $data[self::PARAM_FILES] ?? $data[0] ?? null;
494
495 if (empty($files)) {
496 $form = $this->initUploadForm()->withRequest($this->request);
497 $this->tpl->setContent($this->getCreationFormsHTML($form));
498 return;
499 }
500
501 $processor = new ilObjFileProcessor(
502 $this->stakeholder,
503 $this,
504 $this->storage,
505 $this->file_service_settings
506 );
507
508 $errors = false;
509 foreach ($files as $file_data) {
510 $rid = $this->storage->manage()->find($file_data[0]);
511 if (null !== $rid) {
512 try {
513 $processor->process(
514 $rid,
515 $file_data[1][self::PARAM_TITLE] ?? null,
516 $file_data[1][self::PARAM_DESCRIPTION] ?? null,
517 $data[self::PARAM_COPYRIGHT_ID] ?? null
518 );
519 } catch (Throwable $t) {
520 $errors = true;
521 if (null !== $this->log) {
522 $this->log->error($t->getMessage() . ": " . $t->getTraceAsString());
523 }
524 }
525 }
526 }
527
528 if ($errors) {
529 $this->ui->mainTemplate()->setOnScreenMessage(
530 'failure',
531 $this->lng->txt('could_not_create_file_objs'),
532 true
533 );
534 }
535
536 if ($processor->getInvalidFileNames() !== []) {
537 $this->ui->mainTemplate()->setOnScreenMessage(
538 'info',
539 sprintf(
540 $this->lng->txt('file_upload_info_file_with_critical_extension'),
541 implode(', ', $processor->getInvalidFileNames())
542 ),
543 true
544 );
545 }
546
547 $link = match ($this->id_type) {
548 self::WORKSPACE_NODE_ID => $this->ctrl->getLinkTargetByClass(ilObjWorkspaceRootFolderGUI::class),
549 default => ilLink::_getLink($this->requested_ref_id),
550 };
551
552 $this->ctrl->redirectToURL($link);
553 }
554
555 #[\Override]
556 public function putObjectInTree(ilObject $obj, ?int $parent_node_id = null): void
557 {
558 // this is needed to support multi fileuploads in personal and shared resources
559 $backup_node_id = $this->node_id;
560 parent::putObjectInTree($obj, $parent_node_id);
561 $this->node_id = $backup_node_id;
562 }
563
567 #[\Override]
568 public function update(): void
569 {
570 $data = [];
571 $form = $this->initPropertiesForm();
572 $form = $form->withRequest($this->request);
573 $inputs = $form->getData();
574
578 $title_and_description = $inputs['file_info']['title_and_description'];
579
580 $title = $title_and_description->getTitle();
581 // bugfix mantis 26045:
582 $filename = $this->object->getFileName();
583 if (trim((string) $title) === '') {
584 $title = $filename;
585 }
586 $title = $this->object->appendSuffixToTitle($title, $filename);
587
588 $this->object->handleChangedObjectTitle($title);
589
590 $description = $title_and_description->getLongDescription();
591 $this->object->setDescription($description);
592
593 $updated_title_and_description = new TitleAndDescription($title, $description);
594 $this->object->getObjectProperties()->storePropertyTitleAndDescription($updated_title_and_description);
595
596 $this->object->setImportantInfo($inputs['file_info']['important_info']);
597 $this->object->setRating($inputs['obj_features']['rating'] ?? false);
598 $this->object->setOnclickMode((int) $inputs['file_info']['on_click_action']);
599 $this->object->update();
600
601 $this->object->getObjectProperties()->storePropertyIsOnline($inputs['availability']['online_status']);
602
603 if (($inputs['presentation']['tile_image'] ?? null) !== null) {
604 $this->object->getObjectProperties()->storePropertyTileImage($inputs['presentation']['tile_image']);
605 }
606
607 // BEGIN ChangeEvent: Record update event.
608 if (!empty($data["name"])) {
609 global $DIC;
610 $ilUser = $DIC['ilUser'];
611 ilChangeEvent::_recordWriteEvent($this->object->getId(), $ilUser->getId(), 'update');
612 }
613 // END ChangeEvent: Record update event.
614
615 // Update ecs export settings
616 // $ecs = new ilECSFileSettings($this->object);
617 // $ecs->handleSettingsUpdate(); TODO: reintroduce usage of ECS file settings once they have been made compatible with the new ui components
618
619 $this->tpl->setOnScreenMessage('success', $this->lng->txt("msg_obj_modified"), true);
620 $this->ctrl->redirectByClass(self::class, self::CMD_EDIT);
621 }
622
623 #[\Override]
624 public function edit(): void
625 {
626 global $DIC;
627 $ilErr = $DIC['ilErr'];
628
629 if (!$this->capabilities->get(Capabilities::EDIT_SETTINGS)->isUnlocked()) {
630 $ilErr->raiseError($this->lng->txt("msg_no_perm_write"));
631 }
632
633 $this->initSettingsTab();
634
635 $form = $this->initPropertiesForm();
636
637 // $ecs = new ilECSFileSettings($this->object);
638 // $ecs->addSettingsToForm($form, ilObjFile::OBJECT_TYPE); TODO: reintroduce usage of ECS file settings once they have been made compatible with the new ui components
639
640 $this->tpl->setContent($this->renderer->render($form));
641 }
642
643 protected function initPropertiesForm(): Standard
644 {
645 $title_and_description = $this->object->getObjectProperties()->getPropertyTitleAndDescription()->toForm(
646 $this->lng,
647 $this->ui->factory()->input()->field(),
648 $this->refinery
649 );
650
651 $important_info = $this->inputs->field()->markdown(
653 $this->lng->txt('important_info'),
654 $this->lng->txt('important_info_byline')
655 )->withValue(
656 $this->object->getImportantInfo() ?? ""
657 );
658
659 $on_click_action = $this->inputs->field()->radio(
660 $this->lng->txt('on_click_action')
661 )->withOption(
663 $this->lng->txt('file_action_download'),
664 $this->lng->txt('file_action_download_info'),
665 )->withOption(
667 $this->lng->txt('file_action_show'),
668 $this->lng->txt('file_action_show_info'),
669 )->withValue(
670 (string) $this->object->getOnClickMode()
671 );
672
673 $input_groups = array_filter([
674 "title_and_description" => $title_and_description,
675 "important_info" => $important_info,
676 "on_click_action" => $on_click_action
677 ], static fn(FormInput $input): bool => null !== $input);
678
679 $file_info_section = $this->inputs->field()->section(
680 $input_groups,
681 $this->lng->txt('file_info')
682 );
683
684 $online_status = $this->object->getObjectProperties()->getPropertyIsOnline()->toForm(
685 $this->lng,
686 $this->ui->factory()->input()->field(),
687 $this->refinery
688 );
689 $availability_section = $this->inputs->field()->section(
690 ["online_status" => $online_status],
691 $this->lng->txt('rep_activation_availability')
692 );
693
694 $presentation_section = null;
695 if ($this->id_type === self::REPOSITORY_NODE_ID) {
696 $tile_image = $this->object->getObjectProperties()->getPropertyTileImage()->toForm(
697 $this->lng,
698 $this->ui->factory()->input()->field(),
699 $this->refinery
700 );
701 $presentation_section = $this->inputs->field()->section(
702 ["tile_image" => $tile_image],
703 $this->lng->txt('settings_presentation_header')
704 );
705 }
706
707 $additional_features_section = null;
708 if ($this->id_type === self::REPOSITORY_NODE_ID) {
709 $this->lng->loadLanguageModule('rating');
710
711 $enable_rating = $this->inputs->field()->checkbox(
712 $this->lng->txt('rating_activate_rating'),
713 $this->lng->txt('rating_activate_rating_info')
714 )->withValue(
715 $this->object->hasRating()
716 );
717 $additional_features_section = $this->inputs->field()->section(
718 ["rating" => $enable_rating],
719 $this->lng->txt('obj_features')
720 );
721 }
722
723 $inputs = array_filter([
724 "file_info" => $file_info_section,
725 "availability" => $availability_section,
726 "presentation" => $presentation_section,
727 "obj_features" => $additional_features_section
728 ], static fn(?Section $input): bool => null !== $input);
729
730 return $this->inputs->container()->form()->standard(
731 $this->ctrl->getLinkTargetByClass(self::class, 'update'),
732 $inputs
733 );
734 }
735
736 public function sendFile(): bool
737 {
738 $hist_entry_id = $this->request_wrapper->has('hist_id')
739 ? $this->request_wrapper->retrieve('hist_id', $this->refinery->kindlyTo()->int())
740 : null;
741 try {
742 if (ANONYMOUS_USER_ID === $this->user->getId() && $this->request_wrapper->has('transaction')) {
743 $this->object->sendFile($hist_entry_id);
744 }
745
746 if ($this->capabilities->get(Capabilities::DOWNLOAD)->isUnlocked()) {
747 // Record read event and catchup with write events
748 $this->recordReadEvent();
749
750 $this->object->sendFile($hist_entry_id);
751 } else {
752 $this->error->raiseError($this->lng->txt("permission_denied"), $this->error->MESSAGE);
753 }
754 } catch (FileNotFoundException $e) {
755 $this->error->raiseError($e->getMessage(), $this->error->MESSAGE);
756 }
757
758 return true;
759 }
760
764 public function showSummary(): void
765 {
766 $this->ctrl->redirectToURL(
767 (string) $this->capabilities->get(Capabilities::INFO_PAGE)->getUri()
768 );
769 }
770 public function showSummaryForced(): void
771 {
772 $this->ctrl->redirectToURL(
773 (string) $this->capabilities->get(Capabilities::FORCED_INFO_PAGE)->getUri()
774 );
775 }
776
777 public function versions(): void
778 {
779 $this->ctrl->redirectToURL(
780 (string) $this->capabilities->get(Capabilities::MANAGE_VERSIONS)->getUri()
781 );
782 }
783
784 public function unzipCurrentRevision(): void
785 {
786 $this->ctrl->redirectToURL(
787 (string) $this->capabilities->get(Capabilities::UNZIP)->getUri()
788 );
789 }
790
791 protected function editExternal(): void
792 {
793 $this->ctrl->redirectToURL(
794 (string) $this->capabilities->get(Capabilities::EDIT_EXTERNAL)->getUri()
795 );
796 }
797 protected function viewExternal(): void
798 {
799 $this->ctrl->redirectToURL(
800 (string) $this->capabilities->get(Capabilities::VIEW_EXTERNAL)->getUri()
801 );
802 }
803
807 public function infoScreenForward(): void
808 {
809 $this->tabs_gui->activateTab("id_info");
810
811 if (!$this->capabilities->get(Capabilities::INFO_PAGE)->isUnlocked()) {
812 $GLOBALS['DIC']['ilErr']->raiseError(
813 $this->lng->txt("msg_no_perm_read"),
814 2
815 ); // TODO remove magic number and old ilErr call
816 }
817
818 // add set completed button, if LP mode is active
819 if ($this->object->getLPMode() === ilLPObjSettings::LP_MODE_MANUAL) {
820 if (ilLPStatus::_hasUserCompleted($this->object->getId(), $this->user->getId())) {
821 $label = $this->lng->txt('file_btn_lp_toggle_state_completed');
822 } else {
823 $label = $this->lng->txt('file_btn_lp_toggle_state_not_completed');
824 }
825 $this->toolbar->addComponent(
826 $this->ui->factory()->button()->standard(
827 $label,
828 $this->ctrl->getLinkTarget($this, 'toggleLearningProgress')
829 )
830 );
831 }
832
833 // Add WOPI editor Button
834 if ($this->capabilities->get(Capabilities::EDIT_EXTERNAL)->isUnlocked()) {
835 $external_editor = $this->ui->factory()
836 ->button()
837 ->standard(
838 $this->lng->txt('open_external_editor'),
839 $this->ctrl->getLinkTargetByClass(
840 \ilWOPIEmbeddedApplicationGUI::class,
842 )
843 );
844 $this->toolbar->addComponent($external_editor);
845 }
846
847 $info = $this->buildInfoScreen(false);
848 $this->ctrl->forwardCommand($info);
849 }
850
851 protected function toggleLearningProgress(): void
852 {
854 $this->user->getId(),
855 $this->obj_id,
856 $this->ref_id,
857 'file'
858 );
859
860 $lp_marks = new ilLPMarks($this->obj_id, $this->user->getId());
861 $lp_marks->setCompleted(!ilLPStatus::_hasUserCompleted($this->object->getId(), $this->user->getId()));
862 $lp_marks->update();
863
864 ilLPStatusWrapper::_updateStatus($this->obj_id, $this->user->getId());
865
866 $this->tpl->setOnScreenMessage('success', $this->lng->txt('msg_obj_modified'), true);
867 $this->ctrl->redirect($this, Capabilities::INFO_PAGE->value);
868 }
869
870 public function buildInfoScreen(bool $kiosk_mode): ilInfoScreenGUI
871 {
872 $info = new ilInfoScreenGUI($this);
873
874 if (!$kiosk_mode) { // in kiosk mode we don't want to show the following sections
875 $info->enablePrivateNotes();
876
877 if ($this->capabilities->get(Capabilities::DOWNLOAD)->isUnlocked()) {
878 $info->enableNews();
879 }
880
881 // no news editing for files, just notifications
882 $info->enableNewsEditing(false);
883 if ($this->capabilities->get(Capabilities::MANAGE_VERSIONS)->isUnlocked()) {
884 $news_set = new ilSetting("news");
885 $enable_internal_rss = $news_set->get("enable_rss_for_internal");
886
887 if ($enable_internal_rss) {
888 $info->setBlockProperty("news", "settings", true);
889 $info->setBlockProperty("news", "public_notifications_option", true);
890 }
891 }
892
893 $obj_id = $this->object->getId();
894 $record_gui = new ilAdvancedMDRecordGUI(
896 'file',
897 $obj_id,
898 '',
899 0,
900 $this->call_by_reference
901 );
902 $record_gui->setInfoObject($info);
903 $record_gui->parse();
904 }
905 // show rating is not possible in kiosk mode
906
907 // Important Information
908 $important_info = $this->object->getImportantInfo();
909 if (!empty($important_info)) {
910 $group = new Group(new Factory(), $this->lng);
911 $markdown_to_html = $group->markdown()->toHTML();
912
913 $info->addSection($this->lng->txt("important_info"));
914 $info->addProperty("", $markdown_to_html->transform($important_info));
915 }
916
917 // Download Launcher
918 if ($this->capabilities->get(Capabilities::DOWNLOAD)->isUnlocked()) {
919 // get permanent download link for repository
920 if ($this->id_type === self::REPOSITORY_NODE_ID) {
921 $download_target = ilObjFileAccess::_getPermanentDownloadLink($this->node_id);
922 } else {
923 $download_target = rtrim(ILIAS_HTTP_PATH, '/') . '/' . $this->ctrl->getLinkTarget(
924 $this,
925 self::CMD_SEND_FILE
926 );
927 }
928 $url = $this->data_factory->uri($download_target);
929 $link = $this->data_factory->link($this->lng->txt('file_download'), $url);
930 $download_launcher = $this->ui->factory()->launcher()->inline($link);
931 // create own section for download launcher if there is no important info section
932 if (empty($important_info)) {
933 $info->addSection("");
934 }
935 // add download launcher
936 $info->addProperty("", $this->renderer->render($download_launcher));
937 }
938
939 // standard meta data
940 $info->addMetaDataSections($this->object->getId(), 0, $this->object->getType());
941
942 // in kiosk mode we don't want to show the following sections
943 // links to resource
944 if (!$kiosk_mode && ($this->access->checkAccess("write", "", $this->ref_id) ||
945 $this->access->checkAccess("edit_permissions", "", $this->ref_id))) {
946 $rs = ilObject::_getAllReferences($this->obj_id);
947 $refs = [];
948 foreach ($rs as $r) {
949 if ($this->tree->isInTree($r)) {
950 $refs[] = $r;
951 }
952 }
953 if (count($refs) > 1) {
954 $links = $sep = "";
955 foreach ($refs as $r) {
956 $cont_loc = new ilLocatorGUI();
957 $cont_loc->addContextItems($r, true);
958 $links .= $sep . $cont_loc->getHTML();
959 $sep = "<br />";
960 }
961
962 $info->addProperty(
963 $this->lng->txt("res_links"),
964 '<div class="small">' . $links . '</div>'
965 );
966 }
967 }
968
969 // File Info
970 $info->addSection($this->lng->txt("file_info"));
971 if ($kiosk_mode) {
972 $file_info_for_users = $this->getFileInfoForUsers();
973 foreach ($file_info_for_users as $file_info_entry_key => $file_info_entry_value) {
974 if ($file_info_entry_value !== null) {
975 $info->addProperty($file_info_entry_key, $file_info_entry_value);
976 }
977 }
978 } else {
979 $file_info = $this->getAllFileInfoForCurrentUser();
980 foreach ($file_info as $file_info_block) {
981 foreach ($file_info_block as $file_info_entry_key => $file_info_entry_value) {
982 if ($file_info_entry_value !== null) {
983 $info->addProperty($file_info_entry_key, $file_info_entry_value);
984 }
985 }
986 }
987 }
988
989 $info->hideFurtherSections(false);
990
991 return $info;
992 }
993
994 // get tabs
995 #[\Override]
996 protected function setTabs(): void
997 {
998 global $DIC;
999 $ilHelp = $DIC['ilHelp'];
1000 $ilHelp->setScreenIdComponent(ilObjFile::OBJECT_TYPE);
1001
1002 $this->ctrl->setParameter($this, "ref_id", $this->node_id);
1003
1004 if (($c = $this->capabilities->get(Capabilities::VIEW_EXTERNAL)) && $c->isUnlocked()) {
1005 $this->tabs_gui->addTab(
1006 "content",
1007 $this->lng->txt("content"),
1008 $c->getURI()
1009 );
1010 }
1011
1012 if (($c = $this->capabilities->get(Capabilities::MANAGE_VERSIONS)) && $c->isUnlocked()) {
1013 $this->tabs_gui->addTab(
1014 "id_versions",
1015 $this->lng->txt(self::CMD_VERSIONS),
1016 $this->ctrl->getLinkTargetByClass(ilFileVersionsGUI::class, ilFileVersionsGUI::CMD_DEFAULT)
1017 );
1018 }
1019
1020 if (($c = $this->capabilities->get(Capabilities::INFO_PAGE)) && $c->isUnlocked()) {
1021 $this->tabs_gui->addTab(
1022 "id_info",
1023 $this->lng->txt("info_short"),
1024 $this->ctrl->getLinkTargetByClass(["ilobjfilegui", "ilinfoscreengui"], "showSummary")
1025 );
1026 }
1027
1028 if (($c = $this->capabilities->get(Capabilities::EDIT_SETTINGS)) && $c->isUnlocked()) {
1029 $this->tabs_gui->addTab(
1030 "settings",
1031 $this->lng->txt("settings"),
1032 $this->ctrl->getLinkTarget($this, self::CMD_EDIT)
1033 );
1034 }
1035
1036 if (ilLearningProgressAccess::checkAccess($this->object->getRefId())) {
1037 $this->tabs_gui->addTab(
1038 'learning_progress',
1039 $this->lng->txt('learning_progress'),
1040 $this->ctrl->getLinkTargetByClass([self::class, 'illearningprogressgui'], '')
1041 );
1042 }
1043
1044 // meta data
1045 if (($c = $this->capabilities->get(Capabilities::EDIT_SETTINGS)) && $c->isUnlocked()) {
1046 $mdgui = new ilObjectMetaDataGUI($this->object, null, null, $this->call_by_reference);
1047 $mdtab = $mdgui->getTab();
1048 if ($mdtab) {
1049 $this->tabs_gui->addTab(
1050 "id_meta",
1051 $this->lng->txt("meta_data"),
1052 $mdtab
1053 );
1054 }
1055 }
1056
1057 // export
1058 if (($c = $this->capabilities->get(Capabilities::EDIT_SETTINGS)) && $c->isUnlocked()) {
1059 $this->tabs_gui->addTab(
1060 "export",
1061 $this->lng->txt("export"),
1062 $this->ctrl->getLinkTargetByClass("ilexportgui", "")
1063 );
1064 }
1065
1066 // will add permission tab if needed
1067 parent::setTabs();
1068 }
1069
1070 protected function initSettingsTab(): void
1071 {
1072 $this->tabs_gui->activateTab("settings");
1073 // add subtab for common settings
1074 $this->tabs_gui->addSubTab(
1075 'file_settings',
1076 $this->lng->txt('settings'),
1077 $this->ctrl->getLinkTargetByClass(self::class, self::CMD_EDIT)
1078 );
1079 if (in_array('file', ilAdvancedMDRecord::_getActivatedObjTypes(), true)) {
1080 $this->tabs_gui->addSubTab(
1081 'service_settings',
1082 $this->lng->txt('service_settings'),
1083 $this->ctrl->getLinkTargetByClass(ilFileCommonSettingsGUI::class, ilFileCommonSettingsGUI::CMD_EDIT)
1084 );
1085 }
1086
1087 $this->tabs_gui->activateSubTab("file_settings");
1088 }
1089
1090 public static function _goto($a_target, $a_additional = null): void
1091 {
1092 global $DIC;
1093 $main_tpl = $DIC->ui()->mainTemplate();
1094 $ilErr = $DIC['ilErr'];
1095 $lng = $DIC['lng'];
1096 $ilAccess = $DIC['ilAccess'];
1097
1098 if ($a_additional && str_ends_with((string) $a_additional, "wsp")) {
1100 }
1101
1102 // added support for direct download goto links
1103 if ($a_additional && str_ends_with((string) $a_additional, "download")) {
1104 ilObjectGUI::_gotoRepositoryNode($a_target, "sendfile");
1105 }
1106
1107 // static method, no workspace support yet
1108
1109 if ($ilAccess->checkAccess("visible", "", $a_target)
1110 || $ilAccess->checkAccess("read", "", $a_target)) {
1111 ilObjectGUI::_gotoRepositoryNode($a_target, Capabilities::INFO_PAGE->value);
1112 } elseif ($ilAccess->checkAccess("read", "", ROOT_FOLDER_ID)) {
1113 $main_tpl->setOnScreenMessage(
1114 'failure',
1115 sprintf(
1116 $lng->txt("msg_no_perm_read_item"),
1118 ),
1119 true
1120 );
1122 }
1123
1124 $ilErr->raiseError($lng->txt("msg_no_perm_read"), $ilErr->FATAL);
1125 }
1126
1130 protected function addLocatorItems(): void
1131 {
1132 global $DIC;
1133 $ilLocator = $DIC['ilLocator'];
1134
1135 if (is_object($this->object)) {
1136 $ilLocator->addItem($this->object->getTitle(), $this->ctrl->getLinkTarget($this, ""), "", $this->node_id);
1137 }
1138 }
1139
1140 #[\Override]
1141 protected function initHeaderAction(?string $a_sub_type = null, ?int $a_sub_id = null): ?\ilObjectListGUI
1142 {
1143 $lg = parent::initHeaderAction($a_sub_type, $a_sub_id);
1144 if ($lg instanceof ilObjectListGUI && $this->object->hasRating()) {
1145 $lg->enableRating(
1146 true,
1147 null,
1148 false,
1149 [ilCommonActionDispatcherGUI::class, ilRatingGUI::class]
1150 );
1151 }
1152
1153 return $lg;
1154 }
1155
1156 protected function getCtrl(): \ilCtrl
1157 {
1158 return $this->ctrl;
1159 }
1160
1164 protected function getFileObj(): ilObjFile
1165 {
1166 if (!$this->object instanceof ilObjFile) {
1167 throw new ilFileException("Error: object is not of type ilObjFile or doesn't exist");
1168 }
1169
1170 return $this->object;
1171 }
1172
1174 {
1175 return $this->stakeholder;
1176 }
1177
1178 protected function getGeneralSettings(): General
1179 {
1180 return $this->general_settings;
1181 }
1182
1183 protected function getLanguage(): \ilLanguage
1184 {
1185 return $this->lng;
1186 }
1187
1188 protected function getNodeID(): int
1189 {
1190 return $this->node_id;
1191 }
1192
1193 protected function getRefinery(): \ILIAS\Refinery\Factory
1194 {
1195 return $this->refinery;
1196 }
1197
1198 protected function getUIFactory(): ILIAS\UI\Factory
1199 {
1200 return $this->ui->factory();
1201 }
1202
1203 protected function getUser(): ilObjUser
1204 {
1205 return $this->user;
1206 }
1207}
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:31
$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