35 protected \ILIAS\DI\UIServices
$ui;
39 protected Exercise\InternalGUIService
$gui;
57 public function __construct($a_data,
int $a_id,
bool $a_call_by_reference)
61 $this->
lng = $DIC->language();
62 $this->
user = $DIC->user();
63 $this->
ctrl = $DIC->ctrl();
64 $this->
tabs = $DIC->tabs();
65 $this->
help = $DIC[
"ilHelp"];
66 $this->
locator = $DIC[
"ilLocator"];
67 $this->tpl = $DIC[
"tpl"];
68 $this->
toolbar = $DIC->toolbar();
69 $lng = $DIC->language();
71 $this->
lng->loadLanguageModule(
'cert');
78 $this->
ctrl->saveParameter($this, [
"ass_id",
"mode",
"from_overview"]);
80 $this->service = $DIC->exercise()->internal();
81 $this->gui = $this->service->gui();
82 $this->exercise_request = $DIC->exercise()->internal()->gui()->request();
83 $this->exercise_ui = $DIC->exercise()->internal()->gui();
84 $this->requested_ass_id = $this->exercise_request->getAssId();
87 $this->requested_ass_id
88 ) === $this->
object->getId()) {
89 $this->ass = $this->exercise_request->getAssignment();
90 } elseif ($this->requested_ass_id > 0) {
93 $this->lp_user_id = ($this->exercise_request->getUserId() > 0 && $this->
access->checkAccess(
"read_learning_progress",
"", $this->exercise_request->getRefId()))
94 ? $this->exercise_request->getUserId()
95 : $this->
user->getId();
96 $this->requested_sort_order = $this->exercise_request->getSortOrder();
97 $this->requested_sort_by = $this->exercise_request->getSortBy();
98 $this->requested_offset = $this->exercise_request->getOffset();
99 $this->requested_ref_id = $this->exercise_request->getRefId();
100 $this->requested_ass_id_goto = $this->exercise_request->getAssIdGoto();
101 $this->
ui = $this->service->gui()->ui();
103 $this->
notification = $this->service->domain()->notification($this->requested_ref_id);
106 $this->ass_manager = $this->service->domain()->assignment()->assignments(
110 $this->item_builder = $this->service->gui()->assignment()->itemBuilder(
112 $this->service->domain()->assignment()->mandatoryAssignments($this->
object)
126 $next_class = $this->
ctrl->getNextClass($this);
127 $cmd = $this->
ctrl->getCmd();
134 $this->gui->permanentLink()->setPermanentLink();
138 switch ($next_class) {
139 case "ilinfoscreengui":
140 $ilTabs->activateTab(
"info");
144 case 'ilpermissiongui':
145 $ilTabs->activateTab(
"permissions");
147 $this->
ctrl->forwardCommand($perm_gui);
150 case "illearningprogressgui":
151 $ilTabs->activateTab(
"learning_progress");
154 $this->
object->getRefId(),
157 $this->
ctrl->forwardCommand($new_gui);
158 $this->tabs_gui->setTabActive(
'learning_progress');
161 case 'ilobjectcopygui':
162 $ilCtrl->saveParameter($this,
'new_type');
163 $ilCtrl->setReturnByClass(get_class($this),
'create');
167 $this->
ctrl->forwardCommand($cp);
171 $ilTabs->activateTab(
"export");
173 $exp_gui->addFormat(
"xml");
174 $this->
ctrl->forwardCommand($exp_gui);
177 case "ilcommonactiondispatchergui":
179 $this->
ctrl->forwardCommand($gui);
182 case "ilcertificategui":
185 $this->tabs_gui->activateTab(
"settings");
186 $this->tabs_gui->activateSubTab(
"certificate");
189 $output_gui = $guiFactory->create($this->
object);
191 $this->
ctrl->forwardCommand($output_gui);
194 case "ilexassignmenteditorgui":
196 $ilTabs->activateTab(
"content");
200 $this->
object->isCompletionBySubmissionEnabled(),
203 $this->
ctrl->forwardCommand($ass_gui);
206 case "ilexercisemanagementgui":
208 if (
$GLOBALS[
'DIC']->
access()->checkRbacOrPositionPermissionAccess(
209 'edit_submissions_grades',
210 'edit_submissions_grades',
213 $ilTabs->activateTab(
"grades");
215 $this->
ctrl->forwardCommand($mgmt_gui);
221 case "ilexccriteriacataloguegui":
223 $ilTabs->activateTab(
"settings");
225 $ilTabs->activateSubTab(
"crit");
227 $this->
ctrl->forwardCommand($crit_gui);
237 case "ilexcrandomassignmentgui":
238 $gui = $this->exercise_ui->assignment()->getRandomAssignmentGUI();
239 $this->
ctrl->forwardCommand($gui);
242 case 'ilobjectmetadatagui':
244 $this->tabs_gui->setTabActive(
'meta_data');
246 $this->
ctrl->forwardCommand($md_gui);
249 case strtolower(ilAssignmentPresentationGUI::class):
251 $gui = $this->exercise_ui->assignment()->assignmentPresentationGUI($this->
object);
252 $this->
ctrl->forwardCommand($gui);
278 $a_new_object->saveData();
280 $this->tpl->setOnScreenMessage(
'success', $this->
lng->txt(
"exc_added"),
true);
282 $ilCtrl->setParameterByClass(
"ilExAssignmentEditorGUI",
"ref_id", $a_new_object->
getRefId());
283 $ilCtrl->redirectByClass(
"ilExAssignmentEditorGUI",
"addAssignment");
293 $ilCtrl->redirectByClass(
"ilExAssignmentEditorGUI",
"listAssignments");
303 $random_manager = $service->
domain()->assignment()->randomAssignments($exc);
305 $a_form->
setTitle($this->
lng->txt(
"exc_edit_exercise"));
308 $pres->setTitle($this->
lng->txt(
'obj_presentation'));
312 $a_form = $obj_service->commonSettings()->legacyForm($a_form, $this->
object)->addTileImage();
315 $section->setTitle($this->
lng->txt(
'exc_passing_exc'));
322 $this->
lng->txt(
"exc_pass_all"),
324 $this->
lng->txt(
"exc_pass_all_info")
326 $radg->addOption($op1);
328 $this->
lng->txt(
"exc_pass_minimum_nr"),
330 $this->
lng->txt(
"exc_pass_minimum_nr_info")
332 $radg->addOption($op2);
334 $this->
lng->txt(
"exc_random_selection"),
336 $this->
lng->txt(
"exc_random_selection_info")
341 $this->
lng->txt(
"exc_random_selection_not_changeable_info") .
" " .
342 implode(
" ", $random_manager->getDeniedActivationReasons())
346 $radg->setDisabled(
true);
348 $this->
lng->txt(
"exc_pass_mode_not_changeable_info") .
" " .
349 implode(
" ", $random_manager->getDeniedDeactivationReasons())
355 $rn->setMaxLength(4);
356 $rn->setRequired(
true);
357 $rn->setMinValue(1,
false);
359 $rn->setMaxValue($cnt,
true);
360 $op3->addSubItem($rn);
362 $radg->addOption($op3);
367 $ni->setMaxLength(4);
368 $ni->setRequired(
true);
370 $min = max($mand, 1);
371 $ni->setMinValue($min,
true);
372 $ni->setInfo($this->
lng->txt(
"exc_min_nr_info"));
373 $op2->addSubItem($ni);
379 $this->
lng->txt(
"exc_passed_status_determination"),
380 "completion_by_submission" 382 $op1 =
new ilRadioOption($this->
lng->txt(
"exc_completion_by_tutor"), 0,
"");
383 $subcompl->addOption($op1);
385 $this->
lng->txt(
"exc_completion_by_submission"),
387 $this->
lng->txt(
"exc_completion_by_submission_info")
389 $subcompl->addOption($op2);
398 $section->setTitle($this->
lng->txt(
'exc_publishing'));
403 $cb->setInfo($this->
lng->txt(
"exc_show_submissions_info"));
407 $section->setTitle($this->
lng->txt(
'exc_notification'));
412 $cbox->setInfo($this->
lng->txt(
"exc_submission_notification_info"));
418 $section->setTitle($this->
lng->txt(
'exc_feedback'));
425 $this->
lng->txt(
"exc_settings_feedback_mail"),
428 $option->
setInfo($this->
lng->txt(
"exc_settings_feedback_mail_info"));
429 $fdb->addOption($option);
431 $this->
lng->txt(
"exc_settings_feedback_file"),
434 $option->
setInfo($this->
lng->txt(
"exc_settings_feedback_file_info"));
435 $fdb->addOption($option);
437 $this->
lng->txt(
"exc_settings_feedback_text"),
440 $option->
setInfo($this->
lng->txt(
"exc_settings_feedback_text_info"));
441 $fdb->addOption($option);
445 $section->setTitle($this->
lng->txt(
'obj_features'));
451 ->getObjectPositionSettingsByType($this->
object->getType());
453 if ($position_settings->isActive()) {
469 $a_values[
"show_submissions"] = $this->
object->getShowSubmissions();
470 $a_values[
"pass_mode"] = $this->
object->getPassMode();
471 if ($a_values[
"pass_mode"] ==
"nr") {
472 $a_values[
"pass_nr"] = $this->
object->getPassNr();
475 $a_values[
"nr_random_mand"] = $this->
object->getNrMandatoryRandom();
480 $this->
object->getId()
483 $a_values[
'completion_by_submission'] = (
int) $this->
object->isCompletionBySubmissionEnabled();
485 $tfeedback = array();
486 if ($this->
object->hasTutorFeedbackMail()) {
489 if ($this->
object->hasTutorFeedbackText()) {
492 if ($this->
object->hasTutorFeedbackFile()) {
495 $a_values[
'tfeedback'] = $tfeedback;
499 ->isPositionAccessActiveForObject(
515 $this->
object->setShowSubmissions($a_form->
getInput(
"show_submissions"));
516 $this->
object->setPassMode($a_form->
getInput(
"pass_mode"));
517 if ($this->
object->getPassMode() ==
"nr") {
518 $this->
object->setPassNr($a_form->
getInput(
"pass_nr"));
521 $this->
object->setNrMandatoryRandom($a_form->
getInput(
"nr_random_mand"));
524 $this->
object->setCompletionBySubmission($a_form->
getInput(
'completion_by_submission') == 1);
526 $feedback = $a_form->
getInput(
"tfeedback");
527 $this->
object->setTutorFeedback(
529 ? array_sum($feedback)
536 $this->
object->getId(),
537 (bool) $a_form->
getInput(
"notification")
541 $obj_service->commonSettings()->legacyForm($a_form, $this->
object)->saveTileImage();
562 $ilCtrl->getLinkTarget($this,
"showOverview")
568 $ilCtrl->getLinkTargetByClass(
"ilExAssignmentEditorGUI",
"listAssignments")
571 $ilTabs->activateSubTab($a_activate);
574 protected function getTabs():
void 576 if ($this->
ctrl->getNextClass() === strtolower(ilAssignmentPresentationGUI::class)) {
585 $ilHelp->setScreenIdComponent(
"exc");
588 $this->tabs_gui->addTab(
596 $this->tabs_gui->addTab(
599 $this->
ctrl->getLinkTargetByClass(
"ilinfoscreengui",
"showSummary")
609 $this->tabs_gui->addTab(
612 $this->
ctrl->getLinkTarget($this,
'edit')
615 if ($this->
access->checkRbacOrPositionPermissionAccess(
616 'edit_submissions_grades',
617 'edit_submissions_grades',
618 $this->object->getRefId()
620 $this->tabs_gui->addTab(
622 $lng->
txt(
"exc_submissions_and_grades"),
623 $this->
ctrl->getLinkTargetByClass(
"ilexercisemanagementgui",
"members")
631 $this->tabs_gui->addTab(
633 $lng->
txt(
'learning_progress'),
634 $this->
ctrl->getLinkTargetByClass(array(
'ilobjexercisegui',
'illearningprogressgui'),
'')
639 if ($this->
access->checkAccess(
'write',
'', $this->object->getRefId())) {
641 $mdtab = $mdgui->getTab();
643 $this->tabs_gui->addTarget(
647 "ilobjectmetadatagui" 654 $this->tabs_gui->addTab(
657 $this->
ctrl->getLinkTargetByClass(
"ilexportgui",
"")
663 $this->tabs_gui->addTab(
666 $this->
ctrl->getLinkTargetByClass(array(get_class($this),
'ilpermissiongui'),
"perm")
676 $this->
ctrl->setCmd(
"showSummary");
677 $this->
ctrl->setCmdClass(
"ilinfoscreengui");
689 public function infoScreen():
void 695 $ilTabs->activateTab(
"info");
706 $info->enablePrivateNotes();
710 $info->enableNewsEditing();
711 $info->setBlockProperty(
"news",
"settings",
true);
716 $record_gui->parse();
719 $info->addMetaDataSections($this->
object->getId(), 0, $this->
object->getType());
722 $info->addSection($this->
lng->txt(
"exc_overview"));
726 foreach ($ass as
$a) {
728 if ($a[
"mandatory"]) {
732 $info->addProperty(
$lng->
txt(
"exc_assignments"), $cnt);
734 $info->addProperty(
$lng->
txt(
"exc_mandatory"), $mcnt);
737 $lng->
txt(
"exc_msg_all_mandatory_ass")
740 $info->addProperty(
$lng->
txt(
"exc_mandatory"), $mcnt);
743 sprintf(
$lng->
txt(
"exc_msg_min_number_ass"), $this->
object->getPassNr())
746 $info->addProperty(
$lng->
txt(
"exc_mandatory"), $exc->getNrMandatoryRandom());
749 $lng->
txt(
"exc_msg_all_mandatory_ass")
758 $st = $this->
object->determinStatusOfUser($ilUser->getId());
759 $status = $st[
"overall_status"];
760 if ($lpcomment !=
"" || $mark !=
"" || $status !=
"notgraded") {
761 $info->addSection($this->
lng->txt(
"exc_feedback_from_tutor"));
762 if ($lpcomment !=
"") {
764 $this->
lng->txt(
"exc_comment"),
770 $this->
lng->txt(
"exc_mark"),
781 if ($status !=
"notgraded") {
786 $path = $icons->getImagePathCompleted();
789 $path = $icons->getImagePathFailed();
795 $img = $icons->renderIcon(
$path,
$lng->
txt(
"exc_" . $status));
798 if ($st[
"failed_a_mandatory"]) {
799 $add =
" (" .
$lng->
txt(
"exc_msg_failed_mandatory") .
")";
800 } elseif ($status ==
"failed") {
801 $add =
" (" .
$lng->
txt(
"exc_msg_missed_minimum_number") .
")";
804 $this->
lng->txt(
"status"),
805 $img .
" " . $this->
lng->txt(
"exc_" . $status) . $add
812 $this->
ctrl->forwardCommand($info);
818 $this->tabs_gui->activateSubTab(
"edit");
819 parent::editObject();
824 $this->tabs_gui->addSubTab(
826 $this->
lng->txt(
"general_settings"),
827 $this->
ctrl->getLinkTarget($this,
"edit")
830 $this->tabs_gui->addSubTab(
832 $this->
lng->txt(
"exc_criteria_catalogues"),
833 $this->
ctrl->getLinkTargetByClass(
"ilexccriteriacataloguegui",
"")
837 if ($validator->validate()) {
838 $this->tabs_gui->addSubTab(
840 $this->
lng->txt(
"certificate"),
841 $this->
ctrl->getLinkTarget($this,
"certificate")
852 $DIC->exercise()->internal()->gui()->permanentLink()->goto($a_target, $a_raw);
862 if (is_object($this->
object)) {
865 $this->
object->getTitle(),
866 $this->
ctrl->getLinkTarget($this,
"showOverview"),
888 $this->
ctrl->setParameterByClass(self::class,
"from_overview",
"1");
889 $user = $this->service->domain()->user();
890 $toolbar = $this->service->gui()->toolbar();
891 $tabs = $this->service->gui()->tabs();
898 if ($this->handleRandomAssignmentEntryPage()) {
913 if ($this->certificateDownloadValidator->isCertificateDownloadable(
918 $this->
lng->txt(
"certificate"),
919 $this->
ctrl->getLinkTarget($this,
"outCertificate")
925 $f = $this->
ui->factory();
926 $r = $this->
ui->renderer();
929 $random_manager = $this->service->domain()->assignment()->randomAssignments($exc);
932 $list_modes = [$am::TYPE_ONGOING,$am::TYPE_FUTURE,$am::TYPE_PAST];
936 foreach ($list_modes as $lm) {
938 foreach ($this->ass_manager->getList($lm) as
$ass) {
939 if (!$random_manager->isAssignmentVisible($ass->
getId(), $this->
user->getId())) {
942 $items[$lm][] = $this->item_builder->getItem($ass,
$user->
getId());
948 foreach ($items as $lm => $it) {
949 if (count($it) > 0) {
950 $groups[] =
$f->item()->group($this->
lng->txt(
"exc_" . $lm), $it);
953 if (count($groups) > 0) {
954 $panel =
$f->panel()->listing()->standard($this->
lng->txt(
"exc_assignments"), $groups);
956 $panel =
$f->panel()->standard($this->
lng->txt(
"exc_assignments"),
$f->messageBox()->info($this->
lng->txt(
"exc_no_assignments")));
960 foreach ($am->getListModes() as $mode =>
$txt) {
963 $mode =
$f->viewControl()->mode(
965 $this->
lng->txt(
"exc_mode_selection")
966 )->withActive($am->getListModeLabel($this->getCurrentMode()));
969 $l =
$f->legacy(
"<br><br>");
970 $html .=
$r->render([$mode, $l, $panel]);
972 $this->tpl->setContent(
975 $this->
ctrl->setParameterByClass(self::class,
"from_overview", null);
980 return $this->ass_manager->getValidListMode($this->exercise_request->getMode());
985 $this->
ctrl->setParameterByClass(self::class,
"mode", $mode);
986 $link = $this->
ctrl->getLinkTargetByClass(self::class,
"showOverview");
987 $this->
ctrl->setParameterByClass(self::class,
"mode", null);
998 $this->tabs_gui->activateTab(
"settings");
999 $this->tabs_gui->activateSubTab(
"certificate");
1002 $output_gui = $guiFactory->create($this->
object);
1004 $output_gui->certificateEditor();
1011 $database = $DIC->database();
1012 $logger = $DIC->logger()->root();
1016 $objectId = $this->
object->
getId();
1018 if (!$this->certificateDownloadValidator->isCertificateDownloadable($ilUser->getId(), $objectId)) {
1019 $this->tpl->setOnScreenMessage(
'failure', $this->
lng->txt(
"permission_denied"),
true);
1020 $this->
ctrl->redirect($this);
1024 $pdfGenerator =
new ilPdfGenerator($ilUserCertificateRepository);
1029 $this->
lng->txt(
'error_creating_certificate_pdf')
1032 $pdfAction->
downloadPdf($ilUser->getId(), $objectId);
1043 if ($this->ass !== null) {
1045 if (!$state->getCommonDeadline() && $state->getRelativeDeadline()) {
1046 $idl = $state->getIndividualDeadlineObject();
1047 $idl->setStartingTimestamp(time());
1059 public function requestDeadlineObject():
void 1064 if ($this->ass !== null) {
1066 if ($state->needsIndividualDeadline() && !$state->hasRequestedIndividualDeadline()) {
1067 $idl = $state->getIndividualDeadlineObject();
1068 $idl->setRequested(
true);
1070 $this->
notification->sendDeadlineRequestNotification($this->ass->getId());
1073 $exc->members_obj->assignMembers([
$user->
getId()]);
1084 protected function handleRandomAssignmentEntryPage():
bool 1090 $random_manager = $service->
domain()->assignment()->randomAssignments($exc);
1091 if ($random_manager->needsStart()) {
1092 $gui = $this->exercise_ui->assignment()->getRandomAssignmentGUI();
1093 $gui->renderStartPage();
Class ilExAssignmentEditorGUI.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
Class ilExcCriteriaCatalogueGUI.
Exercise Assignment ItemBuilderUI $item_builder
static _lookupComment(int $a_usr_id, int $a_obj_id)
redirectByClass( $a_class, string $a_cmd=null, string $a_anchor=null, bool $is_async=false)
getTabs()
overwrite in derived GUI class of your object type
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...
txt(string $a_topic, string $a_default_lang_fallback_mod="")
gets the text for a given topic if the topic is not in the list, the topic itself with "-" will be re...
string $requested_sort_by
setDisabled(bool $a_disabled)
GUI class for the workflow of copying objects.
addContentSubTabs(string $a_activate)
static count(int $a_ex_id)
prepareOutput(bool $show_sub_objects=true)
Exercise Notification NotificationManager $notification
static getImagePath(string $img, string $module_path="", string $mode="output", bool $offline=false)
get image path (for images located in a template directory)
static countMandatory(int $a_ex_id)
updateCustom(ilPropertyFormGUI $a_form)
static getInstance(int $variant=ilLPStatusIcons::ICON_VARIANT_DEFAULT, ?\ILIAS\UI\Renderer $renderer=null, ?\ILIAS\UI\Factory $factory=null)
Exercise internal service.
setParameterByClass(string $a_class, string $a_parameter, $a_value)
loadLanguageModule(string $a_module)
Load language module.
static updateServiceSettingsForm(int $obj_id, ilPropertyFormGUI $form, array $services)
getEditFormCustomValues(array &$a_values)
static checkAccess(int $a_ref_id, bool $a_allow_only_read=true)
check access to learning progress
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static _lookupContainerSetting(int $a_id, string $a_keyword, string $a_default_value=null)
static _tracProgress(int $a_user_id, int $a_obj_id, int $a_ref_id, string $a_obj_type='')
Exercise Assignment AssignmentManager $ass_manager
GUI class for exercise assignments.
const TUTOR_FEEDBACK_FILE
const TUTOR_FEEDBACK_TEXT
Export User Interface Class.
static getAssignmentDataOfExercise(int $a_exc_id)
static _goto(string $a_target, string $a_raw)
int $requested_ass_id_goto
Exercise GUIRequest $exercise_request
const TUTOR_FEEDBACK_MAIL
static setNotification(int $type, int $user_id, int $id, bool $status=true)
Set notification status for object and user.
Class ilObjectGUI Basic methods of all Output classes.
startAssignmentObject()
Start assignment with relative deadline.
Validates if an active certificate is stored in the database and can be downloaded by the user...
static getInstanceByIds(int $a_ass_id, int $a_user_id=0)
clearParametersByClass(string $a_class)
static initServiceSettingsForm(int $obj_id, ilPropertyFormGUI $form, array $services)
const TYPE_EXERCISE_SUBMISSION
checkPermissionBool(string $perm, string $cmd="", string $type="", ?int $ref_id=null)
ilExerciseManagementGUI: ilFileSystemGUI, ilRepositorySearchGUI ilExerciseManagementGUI: ilExSubmiss...
static getInstancesByExercise(int $a_exc_id)
afterSave(ilObject $a_new_object)
static _lookupMark(int $a_usr_id, int $a_obj_id)
Just a wrapper class to create Unit Test for other classes.
activateTab(string $a_id)
getLinkTarget(object $a_gui_obj, string $a_cmd=null, string $a_anchor=null, bool $is_async=false, bool $has_xml_style=false)
ilCertificateDownloadValidator $certificateDownloadValidator
const LP_CONTEXT_REPOSITORY
addItem(string $a_title, string $a_link, string $a_frame="", int $a_ref_id=0, ?string $type=null)
static hasNotification(int $type, int $user_id, int $id)
Check notification status for object and user.
__construct($a_data, int $a_id, bool $a_call_by_reference)
getLongDescription()
get object long description (stored in object_description)
setInfoObject(ilInfoScreenGUI $info)
get info sections
$a
thx to https://mlocati.github.io/php-cs-fixer-configurator for the examples
Exercise InternalGUIService $exercise_ui
New PermissionGUI (extends from old ilPermission2GUI) RBAC related output.
const ORGU_POSITION_ACCESS
Exercise InternalGUIService $gui
addHeaderAction()
Add header action menu.
getModeLink(string $mode)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
checkPermission(string $perm, string $cmd="", string $type="", ?int $ref_id=null)
initEditCustomForm(ilPropertyFormGUI $a_form)
Add custom fields to update form.
string $requested_sort_order
static lookupExerciseId(int $a_ass_id)
static getInstanceFromAjaxCall()
(Re-)Build instance from ajax call
addLocatorItems()
Add locator item.
downloadPdf(int $userId, int $objectId)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...