101 $this->ui_factory = $DIC->ui()->factory();
102 $this->ui_renderer = $DIC->ui()->renderer();
103 $this->
user = $DIC->user();
104 $this->toolbar = $DIC->toolbar();
107 $this->ctrl = $DIC->ctrl();
108 $this->tabs_gui = $DIC->tabs();
109 $this->lng = $DIC->language();
110 $this->tpl = $DIC[
"tpl"];
112 $this->task_factory = $DIC->backgroundTasks()->taskFactory();
114 $request = $DIC->exercise()->internal()->request();
118 $this->exercise = $request->getRequestedExercise();
120 $this->assignment = $a_ass;
121 $this->ass_id = $this->assignment->getId();
124 $this->ctrl->saveParameter($this, array(
"vw",
"member_id"));
133 $class =
$ilCtrl->getNextClass($this);
137 case "ilfilesystemgui":
138 $ilTabs->clearTargets();
139 $ilTabs->setBackTarget(
150 $feedback_id = $submission->getFeedbackId();
151 $noti_rec_ids = $submission->getUserIds();
154 foreach ($noti_rec_ids as $rec_id) {
157 $fs_title = implode(
" / ", $fs_title);
159 $fs_gui =
new ilFileSystemGUI($fstorage->getFeedbackPath($feedback_id));
160 $fs_gui->
setTableId(
"excfbfil" . $this->assignment->getId() .
"_" . $feedback_id);
161 $fs_gui->setAllowDirectories(
false);
162 $fs_gui->setTitle(
$lng->txt(
"exc_fb_files") .
" - " .
163 $this->assignment->getTitle() .
" - " .
165 $pcommand = $fs_gui->getLastPerformedCommand();
166 if (is_array($pcommand) && $pcommand[
"cmd"] ==
"create_file") {
167 foreach ($noti_rec_ids as $user_id) {
168 $member_status = $this->assignment->getMemberStatus($user_id);
169 $member_status->setFeedback(
true);
170 $member_status->update();
173 $this->exercise->sendFeedbackFileNotification(
176 $this->assignment->getId()
179 $this->ctrl->forwardCommand($fs_gui);
182 case 'ilrepositorysearchgui':
184 $ref_id = $this->exercise->getRefId();
185 $rep_search->addUserAccessFilterCallable(
function ($a_user_ids) use ($ref_id) {
186 return $GLOBALS[
'DIC']->access()->filterUserIdsByRbacOrPositionOfCurrentUser(
187 'edit_submissions_grades',
188 'edit_submissions_grades',
193 $rep_search->setTitle($this->lng->txt(
"exc_add_participant"));
194 $rep_search->setCallback($this,
'addMembersObject');
198 $this->ctrl->setReturn($this,
'members');
200 $this->ctrl->forwardCommand($rep_search);
203 case "ilexsubmissionteamgui":
208 case "ilexsubmissionfilegui":
213 case "ilexsubmissiontextgui":
214 $ilCtrl->saveParameter($this, array(
"part_id"));
219 case "ilexpeerreviewgui":
227 case 'downloadSubmissions':
228 $cmd =
$ilCtrl->getCmd(
"downloadSubmissions");
231 $cmd =
$ilCtrl->getCmd(
"listPublicSubmissions");
234 $this->{$cmd .
"Object"}();
241 switch ($_REQUEST[
"vw"]) {
242 case self::VIEW_PARTICIPANT:
243 $back_cmd =
"showParticipant";
246 case self::VIEW_GRADES:
247 $back_cmd =
"showGradesOverview";
252 $back_cmd =
"members";
261 $this->ctrl->setReturn($this, $back_cmd);
263 $this->tabs_gui->clearTargets();
264 $this->tabs_gui->setBackTarget(
265 $this->lng->txt(
"back"),
266 $this->ctrl->getLinkTarget($this, $back_cmd)
269 return new ilExSubmission($this->assignment, $_REQUEST[
"member_id"], null,
true);
283 $ass_id =
$_GET[
"ass_id"];
284 $part_id =
$_GET[
"part_id"];
286 $ilCtrl->setParameter($this,
"vw",
"");
287 $ilCtrl->setParameter($this,
"member_id",
"");
288 $ilCtrl->setParameter($this,
"ass_id",
"");
289 $ilCtrl->setParameter($this,
"part_id",
"");
293 $lng->txt(
"exc_assignment_view"),
294 $ilCtrl->getLinkTarget($this,
"members")
298 $lng->txt(
"exc_participant_view"),
299 $ilCtrl->getLinkTarget($this,
"showParticipant")
303 $lng->txt(
"exc_grades_overview"),
304 $ilCtrl->getLinkTarget($this,
"showGradesOverview")
306 $ilTabs->activateSubTab($a_activate);
308 $ilCtrl->setParameter($this,
"ass_id", $ass_id);
309 $ilCtrl->setParameter($this,
"part_id", $part_id);
317 $ilCtrl->setParameterByClass(
"ilExSubmissionFileGUI",
"member_id", (
int)
$_GET[
"member_id"]);
318 $url =
$ilCtrl->getLinkTargetByClass(array(
"ilRepositoryGUI",
"ilExerciseHandlerGUI",
"ilObjExerciseGUI",
"ilExerciseManagementGUI",
"ilExSubmissionFileGUI"),
"downloadNewReturned");
319 $js_url =
$ilCtrl->getLinkTargetByClass(array(
"ilRepositoryGUI",
"ilExerciseHandlerGUI",
"ilObjExerciseGUI",
"ilExerciseManagementGUI",
"ilExSubmissionFileGUI"),
"downloadNewReturned",
"",
"",
false);
320 ilUtil::sendInfo(
$lng->txt(
"exc_wait_for_files") .
"<a href='$url'> " .
$lng->txt(
'exc_download_files') .
"</a><script>window.location.href ='" . $js_url .
"';</script>");
339 if (!$this->assignment) {
340 $this->assignment = current($ass);
344 if (count($ass) > 1) {
346 foreach ($ass as
$a) {
347 $options[$a->getId()] = $a->getTitle();
350 $si->setOptions($options);
351 $si->setValue($this->assignment->getId());
352 $ilToolbar->addStickyItem(
$si);
355 $button->setCaption(
"exc_select_ass");
356 $button->setCommand(
"selectAssignment");
357 $ilToolbar->addStickyItem($button);
359 $ilToolbar->addSeparator();
362 elseif ($this->assignment) {
363 $ilCtrl->setParameter($this,
"ass_id", $this->assignment->getId());
369 $has_rbac_access =
$GLOBALS[
'DIC']->access()->checkAccess(
370 'edit_submissions_grades',
372 $this->exercise->getRefId()
374 if ($has_rbac_access) {
379 'auto_complete_name' =>
$lng->txt(
'user'),
380 'submit_name' =>
$lng->txt(
'add'),
381 'add_search' =>
true,
382 'add_from_container' => $this->exercise->getRefId()
388 if (count($ass) > 0) {
389 if ($has_rbac_access) {
390 $ilToolbar->addSeparator();
394 $ilToolbar->setFormAction(
$ilCtrl->getFormAction($this));
396 $ilCtrl->setParameter($this,
"ass_id", $this->assignment->getId());
400 $ilToolbar->addButton(
401 $this->lng->txt(
"exc_adopt_group_teams"),
402 $this->ctrl->getLinkTarget($this,
"adoptTeamsFromGroup")
405 $ilToolbar->addSeparator();
407 } elseif ($this->exercise->hasTutorFeedbackFile()) {
408 if (!$this->assignment->getAssignmentType()->usesTeams()) {
410 $ilToolbar->addButton(
411 $this->lng->txt(
"exc_multi_feedback"),
412 $this->ctrl->getLinkTarget($this,
"showMultiFeedback")
415 $ilToolbar->addSeparator();
421 if ($submission_repository->hasSubmissions($this->assignment->getId())) {
422 $ass_type = $this->assignment->getType();
425 $ilToolbar->addFormButton(
$lng->txt(
"exc_list_text_assignment"),
"listTextAssignment");
427 $ilToolbar->addFormButton(
$lng->txt(
"download_all_returned_files"),
"downloadSubmissions");
429 $this->ctrl->setParameter($this,
"vw", self::VIEW_ASSIGNMENT);
433 $exc_tab->getHTML() .
440 $ilCtrl->setParameter($this,
"ass_id",
"");
447 $participant_id = $_REQUEST[
'part_id'];
451 (
int) $this->exercise->getRefId(),
452 (int) $this->exercise->getId(),
454 (
int) $participant_id
457 if ($download_task->run()) {
458 ilUtil::sendSuccess($this->lng->txt(
'exc_down_files_started_bg'),
true);
461 if ($this->assignment) {
462 $this->ctrl->redirect($this,
"members");
464 $this->ctrl->redirect($this,
"showParticipant");
473 $exc_tab->writeFilterToSession();
482 $exc_tab->resetFilter();
495 if (is_array(
$_POST[
"lcomment"])) {
496 foreach (
$_POST[
"lcomment"] as $k => $v) {
497 $marks_obj =
new ilLPMarks($this->exercise->getId(), (int) $k);
500 $marks_obj->update();
503 ilUtil::sendSuccess(
$lng->txt(
"exc_msg_saved_grades"),
true);
504 $ilCtrl->redirect($this,
"showGradesOverview");
519 $button_print = $this->ui_factory->button()->standard($this->lng->txt(
'print'),
"#")
521 return "$('#{$id}').click(function() { window.print(); return false; });";
523 $this->toolbar->addSeparator();
524 $this->toolbar->addComponent($button_print);
526 $group_panels_tpl =
new ilTemplate(
"tpl.exc_group_report_panels.html",
true,
true,
"Modules/Exercise");
527 $group_panels_tpl->setVariable(
'TITLE', $this->lng->txt(
"exc_list_text_assignment") .
": " . $this->assignment->getTitle());
539 $submission_data = $this->assignment->getExerciseMemberAssignmentData($file[
"user_id"], $this->filter[
"status"]);
541 if (is_array($submission_data)) {
542 $data = array_merge($feedback_data, $submission_data);
548 if ($total_reports == 0) {
549 $mtpl =
new ilTemplate(
"tpl.message.html",
true,
true,
"Services/Utilities");
550 $mtpl->setCurrentBlock(
"info_message");
551 $mtpl->setVariable(
"TEXT", $this->lng->txt(
"fiter_no_results"));
552 $mtpl->parseCurrentBlock();
553 $report_html .= $mtpl->get();
556 $group_panels_tpl->setVariable(
'CONTENT', $report_html);
557 $this->tpl->setContent($group_panels_tpl->get());
569 $group_panels_tpl =
new ilTemplate(
"tpl.exc_group_report_panels.html",
true,
true,
"Modules/Exercise");
570 $group_panels_tpl->setVariable(
'TITLE', $this->lng->txt(
"exc_compare_selected_submissions"));
576 foreach ($participants as $participant_id) {
577 $submission =
new ilExSubmission($this->assignment, $participant_id);
580 $file = reset($submission->getFiles());
584 "user_id" => $participant_id,
592 $submission_data = $this->assignment->getExerciseMemberAssignmentData($file[
"user_id"], $this->filter[
"status"]);
594 if (is_array($submission_data)) {
595 $data = array_merge($feedback_data, $submission_data);
601 $group_panels_tpl->setVariable(
'CONTENT', $report_html);
602 $this->tpl->setContent($group_panels_tpl->get());
609 $this->ctrl->setParameter($this,
"member_id", $a_data[
'uid']);
611 $this->ui_factory->button()->shy($this->lng->txt(
"grade_evaluate"),
"#")->withOnClick($modal->getShowSignal())
613 if ($this->exercise->hasTutorFeedbackMail()) {
614 $actions[] = $this->ui_factory->button()->shy(
615 $this->lng->txt(
"exc_tbl_action_feedback_mail"),
616 $this->ctrl->getLinkTarget($this,
"redirectFeedbackMail")
619 if ($this->exercise->hasTutorFeedbackFile()) {
620 $actions[] = $this->ui_factory->button()->shy(
621 $this->lng->txt(
"exc_tbl_action_feedback_file"),
622 $this->ctrl->getLinkTargetByClass(
"ilFileSystemGUI",
"listFiles")
626 $this->ctrl->setParameter($this,
"member_id",
"");
628 $actions_dropdown = $this->ui_factory->dropdown()->standard($actions);
630 if ($a_data[
'status'] == self::GRADE_NOT_GRADED) {
631 $str_status_key = $this->lng->txt(
'exc_tbl_status');
632 $str_status_value = $this->lng->txt(
'not_yet');
634 $str_status_key = $this->lng->txt(
'exc_tbl_status_time');
638 $str_mark_key = $this->lng->txt(
"exc_tbl_mark");
639 $str_mark_value = $this->lng->txt(
'not_yet');
641 if (($a_data[
'mark'] !=
"")) {
642 $str_mark_value = $a_data[
'mark'];
645 if ($a_data[
'feedback_time']) {
646 $str_evaluation_key = $this->lng->txt(
'exc_tbl_feedback_time');
649 $str_evaluation_key = $this->lng->txt(
'exc_settings_feedback');
650 $str_evaluation_value = $this->lng->txt(
'not_yet');
653 $card_content = array(
655 $str_status_key => $str_status_value,
656 $str_mark_key => $str_mark_value,
657 $str_evaluation_key => $str_evaluation_value,
658 $this->lng->txt(
'feedback_given') => $a_data[
'fb_given'],
659 $this->lng->txt(
'feedback_received') => $a_data[
'fb_received']
661 $card_tpl =
new ilTemplate(
"tpl.exc_report_details_card.html",
true,
true,
"Modules/Exercise");
662 foreach ($card_content as $key => $value) {
663 $card_tpl->setCurrentBlock(
"assingment_card");
664 $card_tpl->setVariable(
"ROW_KEY", $key);
665 $card_tpl->setVariable(
"ROW_VALUE", $value);
666 $card_tpl->parseCurrentBlock();
669 $main_panel = $this->ui_factory->panel()->sub($a_data[
'uname'], $this->ui_factory->legacy($a_data[
'utext']))
670 ->withCard($this->ui_factory->card()->standard($this->lng->txt(
'text_assignment'))->withSections(array($this->ui_factory->legacy($card_tpl->get()))))->withActions($actions_dropdown);
672 $feedback_tpl =
new ilTemplate(
"tpl.exc_report_feedback.html",
true,
true,
"Modules/Exercise");
674 if (array_key_exists(
"peer", $a_data) && ($this->filter[
"feedback"] == self::FEEDBACK_FULL_SUBMISSION) || $this->filter[
"feedback"] ==
"") {
675 $feedback_tpl->setCurrentBlock(
"feedback");
676 foreach ($a_data[
"peer"] as $peer_id) {
679 $peer_name =
$user->getFirstname() .
" " .
$user->getLastname();
681 $peer_name = $this->lng->txt(
"exc_deleted_user");
684 $feedback_tpl->setCurrentBlock(
"peer_feedback");
685 $feedback_tpl->setVariable(
"PEER_NAME", $peer_name);
687 $submission =
new ilExSubmission($this->assignment, $a_data[
"uid"]);
688 $values = $submission->getPeerReview()->getPeerReviewValues($peer_id, $a_data[
"uid"]);
691 foreach ($this->assignment->getPeerReviewCriteriaCatalogueItems() as $crit) {
692 $crit_id = $crit->getId()
695 $crit->setPeerReviewContext($this->assignment, $peer_id, $a_data[
"uid"]);
698 '<div class="ilBlockPropertyCaption">' . $crit->getTitle() .
'</div>' .
699 '<div style="margin:2px 0;">' . $crit->getHTML($values[$crit_id]) .
'</div>';
701 $feedback_tpl->setVariable(
"PEER_FEEDBACK", $review_html);
702 $feedback_tpl->parseCurrentBlock();
704 $feedback_tpl->parseCurrentBlock();
706 $feedback_tpl->setVariable(
"GRADE", $this->lng->txt(
'grade') .
": " . $this->lng->txt(
'exc_' . $a_data[
'status']));
707 $feedback_tpl->setVariable(
"COMMENT", $this->lng->txt(
'exc_comment') .
"<br>" . $a_data[
'comment']);
709 $feedback_panel = $this->ui_factory->panel()->sub(
"", $this->ui_factory->legacy($feedback_tpl->get()));
711 $report = $this->ui_factory->panel()->report(
"", array($main_panel, $feedback_panel));
713 return $this->ui_renderer->render([$modal,$report]);
718 $modal_tpl =
new ilTemplate(
"tpl.exc_report_evaluation_modal.html",
true,
true,
"Modules/Exercise");
719 $modal_tpl->setVariable(
"USER_NAME", $a_data[
'uname']);
722 $form->setFormAction($this->ctrl->getFormAction($this,
"saveEvaluationFromModal"));
723 $form->setId(uniqid(
'form'));
727 self::GRADE_NOT_GRADED => $this->lng->txt(
"exc_notgraded"),
728 self::GRADE_PASSED => $this->lng->txt(
"exc_passed"),
729 self::GRADE_FAILED => $this->lng->txt(
"exc_failed")
732 $si->setOptions($options);
733 $si->setValue($a_data[
'status']);
737 $mark_input =
new ilTextInputGUI($this->lng->txt(
"exc_tbl_mark"),
"mark");
738 $mark_input->setValue($a_data[
'mark']);
739 $mark_input->setMaxLength(32);
740 $mark_input->setSize(4);
741 $form->addItem($mark_input);
744 $item->setValue($a_data[
'uid']);
745 $form->addItem($item);
748 if ($this->exercise->hasTutorFeedbackText()) {
751 $u_text = strip_tags($a_data[
"utext"]);
754 if (strlen($u_text) > $max_chars) {
755 $text =
"<input type='checkbox' class='read-more-state' id='post-1' />";
756 $text .=
"<div class='read-more-wrap'>";
757 $text .= mb_substr($u_text, 0, $max_chars);
758 $text .=
"<span class='read-more-target'>";
759 $text .= mb_substr($u_text, $max_chars);
760 $text .=
"</span></div>";
761 $text .=
"<label for='post-1' class='read-more-trigger'></label>";
763 $modal_tpl->setVariable(
"USER_TEXT", $text);
766 $ta->
setInfo($this->lng->txt(
"exc_comment_for_learner_info"));
767 $ta->setValue($a_data[
'comment']);
772 $modal_tpl->setVariable(
"FORM", $form->getHTML());
774 $form_id =
'form_' . $form->getId();
775 $submit_btn = $this->ui_factory->button()->primary($this->lng->txt(
"save"),
'#')
777 return "$('#{$id}').click(function() { $('#{$form_id}').submit(); return false; });";
780 return $this->ui_factory->modal()->roundtrip(strtoupper($this->lng->txt(
"grade_evaluate")), $this->ui_factory->legacy($modal_tpl->get()))->withActionButtons([$submit_btn]);
789 $user_id = (int)
$_POST[
'mem_id'];
790 $grade = trim(
$_POST[
"grade"]);
791 $mark = trim(
$_POST[
'mark']);
793 if ($this->assignment->getId() && $user_id) {
794 $member_status = $this->assignment->getMemberStatus($user_id);
796 $member_status->setStatus($grade);
797 $member_status->setMark($mark);
799 $member_status->setFeedback(
true);
801 $member_status->update();
803 ilUtil::sendSuccess($this->lng->txt(
"exc_status_saved"),
true);
804 $this->ctrl->redirect($this,
"listTextAssignment");
812 if (!strlen(trim(
$_POST[
'user_login']))) {
817 $users = explode(
',',
$_POST[
'user_login']);
820 foreach ($users as
$user) {
828 $user_ids[] = $user_id;
843 if (!count($a_user_ids)) {
848 if (!$this->exercise->members_obj->assignMembers($a_user_ids)) {
867 ilUtil::sendSuccess($this->lng->txt(
"exc_members_assigned"),
true);
870 $this->ctrl->redirect($this,
"members");
895 $this->ctrl->setParameter($this,
"ass_id",
"");
899 $members = $this->exercise->members_obj->getMembers();
901 $members =
$GLOBALS[
'DIC']->access()->filterUserIdsByRbacOrPositionOfCurrentUser(
902 'edit_submissions_grades',
903 'edit_submissions_grades',
904 $this->exercise->getRefId(),
909 if (count($members) == 0) {
915 foreach ($members as $mem_id) {
918 if (trim(
$name[
"login"]) !=
"") {
919 $mems[$mem_id] =
$name;
926 if (
$_GET[
"part_id"] ==
"" && count($mems) > 0) {
927 $_GET[
"part_id"] = key($mems);
930 $current_participant =
$_GET[
"part_id"];
933 if (count($mems) > 1) {
935 foreach ($mems as $k => $m) {
937 $m[
"lastname"] .
", " . $m[
"firstname"] .
" [" . $m[
"login"] .
"]";
940 $si->setOptions($options);
941 $si->setValue($current_participant);
942 $ilToolbar->addStickyItem(
$si);
945 $button->setCaption(
"exc_select_part");
946 $button->setCommand(
"selectParticipant");
947 $ilToolbar->addStickyItem($button);
950 if (count($mems) > 0) {
951 $this->ctrl->setParameter($this,
"vw", self::VIEW_PARTICIPANT);
952 $this->ctrl->setParameter($this,
"part_id", $current_participant);
954 $ilToolbar->setFormAction(
$ilCtrl->getFormAction($this));
955 $ilToolbar->addFormButton(
$lng->txt(
"download_all_returned_files"),
"downloadSubmissions");
963 $tpl->setContent($part_tab->getHTML() .
973 $exc_tab->resetOffset();
974 $exc_tab->writeFilterToSession();
982 $exc_tab->resetOffset();
983 $exc_tab->resetFilter();
1010 $mems = $mem_obj->getMembers();
1012 $mems =
$GLOBALS[
'DIC']->access()->filterUserIdsByRbacOrPositionOfCurrentUser(
1013 'edit_submissions_grades',
1014 'edit_submissions_grades',
1015 $this->exercise->getRefId(),
1018 if (count($mems) > 0) {
1019 $ilToolbar->addButton(
1020 $lng->txt(
"exc_export_excel"),
1021 $ilCtrl->getLinkTarget($this,
"exportExcel")
1025 $this->ctrl->setParameter($this,
"vw", self::VIEW_GRADES);
1029 "showGradesOverview",
1033 $tpl->setContent($grades_tab->getHTML());
1043 if (
$_GET[
"member_id"] !=
"") {
1045 $members = $submission->getUserIds();
1047 $members = array_keys($members);
1052 foreach ($members as $user_id) {
1053 $member_status = $this->assignment->getMemberStatus($user_id);
1054 $member_status->setFeedback(
true);
1055 $member_status->update();
1059 $logins = implode(
",", $logins);
1062 $sig = chr(13) . chr(10) . chr(13) . chr(10);
1063 $sig .= $this->lng->txt(
'exc_mail_permanent_link');
1064 $sig .= chr(13) . chr(10) . chr(13) . chr(10);
1066 $sig = rawurlencode(base64_encode($sig));
1074 'rcp_to' => $logins,
1088 foreach ($this->exercise->members_obj->getMembers() as $member_id) {
1090 $submission->updateTutorDownloadTime();
1096 foreach ($submission->getFiles() as $file) {
1097 if ($this->assignment->getAssignmentType()->isSubmissionAssignedToTeam()) {
1098 $storage_id = $file[
"team_id"];
1100 $storage_id = $file[
"user_id"];
1103 $members[$storage_id][
"files"][$file[
"returned_id"]] = $file;
1105 if ($this->assignment->getAssignmentType()->isSubmissionAssignedToTeam()) {
1106 $name =
"Team " . $submission->getTeam()->getId();
1109 $name = $tmp_obj->getFirstname() .
" " . $tmp_obj->getLastname();
1111 if ($storage_id > 0) {
1112 $members[$storage_id][
"name"] =
$name;
1124 if ($this->assignment) {
1127 $this->ctrl->redirect($this,
"members");
1130 foreach (array_keys(
$_POST[
"member"]) as $user_id) {
1132 $tmembers = $submission->getUserIds();
1133 if (!(
bool) $a_keep_teams) {
1134 foreach ($tmembers as $tuser_id) {
1135 $members[$tuser_id] = 1;
1139 $members[] = $tmembers;
1142 $members[] = $user_id;
1151 $this->ctrl->redirect($this,
"showParticipant");
1154 $user_id =
$_GET[
"part_id"];
1156 foreach (array_keys(
$_POST[
"ass"]) as $ass_id) {
1158 $tmembers = $submission->getUserIds();
1159 if (!(
bool) $a_keep_teams) {
1160 foreach ($tmembers as $tuser_id) {
1161 $members[$ass_id][] = $tuser_id;
1165 $members[$ass_id][] = $tmembers;
1168 $members[$ass_id][] = $user_id;
1184 ilUtil::sendSuccess($this->lng->txt(
"exc_sent"),
true);
1185 if ($this->assignment) {
1186 $this->exercise->sendAssignment($this->assignment, array_keys($members));
1187 $this->ctrl->redirect($this,
"members");
1189 foreach ($members as $ass_id => $users) {
1190 $this->exercise->sendAssignment(
new ilExAssignment($ass_id), $users);
1192 $this->ctrl->setParameter($this,
"part_id",
$_GET[
"part_id"]);
1193 $this->ctrl->redirect($this,
"showParticipant");
1209 $cgui->setFormAction(
$ilCtrl->getFormAction($this));
1210 $cgui->setHeaderText(
$lng->txt(
"exc_msg_sure_to_deassign_participant"));
1211 $cgui->setCancel(
$lng->txt(
"cancel"),
"members");
1212 $cgui->setConfirm(
$lng->txt(
"remove"),
"deassignMembers");
1214 foreach ($members as $k => $m) {
1222 $tpl->setContent($cgui->getHTML());
1235 foreach (array_keys($members) as $usr_id) {
1236 $this->exercise->members_obj->deassignMember((
int) $usr_id);
1239 ilUtil::sendSuccess(
$lng->txt(
"exc_msg_participants_removed"),
true);
1240 $ilCtrl->redirect($this,
"members");
1251 if (!isset(
$_POST[
'comments_value'])) {
1255 $this->exercise->members_obj->setNoticeForMember(
1259 ilUtil::sendSuccess($this->lng->txt(
"exc_members_comments_saved"));
1270 $member_id = (int)
$_GET[
"part_id"];
1272 foreach (array_keys(
$_POST[
"id"]) as $ass_id) {
1273 if (is_array($a_selected) &&
1274 !in_array($ass_id, $a_selected)) {
1278 $data[$ass_id][$member_id] = array(
1282 if (array_key_exists(
"mark",
$_POST)) {
1285 if (array_key_exists(
"notice",
$_POST)) {
1290 $ilCtrl->setParameter($this,
"part_id", $member_id);
1297 $user_ids = (array) array_keys((array)
$_POST[
'id']);
1298 $filtered_user_ids =
$GLOBALS[
'DIC']->access()->filterUserIdsByRbacOrPositionOfCurrentUser(
1299 'edit_submissions_grades',
1300 'edit_submissions_grades',
1301 $this->exercise->getRefId(),
1306 foreach ($filtered_user_ids as $user_id) {
1307 if (is_array($a_selected) &&
1308 !in_array($user_id, $a_selected)) {
1312 $data[-1][$user_id] = array(
1316 if (array_key_exists(
"mark",
$_POST)) {
1319 if (array_key_exists(
"notice",
$_POST)) {
1330 if ($this->assignment) {
1344 $saved_for = array();
1345 foreach ($a_data as $ass_id => $users) {
1346 $ass = ($ass_id < 0)
1349 foreach ($users as $user_id => $values) {
1352 foreach ($submission->getUserIds() as $sub_user_id) {
1354 $saved_for[$sub_user_id] = $uname[
"lastname"] .
", " . $uname[
"firstname"];
1356 $member_status = $ass->getMemberStatus($sub_user_id);
1359 $status = $values[
"status"];
1360 if ($status ==
"") {
1361 $status = self::GRADE_NOT_GRADED;
1363 $member_status->setStatus($status);
1364 if (array_key_exists(
"mark", $values)) {
1365 $member_status->setMark($values[
"mark"]);
1367 if (array_key_exists(
"notice", $values)) {
1368 $member_status->setNotice($values[
"notice"]);
1370 $member_status->update();
1375 if (count($saved_for) > 0) {
1376 $save_for_str =
"(" . implode(
" - ", $saved_for) .
")";
1380 ilUtil::sendSuccess($this->lng->txt(
"exc_status_saved") .
" " . $save_for_str,
true);
1390 $res = array(
"result" =>
false);
1392 if ($this->ctrl->isAsynch()) {
1393 $ass_id = (int)
$_POST[
"ass_id"];
1394 $user_id = (int)
$_POST[
"mem_id"];
1397 if ($ass_id && $user_id) {
1399 $user_ids = $submission->getUserIds();
1402 $all_members = $all_members->getMembers();
1404 $reci_ids = array();
1405 foreach ($user_ids as $user_id) {
1406 if (in_array($user_id, $all_members)) {
1407 $member_status = $this->assignment->getMemberStatus($user_id);
1409 $member_status->setFeedback(
true);
1410 $member_status->update();
1413 $reci_ids[] = $user_id;
1418 if (
sizeof($reci_ids)) {
1420 $this->exercise->sendFeedbackFileNotification(
1428 $res = array(
"result" =>
true,
"snippet" => nl2br(
$comment));
1432 echo(json_encode(
$res));
1441 $this->exercise->exportGradesExcel();
1456 $new_members = array();
1458 foreach ($members as $group) {
1459 if (is_array($group)) {
1460 $new_members = array_merge($new_members, $group);
1462 $first_user = $group;
1463 $first_user = array_shift($first_user);
1465 foreach ($group as $user_id) {
1466 $team->removeTeamMember($user_id);
1469 $new_members[] = $group;
1473 if (
sizeof($new_members)) {
1476 $first_user = array_shift($new_members);
1478 if (
sizeof($new_members)) {
1479 foreach ($new_members as $user_id) {
1480 $team->addTeamMember($user_id);
1485 $submission =
new ilExSubmission($this->assignment, $first_user);
1486 $this->exercise->processExerciseStatus(
1488 $team->getMembers(),
1489 $submission->hasSubmitted(),
1490 $submission->validatePeerReviews()
1494 ilUtil::sendSuccess($this->lng->txt(
"msg_obj_modified"),
true);
1495 $ilCtrl->redirect($this,
"members");
1504 foreach ($members as $group) {
1506 if (is_array($group)) {
1509 $first_user = $group;
1510 $first_user = array_shift($first_user);
1512 foreach ($group as $user_id) {
1513 $team->removeTeamMember($user_id);
1517 $this->exercise->processExerciseStatus(
1525 ilUtil::sendSuccess($this->lng->txt(
"msg_obj_modified"),
true);
1526 $ilCtrl->redirect($this,
"members");
1536 $ilTabs->clearTargets();
1537 $ilTabs->setBackTarget(
1545 $tpl->setContent($a_form->getHTML());
1553 $form->setTitle(
$lng->txt(
"exc_adopt_group_teams") .
" - " . $this->assignment->getTitle());
1554 $form->setFormAction($this->ctrl->getFormAction($this,
"createTeamsFromGroups"));
1556 $all_members = array();
1558 if (
sizeof($group[
"members"])) {
1560 $grp_value = $options = array();
1561 foreach ($group[
"members"] as $user_id) {
1563 $options[$user_id] = $user_name;
1564 if (!in_array($user_id, $all_members)) {
1565 $grp_value[] = $user_id;
1566 $all_members[] = $user_id;
1570 foreach ($options as $user_id => $user_name) {
1573 $grp_team->setValue($grp_value);
1574 $form->addItem($grp_team);
1577 $grp_team->setValue(
$lng->txt(
"exc_adopt_group_teams_no_members"));
1578 $form->addItem($grp_team);
1582 if (
sizeof($all_members)) {
1583 $form->addCommandButton(
"createTeamsFromGroups",
$lng->txt(
"save"));
1585 $form->addCommandButton(
"members",
$lng->txt(
"cancel"));
1595 if ($form->checkInput()) {
1597 $all_members = $teams = array();
1599 foreach (array_keys($map) as $grp_id) {
1600 $postvar =
"grpt_" . $grp_id;
1601 $members =
$_POST[$postvar];
1602 if (is_array($members)) {
1603 $teams[] = $members;
1604 $invalid_team_members = array();
1606 foreach ($members as $user_id) {
1607 if (!array_key_exists($user_id, $all_members)) {
1608 $all_members[$user_id] = $grp_id;
1611 $invalid_team_members[] = $user_id;
1615 if (
sizeof($invalid_team_members)) {
1619 foreach ($invalid_team_members as $user_id) {
1621 $grp_title = $map[$all_members[$user_id]][
"title"];
1622 $alert[] = sprintf(
$lng->txt(
"exc_adopt_group_teams_conflict"), $user_name, $grp_title);
1624 $input = $form->getItemByPostVar($postvar);
1625 $input->setAlert(implode(
"<br/>", $alert));
1630 if (
sizeof($teams)) {
1634 $sum = array(
"added" => 0,
"blocked" => 0);
1635 foreach ($teams as $members) {
1636 foreach ($members as $user_id) {
1637 if (!$this->exercise->members_obj->isAssigned($user_id)) {
1638 $this->exercise->members_obj->assignMember($user_id);
1641 if (!in_array($user_id, $existing_users)) {
1648 $first = array_shift($members);
1654 if (
sizeof($members)) {
1655 foreach ($members as $user_id) {
1656 $team->addTeamMember($user_id);
1662 if ($sum[
"added"]) {
1663 $mess[] = sprintf(
$lng->txt(
"exc_adopt_group_teams_added"), $sum[
"added"]);
1665 if ($sum[
"blocked"]) {
1666 $mess[] = sprintf(
$lng->txt(
"exc_adopt_group_teams_blocked"), $sum[
"blocked"]);
1668 if ($sum[
"added"]) {
1669 ilUtil::sendSuccess(implode(
" ", $mess),
true);
1674 $this->ctrl->redirect($this,
"members");
1680 $form->setValuesByPost();
1694 $form->addCommandButton(
"uploadMultiFeedback",
$lng->txt(
"upload"));
1695 $form->addCommandButton(
"members",
$lng->txt(
"cancel"));
1700 $fi->setRequired(
true);
1701 $form->addItem($fi);
1704 $form->setFormAction($this->ctrl->getFormAction($this,
"uploadMultiFeedback"));
1727 $button->setCaption(
"exc_download_zip_structure");
1728 $button->setUrl($this->ctrl->getLinkTarget($this,
"downloadMultiFeedbackZip"));
1729 $button->setOmitPreventDoubleSubmission(
true);
1730 $ilToolbar->addButtonInstance($button);
1736 $tpl->setContent($a_form->getHTML());
1744 $this->assignment->sendMultiFeedbackStructureFile($this->exercise);
1754 if ($form->checkInput()) {
1757 $this->ctrl->redirect($this,
"showMultiFeedbackConfirmationTable");
1760 $this->ctrl->redirect($this,
"showMultiFeedback");
1764 $form->setValuesByPost();
1789 $this->assignment->clearMultiFeedbackDirectory();
1790 $this->ctrl->redirect($this,
"members");
1798 $this->assignment->saveMultiFeedbackFiles(
$_POST[
"file"], $this->exercise);
1800 ilUtil::sendSuccess($this->lng->txt(
"msg_obj_modified"),
true);
1801 $this->ctrl->redirect($this,
"members");
1816 $modal->setHeading(
$lng->txt(
"exc_individual_deadline"));
1817 $modal->setId(
"ilExcIDl");
1818 $modal->setBody(
'<div id="ilExcIDlBody"></div>');
1819 $modal = $modal->getHTML();
1821 $ajax_url = $this->ctrl->getLinkTarget($this,
"handleIndividualDeadlineCalls",
"",
true,
false);
1823 $tpl->addJavaScript(
"./Modules/Exercise/js/ilExcIDl.js",
true, 3);
1824 $tpl->addOnloadCode(
'il.ExcIDl.init("' . $ajax_url .
'");');
1836 foreach ($a_data as $item) {
1837 $item = explode(
"_", $item);
1839 $user_id = $item[1];
1841 if (!array_key_exists($ass_id, $ass_tmp)) {
1842 if ($this->assignment &&
1843 $ass_id == $this->assignment->getId()) {
1850 $map[$ass_id][] = $user_id;
1853 return array($map, $ass_tmp);
1861 $this->ctrl->saveParameter($this,
"part_id");
1864 if ((
bool)
$_GET[
"dn"]) {
1865 ilUtil::sendSuccess($this->lng->txt(
"settings_saved"),
true);
1866 $this->ctrl->redirect($this, $this->assignment
1868 :
"showParticipant");
1872 if ($_GET[
"idlid"]) {
1874 if (is_array($tmp)) {
1876 echo $form->getHTML() .
1877 $tpl->getOnLoadCodeForAsynch();
1883 foreach (array_keys(
$_POST) as $id) {
1884 if (substr($id, 0, 3) ==
"dl_") {
1885 $tmp[] = substr($id, 3);
1895 if (
$valid = $form->checkInput()) {
1896 foreach ($users as $ass_id => $users) {
1897 $ass = $ass_map[$ass_id];
1902 foreach ($users as $user_id) {
1903 $date_field = $form->getItemByPostVar(
"dl_" . $ass_id .
"_" . $user_id);
1908 $res[$ass_id][$user_id] = $date_field->getDate();
1915 $form->setValuesByPost();
1916 echo $form->getHTML() .
1917 $tpl->getOnLoadCodeForAsynch();
1919 foreach (
$res as $ass_id => $users) {
1920 $ass = $ass_map[$ass_id];
1922 foreach ($users as $id => $date) {
1923 $ass->setIndividualDeadline($id, $date);
1926 $ass->recalculateLateSubmissions();
1939 $form->setFormAction($this->ctrl->getFormAction($this));
1940 $form->setName(
"ilExcIDlForm");
1942 foreach ($ids as $ass_id => $users) {
1943 $ass = $a_ass_map[$ass_id];
1946 $section->setTitle($ass->getTitle());
1951 $values = $ass->getIndividualDeadlines();
1953 foreach ($users as $id) {
1955 if (is_numeric($id)) {
1962 $team_id = (int) substr($id, 1);
1963 if (array_key_exists($team_id, $teams)) {
1965 foreach ($teams[$team_id]->getMembers() as $member_id) {
1967 $name[] = $uname[
"lastname"] .
", " . $uname[
"firstname"];
1975 $dl->setShowTime(
true);
1976 $dl->setRequired(
true);
1977 $form->addItem($dl);
1979 if (array_key_exists($id, $values)) {
1985 $form->addCommandButton(
"", $this->lng->txt(
"save"));
1995 if ($this->assignment) {
2004 if (
$_POST[
"filter_status"]) {
2008 if (
$_POST[
"filter_feedback"]) {
2012 $this->lng->loadLanguageModule(
"search");
2014 $this->toolbar->setFormAction($this->ctrl->getFormAction($this,
"listTextAssignment"));
2018 if (
$_POST[
"filter_status"]) {
2022 $si_status =
new ilSelectInputGUI($this->lng->txt(
"exc_tbl_status"),
"filter_status");
2024 "" => $this->lng->txt(
"search_any"),
2025 self::GRADE_NOT_GRADED => $this->lng->txt(
"exc_notgraded"),
2026 self::GRADE_PASSED => $this->lng->txt(
"exc_passed"),
2027 self::GRADE_FAILED => $this->lng->txt(
"exc_failed")
2029 $si_status->setOptions($options);
2030 $si_status->setValue($this->filter[
"status"]);
2032 $si_feedback =
new ilSelectInputGUI($this->lng->txt(
"feedback"),
"filter_feedback");
2034 self::FEEDBACK_FULL_SUBMISSION => $this->lng->txt(
"submissions_feedback"),
2035 self::FEEDBACK_ONLY_SUBMISSION => $this->lng->txt(
"submissions_only")
2038 $si_feedback->setValue($this->filter[
"feedback"]);
2040 $this->toolbar->addInputItem($si_status,
true);
2044 if ($this->assignment->getPeerReview()) {
2045 if (
$_POST[
"filter_feedback"]) {
2048 $this->filter[
"feedback"] =
"submission_feedback";
2051 $si_feedback =
new ilSelectInputGUI($this->lng->txt(
"feedback"),
"filter_feedback");
2053 "submission_feedback" => $this->lng->txt(
"submissions_feedback"),
2054 "submission_only" => $this->lng->txt(
"submissions_only")
2057 $si_feedback->setValue($this->filter[
"feedback"]);
2059 $this->toolbar->addInputItem($si_feedback,
true);
2064 $submit->setCaption(
"filter");
2065 $submit->setCommand(
"listTextAssignment");
2066 $this->toolbar->addButtonInstance($submit);
2076 $ass_id = (int)
$_GET[
"ass_id"];
2077 $member_id = (int)
$_GET[
"member_id"];
2081 $last_opening = $submission->getLastOpeningHTMLView();
2083 $submission_time = $submission->getLastSubmission();
2089 list($obj_date, $obj_id) = explode(
"_", basename($zip_original_full_path));
2091 $obj_dir = $this->assignment->getAssignmentType()->getStringIdentifier() .
"_" . $obj_id;
2093 $index_html_file = ILIAS_WEB_DIR .
2094 DIRECTORY_SEPARATOR .
2096 DIRECTORY_SEPARATOR .
2097 dirname($zip_internal_path) .
2098 DIRECTORY_SEPARATOR .
2100 DIRECTORY_SEPARATOR .
2105 $web_filesystem = $DIC->filesystem()->web();
2107 if ($last_opening > $submission_time && $web_filesystem->has($index_html_file)) {
2110 if ($zip_original_full_path) {
2111 $file_copied = $this->
copyFileToWebDir($zip_original_full_path, $zip_internal_path);
2116 $web_filesystem->delete($zip_internal_path);
2119 $submission_repository->updateWebDirAccessTime($this->assignment->getId(), $member_id);
2124 $error_msg = $this->lng->txt(
"exc_copy_zip_error");
2128 $error_msg = $this->lng->txt(
"exc_find_zip_error");
2141 $submitted = $submission->
getFiles();
2143 if (count($submitted) > 0) {
2144 $submitted = array_pop($submitted);
2146 return $submitted[
'filename'];
2158 protected function copyFileToWebDir(
string $origin_path_filename,
string $internal_file_path) : ?string
2162 $web_filesystem = $DIC->filesystem()->web();
2163 $data_filesystem = $DIC->filesystem()->storage();
2165 $internal_dirs = dirname($internal_file_path);
2166 $zip_file = basename($internal_file_path);
2168 if ($data_filesystem->has($internal_file_path)) {
2169 if (!$web_filesystem->hasDir($internal_dirs)) {
2170 $web_filesystem->createDir($internal_dirs);
2173 if (!$web_filesystem->has($internal_file_path)) {
2174 $stream = $data_filesystem->readStream($internal_file_path);
2175 $web_filesystem->writeStream($internal_file_path, $stream);
2177 return ILIAS_ABSOLUTE_PATH .
2178 DIRECTORY_SEPARATOR .
2180 DIRECTORY_SEPARATOR .
2182 DIRECTORY_SEPARATOR .
2184 DIRECTORY_SEPARATOR .
2199 list($external_path, $internal_file_path) = explode(CLIENT_ID .
"/", $external_file_path);
2201 return $internal_file_path;
2210 $this->tabs_gui->clearTargets();
2211 $this->tabs_gui->setBackTarget(
2212 $this->lng->txt(
"back"),
2213 $this->ctrl->getLinkTarget($this,
"members")
2224 $uname =
$user->getFirstname() .
" " .
$user->getLastname();
2227 "uid" => $a_data[
"user_id"],
2229 "udate" => $a_data[
"ts"],
2235 $data[
"peer"] = array();
2236 foreach ($peer_review->getPeerReviewsByPeerId($a_data[
'user_id']) as $key => $value) {
2237 $data[
"peer"][] = $value[
'giver_id'];
2241 $data[
"fb_given"] = $peer_review->countGivenFeedback(
true, $a_data[
"user_id"]);
initMultiFeedbackForm($a_ass_id)
addMembersObject($a_user_ids=array())
Add new partipant.
static _lookupLogin($a_user_id)
lookup login
static sortArray( $array, $a_array_sortby, $a_array_sortorder=0, $a_numeric=false, $a_keep_keys=false)
sortArray
static _lookupName($a_user_id)
lookup user name
showParticipantObject()
Show Participant.
deassignMembersObject()
Deassign members from exercise.
showGradesOverviewObject()
Show grades overview.
static getAssignmentDataOfExercise($a_exc_id)
Get assignments data of an exercise in an array.
This class represents an option in a checkbox group.
exportExcelObject()
Export as excel.
static getAdoptableGroups($a_exc_ref_id)
static getGroupMembersMap($a_exc_ref_id)
static initDateTimePicker()
createTeamsFromGroupsObject()
static getAssignmentTeamMap($a_ass_id)
Get team structure for assignment.
static _exists($a_id, $a_reference=false, $a_type=null)
checks if an object exists in object_data
static getInstancesFromMap($a_assignment_id)
saveStatusParticipantObject(array $a_selected=null)
Save assignment status (participant view)
getMultiActionUserIds($a_keep_teams=false)
static _before(ilDateTime $start, ilDateTime $end, $a_compare_field='', $a_tz='')
compare two dates and check start is before end This method does not consider tz offsets.
parseIndividualDeadlineData(array $a_data)
Exercise participant table.
saveStatusAllObject(array $a_selected=null, $a_redirect=true)
resetOffset($a_in_determination=false)
Reset offset.
static unzip($a_file, $overwrite=false, $a_flat=false)
unzip file
static downloadAllAssignmentFiles(ilExAssignment $a_ass, array $members, $to_path)
Download all submitted files of an assignment (all user)
getWebFilePathFromExternalFilePath(string $external_file_path)
Get the object specific file path from an external full file path.
static _lookupId($a_user_str)
Lookup id by login.
openSubmissionViewObject()
Open HTML view for portfolio submissions.
downloadSubmissionsObject()
showMultiFeedbackObject(ilPropertyFormGUI $a_form=null)
Show multi-feedback screen.
addUserFromAutoCompleteObject()
Add user as member.
Class ilExerciseMembersFilter.
deleteUserSubmissionDirectory(int $user_id)
filterParticipantsByAccess()
Filter manageable members by position or rbac access.
static _replaceMediaObjectImageSrc($a_text, $a_direction=0, $nic=IL_INST_ID)
Replaces image source from mob image urls with the mob id or replaces mob id with the correct image s...
static formatDate(ilDateTime $date, $a_skip_day=false, $a_include_wd=false, $include_seconds=false)
Format a date public.
static getAssignmentParticipants(int $a_exercise_id, int $a_ass_id)
showParticipantResetObject()
selectParticipantObject()
Select participant.
static sendInfo($a_info="", $a_keep=false)
Send Info Message to Screen.
static signFolderOfStartFile($start_file_path)
setTableId($a_val)
Set table id.
redirectFeedbackMailObject()
set feedback status for member and redirect to mail screen
compareTextAssignmentsObject()
TODO -> Deal with the redirection after update the grade via action button.
handleIndividualDeadlineCallsObject()
saveStatus(array $a_data, $a_redirect=true)
Save status of selecte members.
addSubTabs($a_activate)
adds tabs to tab gui object
foreach($_POST as $key=> $value) $res
Download submissions and feedback for exercises.
getEvaluationModal($a_data)
static getInstanceByUserId($a_assignment_id, $a_user_id, $a_create_on_demand=false)
uploadMultiFeedbackObject()
Upload multi feedback file.
static getInstancesByExercise($a_exc_id)
if(!defined('PATH_SEPARATOR')) $GLOBALS['_PEAR_default_error_mode']
copyFileToWebDir(string $origin_path_filename, string $internal_file_path)
Generate the directories and copy the file if necessary.
downloadMultiFeedbackZipObject()
Download multi-feedback structrue file.
removeUserSubmissionFilesFromWebDir(int $user_id)
static stripSlashes($a_str, $a_strip_html=true, $a_allow="")
strip slashes if magic qoutes is enabled
static getNamePresentation( $a_user_id, $a_user_image=false, $a_profile_link=false, $a_profile_back_link="", $a_force_first_lastname=false, $a_omit_login=false, $a_sortable=true, $a_return_data_array=false, $a_ctrl_path="ilpublicuserprofilegui")
Default behaviour is:
selectAssignmentObject()
Select assignment.
showParticipantApplyObject()
static getAssignmentFilesByUsers(int $a_exc_id, int $a_ass_id, array $a_users)
static getInstanceByObjId($a_obj_id, $stop_on_error=true)
get an instance of an Ilias object by object id
static _lookupType($a_id, $a_reference=false)
lookup object type
saveGradesObject()
Save grades.
static sendFailure($a_info="", $a_keep=false)
Send Failure Message to Screen.
listTextAssignmentObject()
todo: Pagination.
static stripSlashesArray($a_arr, $a_strip_html=true, $a_allow="")
Strip slashes from array.
Class ilExerciseManagementGUI.
confirmDeassignMembersObject()
Confirm deassigning members.
static getInstance()
Get instance.
cancelMultiFeedbackObject()
Cancel Multi Feedback.
sendMembersObject()
Send assignment per mail to participants.
collectFeedbackDataFromPeer(array $a_data)
This class represents a non editable value in a property form.
create()
Create directory.
membersObject()
All participants and submission of one assignment.
initIndividualDeadlineModal()
saveEvaluationFromModalObject()
Save assignment submission grade(status) and comment from the roundtrip modal.
saveCommentForLearnersObject()
Save comment for learner (asynch)
getSubmissionZipFilePath(ilExSubmission $submission)
Returns the ZIP file path from outside web directory.
This class represents a text area property in a property form.
$a
thx to https://mlocati.github.io/php-cs-fixer-configurator for the examples
adoptTeamsFromGroupObject(ilPropertyFormGUI $a_form=null)
const FEEDBACK_ONLY_SUBMISSION
showMultiFeedbackConfirmationTableObject()
Show multi feedback confirmation table.
Exercise submission //TODO: This class has to much static methods related to delivered "files"...
static getLogger($a_component_id)
Get component logger.
static fillAutoCompleteToolbar($parent_object, ilToolbarGUI $toolbar=null, $a_options=array(), $a_sticky=false)
fill toolbar with
saveMultiFeedbackObject()
Save multi feedback.
File System Explorer GUI class.
static redirect($a_script)
saveStatusSelectedObject()
Exercise participant table.
getFiles(array $a_file_ids=null, $a_only_valid=false, $a_min_timestamp=null)
Get submission items (not only files)
__construct(ilExerciseInternalService $service, ilExAssignment $a_ass=null)
Constructor.
static _getLink($a_ref_id, $a_type='', $a_params=array(), $append="")
Object-based submissions (ends up as static file)
initIndividualDeadlineForm(array $a_ass_map, array $ids)
static lookupTitle($a_id)
Lookup title.
const FEEDBACK_FULL_SUBMISSION
downloadAllObject()
Download all submitted files (of all members).
setIndividualDeadlineObject()
Confirmation screen class.
withOnLoadCode(\Closure $binder)
Exercise exceptions class.