4 include_once
"Modules/Exercise/classes/class.ilExSubmission.php";
5 include_once
"Modules/Exercise/classes/class.ilExSubmissionBaseGUI.php";
91 $this->ui_factory = $DIC->ui()->factory();
92 $this->ui_renderer = $DIC->ui()->renderer();
93 $this->
user = $DIC->user();
94 $this->toolbar = $DIC->toolbar();
96 $this->ctrl = $DIC->ctrl();
97 $this->tabs_gui = $DIC->tabs();
98 $this->lng = $DIC->language();
99 $this->tpl = $DIC[
"tpl"];
101 $this->task_factory = $DIC->backgroundTasks()->taskFactory();
104 $this->exercise = $a_exercise;
106 $this->assignment = $a_ass;
107 $this->ass_id = $this->assignment->
getId();
110 $this->ctrl->saveParameter($this, array(
"vw",
"member_id"));
119 $class =
$ilCtrl->getNextClass($this);
123 case "ilfilesystemgui":
124 $ilTabs->clearTargets();
125 $ilTabs->setBackTarget(
132 include_once(
"./Modules/Exercise/classes/class.ilFSStorageExercise.php");
137 $feedback_id = $submission->getFeedbackId();
138 $noti_rec_ids = $submission->getUserIds();
140 include_once(
"./Services/User/classes/class.ilUserUtil.php");
142 foreach ($noti_rec_ids as $rec_id) {
145 $fs_title = implode(
" / ", $fs_title);
147 include_once(
"./Services/FileSystem/classes/class.ilFileSystemGUI.php");
148 $fs_gui =
new ilFileSystemGUI($fstorage->getFeedbackPath($feedback_id));
149 $fs_gui->
setTableId(
"excfbfil" . $this->assignment->getId() .
"_" . $feedback_id);
150 $fs_gui->setAllowDirectories(
false);
151 $fs_gui->setTitle(
$lng->txt(
"exc_fb_files") .
" - " .
152 $this->assignment->getTitle() .
" - " .
154 $pcommand = $fs_gui->getLastPerformedCommand();
155 if (is_array($pcommand) && $pcommand[
"cmd"] ==
"create_file") {
156 foreach ($noti_rec_ids as $user_id) {
157 $member_status = $this->assignment->getMemberStatus($user_id);
158 $member_status->setFeedback(
true);
159 $member_status->update();
162 $this->exercise->sendFeedbackFileNotification(
165 $this->assignment->getId()
168 $this->ctrl->forwardCommand($fs_gui);
171 case 'ilrepositorysearchgui':
172 include_once(
'./Services/Search/classes/class.ilRepositorySearchGUI.php');
174 $ref_id = $this->exercise->getRefId();
175 $rep_search->addUserAccessFilterCallable(
function ($a_user_ids) use ($ref_id) {
176 return $GLOBALS[
'DIC']->access()->filterUserIdsByRbacOrPositionOfCurrentUser(
177 'edit_submissions_grades',
178 'edit_submissions_grades',
183 $rep_search->setTitle($this->lng->txt(
"exc_add_participant"));
184 $rep_search->setCallback($this,
'addMembersObject');
188 $this->ctrl->setReturn($this,
'members');
190 $this->ctrl->forwardCommand($rep_search);
193 case "ilexsubmissionteamgui":
194 include_once
"Modules/Exercise/classes/class.ilExSubmissionTeamGUI.php";
199 case "ilexsubmissionfilegui":
200 include_once
"Modules/Exercise/classes/class.ilExSubmissionFileGUI.php";
205 case "ilexsubmissiontextgui":
206 $ilCtrl->saveParameter($this, array(
"part_id"));
207 include_once
"Modules/Exercise/classes/class.ilExSubmissionTextGUI.php";
212 case "ilexpeerreviewgui":
213 include_once
"Modules/Exercise/classes/class.ilExPeerReviewGUI.php";
221 case 'downloadSubmissions':
222 $cmd =
$ilCtrl->getCmd(
"downloadSubmissions");
225 $cmd =
$ilCtrl->getCmd(
"listPublicSubmissions");
228 $this->{$cmd .
"Object"}();
235 switch ($_REQUEST[
"vw"]) {
236 case self::VIEW_PARTICIPANT:
237 $back_cmd =
"showParticipant";
240 case self::VIEW_GRADES:
241 $back_cmd =
"showGradesOverview";
246 $back_cmd =
"members";
255 $this->ctrl->setReturn($this, $back_cmd);
257 $this->tabs_gui->clearTargets();
258 $this->tabs_gui->setBackTarget(
259 $this->lng->txt(
"back"),
260 $this->ctrl->getLinkTarget($this, $back_cmd)
263 include_once
"Modules/Exercise/classes/class.ilExSubmission.php";
264 return new ilExSubmission($this->assignment, $_REQUEST[
"member_id"], null,
true);
278 $ass_id =
$_GET[
"ass_id"];
279 $part_id =
$_GET[
"part_id"];
281 $ilCtrl->setParameter($this,
"vw",
"");
282 $ilCtrl->setParameter($this,
"member_id",
"");
283 $ilCtrl->setParameter($this,
"ass_id",
"");
284 $ilCtrl->setParameter($this,
"part_id",
"");
288 $lng->txt(
"exc_assignment_view"),
289 $ilCtrl->getLinkTarget($this,
"members")
293 $lng->txt(
"exc_participant_view"),
294 $ilCtrl->getLinkTarget($this,
"showParticipant")
298 $lng->txt(
"exc_grades_overview"),
299 $ilCtrl->getLinkTarget($this,
"showGradesOverview")
301 $ilTabs->activateSubTab($a_activate);
303 $ilCtrl->setParameter($this,
"ass_id", $ass_id);
304 $ilCtrl->setParameter($this,
"part_id", $part_id);
312 $ilCtrl->setParameterByClass(
"ilExSubmissionFileGUI",
"member_id", (
int)
$_GET[
"member_id"]);
313 $url =
$ilCtrl->getLinkTargetByClass(array(
"ilRepositoryGUI",
"ilExerciseHandlerGUI",
"ilObjExerciseGUI",
"ilExerciseManagementGUI",
"ilExSubmissionFileGUI"),
"downloadNewReturned");
314 $js_url =
$ilCtrl->getLinkTargetByClass(array(
"ilRepositoryGUI",
"ilExerciseHandlerGUI",
"ilObjExerciseGUI",
"ilExerciseManagementGUI",
"ilExSubmissionFileGUI"),
"downloadNewReturned",
"",
"",
false);
315 ilUtil::sendInfo(
$lng->txt(
"exc_wait_for_files") .
"<a href='$url'> " .
$lng->txt(
'exc_download_files') .
"</a><script>window.location.href ='" . $js_url .
"';</script>");
329 include_once
'Services/Tracking/classes/class.ilLPMarks.php';
334 include_once(
"./Modules/Exercise/classes/class.ilExAssignment.php");
337 if (!$this->assignment) {
338 $this->assignment = current($ass);
342 if (count($ass) > 1) {
344 foreach ($ass as $a) {
345 $options[$a->getId()] = $a->getTitle();
347 include_once(
"./Services/Form/classes/class.ilSelectInputGUI.php");
350 $si->setValue($this->assignment->getId());
351 $ilToolbar->addStickyItem(
$si);
353 include_once(
"./Services/UIComponent/Button/classes/class.ilSubmitButton.php");
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) {
375 include_once
'./Services/Search/classes/class.ilRepositorySearchGUI.php';
380 'auto_complete_name' =>
$lng->txt(
'user'),
381 'submit_name' =>
$lng->txt(
'add'),
382 'add_search' =>
true,
383 'add_from_container' => $this->exercise->getRefId()
389 if (count($ass) > 0) {
390 if ($has_rbac_access) {
391 $ilToolbar->addSeparator();
395 $ilToolbar->setFormAction(
$ilCtrl->getFormAction($this));
397 $ilCtrl->setParameter($this,
"ass_id", $this->assignment->getId());
400 include_once(
"./Modules/Exercise/classes/class.ilExAssignmentTeam.php");
402 $ilToolbar->addButton(
403 $this->lng->txt(
"exc_adopt_group_teams"),
404 $this->ctrl->getLinkTarget($this,
"adoptTeamsFromGroup")
407 $ilToolbar->addSeparator();
409 } elseif ($this->exercise->hasTutorFeedbackFile()) {
410 if (!$this->assignment->getAssignmentType()->usesTeams()) {
412 $ilToolbar->addButton(
413 $this->lng->txt(
"exc_multi_feedback"),
414 $this->ctrl->getLinkTarget($this,
"showMultiFeedback")
417 $ilToolbar->addSeparator();
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);
431 include_once(
"./Modules/Exercise/classes/class.ilExerciseMemberTableGUI.php");
434 $exc_tab->getHTML() .
441 $ilCtrl->setParameter($this,
"ass_id",
"");
448 include_once
'./Modules/Exercise/classes/BackgroundTasks/class.ilDownloadSubmissionsBackgroundTask.php';
450 $participant_id = $_REQUEST[
'part_id'];
454 (
int) $this->exercise->getRefId(),
455 (int) $this->exercise->getId(),
457 (
int) $participant_id
460 if ($download_task->run()) {
461 ilUtil::sendSuccess($this->lng->txt(
'exc_down_files_started_bg'),
true);
464 if ($this->assignment) {
465 $this->ctrl->redirect($this,
"members");
467 $this->ctrl->redirect($this,
"showParticipant");
474 include_once(
"./Modules/Exercise/classes/class.ilExerciseMemberTableGUI.php");
477 $exc_tab->writeFilterToSession();
484 include_once(
"./Modules/Exercise/classes/class.ilExerciseMemberTableGUI.php");
487 $exc_tab->resetFilter();
500 include_once
'Services/Tracking/classes/class.ilLPMarks.php';
502 if (is_array(
$_POST[
"lcomment"])) {
503 foreach (
$_POST[
"lcomment"] as $k => $v) {
504 $marks_obj =
new ilLPMarks($this->exercise->getId(), (int) $k);
507 $marks_obj->update();
510 ilUtil::sendSuccess(
$lng->txt(
"exc_msg_saved_grades"),
true);
511 $ilCtrl->redirect($this,
"showGradesOverview");
525 $this->tabs_gui->clearTargets();
526 $this->tabs_gui->setBackTarget(
527 $this->lng->txt(
"back"),
528 $this->ctrl->getLinkTarget($this,
"members")
531 $button_print = $this->ui_factory->button()->standard($this->lng->txt(
'print'),
"#")
533 return "$('#{$id}').click(function() { window.print(); return false; });";
535 $this->toolbar->addSeparator();
536 $this->toolbar->addComponent($button_print);
540 $peer_data = $peer_review->getAllPeerReviews();
542 include_once
"Services/User/classes/class.ilUserUtil.php";
543 include_once
"Services/RTE/classes/class.ilRTE.php";
547 $report_title = $this->lng->txt(
"exc_list_text_assignment") .
": " . $this->assignment->getTitle();
548 $report_html .=
"<h1>" . $report_title .
"</h1>";
558 $uname =
$user->getFirstname() .
" " .
$user->getLastname();
560 "uid" => $file[
"user_id"],
562 "udate" => $file[
"ts"],
566 if (isset($peer_data[$file[
"user_id"]])) {
567 $data[
"peer"] = array_keys($peer_data[$file[
"user_id"]]);
570 $data[
"fb_received"] = (is_array(
$data[
"peer"]))
571 ? count(
$data[
"peer"])
573 $data[
"fb_given"] = $peer_review->countGivenFeedback(
true, $file[
"user_id"]);
575 $submission_data = $this->assignment->getExerciseMemberAssignmentData($file[
"user_id"], $this->filter[
"status"]);
577 if (is_array($submission_data)) {
584 if ($total_reports == 0) {
585 $mtpl =
new ilTemplate(
"tpl.message.html",
true,
true,
"Services/Utilities");
586 $mtpl->setCurrentBlock(
"info_message");
587 $mtpl->setVariable(
"TEXT", $this->lng->txt(
"fiter_no_results"));
588 $mtpl->parseCurrentBlock();
589 $report_html .= $mtpl->get();
592 $this->tpl->setContent($report_html);
599 $this->ctrl->setParameter($this,
"member_id", $a_data[
'uid']);
601 $this->ui_factory->button()->shy($this->lng->txt(
"grade_evaluate"),
"#")->withOnClick($modal->getShowSignal())
603 if ($this->exercise->hasTutorFeedbackMail()) {
604 $actions[] = $this->ui_factory->button()->shy(
605 $this->lng->txt(
"exc_tbl_action_feedback_mail"),
606 $this->ctrl->getLinkTarget($this,
"redirectFeedbackMail")
609 if ($this->exercise->hasTutorFeedbackFile()) {
610 $actions[] = $this->ui_factory->button()->shy(
611 $this->lng->txt(
"exc_tbl_action_feedback_file"),
612 $this->ctrl->getLinkTargetByClass(
"ilFileSystemGUI",
"listFiles")
616 $this->ctrl->setParameter($this,
"member_id",
"");
618 $actions_dropdown = $this->ui_factory->dropdown()->standard($actions);
620 if ($a_data[
'status'] == self::GRADE_NOT_GRADED) {
621 $str_status_key = $this->lng->txt(
'exc_tbl_status');
622 $str_status_value = $this->lng->txt(
'not_yet');
624 $str_status_key = $this->lng->txt(
'exc_tbl_status_time');
628 $str_mark_key = $this->lng->txt(
"exc_tbl_mark");
629 $str_mark_value = $this->lng->txt(
'not_yet');
631 if (($a_data[
'mark'] !=
"")) {
632 $str_mark_value = $a_data[
'mark'];
635 if ($a_data[
'feedback_time']) {
636 $str_evaluation_key = $this->lng->txt(
'exc_tbl_feedback_time');
639 $str_evaluation_key = $this->lng->txt(
'exc_settings_feedback');
640 $str_evaluation_value = $this->lng->txt(
'not_yet');
643 $card_content = array(
645 $str_status_key => $str_status_value,
646 $str_mark_key => $str_mark_value,
647 $str_evaluation_key => $str_evaluation_value,
648 $this->lng->txt(
'feedback_given') => $a_data[
'fb_given'],
649 $this->lng->txt(
'feedback_received') => $a_data[
'fb_received']
651 $card_tpl =
new ilTemplate(
"tpl.exc_report_details_card.html",
true,
true,
"Modules/Exercise");
652 foreach ($card_content as
$key => $value) {
653 $card_tpl->setCurrentBlock(
"assingment_card");
654 $card_tpl->setVariable(
"ROW_KEY",
$key);
655 $card_tpl->setVariable(
"ROW_VALUE", $value);
656 $card_tpl->parseCurrentBlock();
659 $main_panel = $this->ui_factory->panel()->sub($a_data[
'uname'], $this->ui_factory->legacy($a_data[
'utext']))
660 ->withCard($this->ui_factory->card()->standard($this->lng->txt(
'text_assignment'))->withSections(array($this->ui_factory->legacy($card_tpl->get()))))->withActions($actions_dropdown);
662 $feedback_tpl =
new ilTemplate(
"tpl.exc_report_feedback.html",
true,
true,
"Modules/Exercise");
663 if (array_key_exists(
"peer", $a_data) && $this->filter[
"feedback"] ==
"submission_feedback") {
664 $feedback_tpl->setCurrentBlock(
"feedback");
665 foreach ($a_data[
"peer"] as $peer_id) {
668 $peer_name =
$user->getFirstname() .
" " .
$user->getLastname();
670 $peer_name = $this->lng->txt(
"exc_deleted_user");
673 $feedback_tpl->setCurrentBlock(
"peer_feedback");
674 $feedback_tpl->setVariable(
"PEER_NAME", $peer_name);
676 $submission =
new ilExSubmission($this->assignment, $a_data[
"uid"]);
677 $values = $submission->getPeerReview()->getPeerReviewValues($peer_id, $a_data[
"uid"]);
680 foreach ($this->assignment->getPeerReviewCriteriaCatalogueItems() as $crit) {
681 $crit_id = $crit->getId()
684 $crit->setPeerReviewContext($this->assignment, $peer_id, $a_data[
"uid"]);
687 '<div class="ilBlockPropertyCaption">' . $crit->getTitle() .
'</div>' .
688 '<div style="margin:2px 0;">' . $crit->getHTML(
$values[$crit_id]) .
'</div>';
690 $feedback_tpl->setVariable(
"PEER_FEEDBACK", $review_html);
691 $feedback_tpl->parseCurrentBlock();
693 $feedback_tpl->parseCurrentBlock();
695 $feedback_tpl->setVariable(
"GRADE", $this->lng->txt(
'grade') .
": " . $this->lng->txt(
'exc_' . $a_data[
'status']));
696 $feedback_tpl->setVariable(
"COMMENT", $this->lng->txt(
'exc_comment') .
"<br>" . $a_data[
'comment']);
698 $feedback_panel = $this->ui_factory->panel()->sub(
"", $this->ui_factory->legacy($feedback_tpl->get()));
700 $report = $this->ui_factory->panel()->report(
"", array($main_panel, $feedback_panel));
702 return $this->ui_renderer->render([$modal,$report]);
707 $modal_tpl =
new ilTemplate(
"tpl.exc_report_evaluation_modal.html",
true,
true,
"Modules/Exercise");
708 $modal_tpl->setVariable(
"USER_NAME", $a_data[
'uname']);
711 $form->setFormAction($this->ctrl->getFormAction($this,
"saveEvaluationFromModal"));
712 $form->setId(uniqid(
'form'));
716 self::GRADE_NOT_GRADED => $this->lng->txt(
"exc_notgraded"),
717 self::GRADE_PASSED => $this->lng->txt(
"exc_passed"),
718 self::GRADE_FAILED => $this->lng->txt(
"exc_failed")
722 $si->setValue($a_data[
'status']);
726 $mark_input =
new ilTextInputGUI($this->lng->txt(
"exc_tbl_mark"),
"mark");
727 $mark_input->
setValue($a_data[
'mark']);
728 $mark_input->setMaxLength(32);
729 $mark_input->setSize(4);
730 $form->addItem($mark_input);
733 $item->setValue($a_data[
'uid']);
734 $form->addItem($item);
737 if ($this->exercise->hasTutorFeedbackText()) {
740 $u_text = strip_tags($a_data[
"utext"]);
743 if (strlen($u_text) > $max_chars) {
744 $text =
"<input type='checkbox' class='read-more-state' id='post-1' />";
745 $text .=
"<div class='read-more-wrap'>";
746 $text .= mb_substr($u_text, 0, $max_chars);
747 $text .=
"<span class='read-more-target'>";
748 $text .= mb_substr($u_text, $max_chars);
749 $text .=
"</span></div>";
750 $text .=
"<label for='post-1' class='read-more-trigger'></label>";
752 $modal_tpl->setVariable(
"USER_TEXT",
$text);
755 $ta->
setInfo($this->lng->txt(
"exc_comment_for_learner_info"));
756 $ta->setValue($a_data[
'comment']);
761 $modal_tpl->setVariable(
"FORM",
$form->getHTML());
763 $form_id =
'form_' .
$form->getId();
764 $submit_btn = $this->ui_factory->button()->primary($this->lng->txt(
"save"),
'#')
766 return "$('#{$id}').click(function() { $('#{$form_id}').submit(); return false; });";
769 return $this->ui_factory->modal()->roundtrip(strtoupper($this->lng->txt(
"grade_evaluate")), $this->ui_factory->legacy($modal_tpl->get()))->withActionButtons([$submit_btn]);
778 $user_id = (int)
$_POST[
'mem_id'];
779 $grade = trim(
$_POST[
"grade"]);
780 $mark = trim(
$_POST[
'mark']);
782 if ($this->assignment->getId() && $user_id) {
783 $member_status = $this->assignment->getMemberStatus($user_id);
785 $member_status->setStatus($grade);
786 $member_status->setMark($mark);
788 $member_status->setFeedback(
true);
790 $member_status->update();
792 ilUtil::sendSuccess($this->lng->txt(
"exc_status_saved"),
true);
793 $this->ctrl->redirect($this,
"listTextAssignment");
801 if (!strlen(trim(
$_POST[
'user_login']))) {
817 $user_ids[] = $user_id;
832 if (!count($a_user_ids)) {
837 if (!$this->exercise->members_obj->assignMembers($a_user_ids)) {
857 ilUtil::sendSuccess($this->lng->txt(
"exc_members_assigned"),
true);
860 $this->ctrl->redirect($this,
"members");
885 $this->ctrl->setParameter($this,
"ass_id",
"");
888 include_once(
"./Modules/Exercise/classes/class.ilExAssignment.php");
890 $members = $this->exercise->members_obj->getMembers();
892 $members =
$GLOBALS[
'DIC']->access()->filterUserIdsByRbacOrPositionOfCurrentUser(
893 'edit_submissions_grades',
894 'edit_submissions_grades',
895 $this->exercise->getRefId(),
900 if (count($members) == 0) {
906 foreach ($members as $mem_id) {
908 include_once(
"./Services/User/classes/class.ilObjUser.php");
910 if (trim(
$name[
"login"]) !=
"") {
911 $mems[$mem_id] =
$name;
918 if (
$_GET[
"part_id"] ==
"" && count($mems) > 0) {
919 $_GET[
"part_id"] = key($mems);
922 $current_participant =
$_GET[
"part_id"];
925 if (count($mems) > 1) {
927 foreach ($mems as $k =>
$m) {
929 $m[
"lastname"] .
", " .
$m[
"firstname"] .
" [" .
$m[
"login"] .
"]";
931 include_once(
"./Services/Form/classes/class.ilSelectInputGUI.php");
934 $si->setValue($current_participant);
935 $ilToolbar->addStickyItem(
$si);
937 include_once(
"./Services/UIComponent/Button/classes/class.ilSubmitButton.php");
939 $button->setCaption(
"exc_select_part");
940 $button->setCommand(
"selectParticipant");
941 $ilToolbar->addStickyItem($button);
944 if (count($mems) > 0) {
945 $this->ctrl->setParameter($this,
"vw", self::VIEW_PARTICIPANT);
946 $this->ctrl->setParameter($this,
"part_id", $current_participant);
948 $ilToolbar->setFormAction(
$ilCtrl->getFormAction($this));
949 $ilToolbar->addFormButton(
$lng->txt(
"download_all_returned_files"),
"downloadSubmissions");
951 include_once(
"./Modules/Exercise/classes/class.ilExParticipantTableGUI.php");
958 $tpl->setContent($part_tab->getHTML() .
967 include_once(
"./Modules/Exercise/classes/class.ilExParticipantTableGUI.php");
969 $exc_tab->resetOffset();
970 $exc_tab->writeFilterToSession();
977 include_once(
"./Modules/Exercise/classes/class.ilExParticipantTableGUI.php");
979 $exc_tab->resetOffset();
980 $exc_tab->resetFilter();
1006 include_once(
"./Modules/Exercise/classes/class.ilExAssignment.php");
1008 $mems = $mem_obj->getMembers();
1010 $mems =
$GLOBALS[
'DIC']->access()->filterUserIdsByRbacOrPositionOfCurrentUser(
1011 'edit_submissions_grades',
1012 'edit_submissions_grades',
1013 $this->exercise->getRefId(),
1016 if (count($mems) > 0) {
1017 $ilToolbar->addButton(
1018 $lng->txt(
"exc_export_excel"),
1019 $ilCtrl->getLinkTarget($this,
"exportExcel")
1023 $this->ctrl->setParameter($this,
"vw", self::VIEW_GRADES);
1025 include_once(
"./Modules/Exercise/classes/class.ilExGradesTableGUI.php");
1028 "showGradesOverview",
1032 $tpl->setContent($grades_tab->getHTML());
1042 if (
$_GET[
"member_id"] !=
"") {
1044 $members = $submission->getUserIds();
1046 $members = array_keys($members);
1051 foreach ($members as $user_id) {
1052 $member_status = $this->assignment->getMemberStatus($user_id);
1053 $member_status->setFeedback(
true);
1054 $member_status->update();
1058 $logins = implode($logins,
",");
1061 $sig = chr(13) . chr(10) . chr(13) . chr(10);
1062 $sig .= $this->lng->txt(
'exc_mail_permanent_link');
1063 $sig .= chr(13) . chr(10) . chr(13) . chr(10);
1064 include_once
'./Services/Link/classes/class.ilLink.php';
1066 $sig = rawurlencode(base64_encode($sig));
1068 require_once
'Services/Mail/classes/class.ilMailFormCall.php';
1075 'rcp_to' => $logins,
1089 foreach ($this->exercise->members_obj->getMembers() as $member_id) {
1091 $submission->updateTutorDownloadTime();
1097 foreach ($submission->getFiles() as $file) {
1098 if ($this->assignment->getAssignmentType()->isSubmissionAssignedToTeam()) {
1099 $storage_id = $file[
"team_id"];
1101 $storage_id = $file[
"user_id"];
1104 $members[$storage_id][
"files"][$file[
"returned_id"]] = $file;
1106 if ($this->assignment->getAssignmentType()->isSubmissionAssignedToTeam()) {
1107 $name =
"Team " . $submission->getTeam()->getId();
1110 $name = $tmp_obj->getFirstname() .
" " . $tmp_obj->getLastname();
1112 if ($storage_id > 0) {
1113 $members[$storage_id][
"name"] =
$name;
1125 if ($this->assignment) {
1128 $this->ctrl->redirect($this,
"members");
1131 foreach (array_keys(
$_POST[
"member"]) as $user_id) {
1133 $tmembers = $submission->getUserIds();
1134 if (!(
bool) $a_keep_teams) {
1135 foreach ($tmembers as $tuser_id) {
1136 $members[$tuser_id] = 1;
1140 $members[] = $tmembers;
1143 $members[] = $user_id;
1152 $this->ctrl->redirect($this,
"showParticipant");
1155 $user_id =
$_GET[
"part_id"];
1157 include_once
"Modules/Exercise/classes/class.ilExAssignment.php";
1158 foreach (array_keys(
$_POST[
"ass"]) as $ass_id) {
1160 $tmembers = $submission->getUserIds();
1161 if (!(
bool) $a_keep_teams) {
1162 foreach ($tmembers as $tuser_id) {
1163 $members[$ass_id][] = $tuser_id;
1167 $members[$ass_id][] = $tmembers;
1170 $members[$ass_id][] = $user_id;
1186 ilUtil::sendSuccess($this->lng->txt(
"exc_sent"),
true);
1187 if ($this->assignment) {
1188 $this->exercise->sendAssignment($this->assignment, array_keys($members));
1189 $this->ctrl->redirect($this,
"members");
1191 foreach ($members as $ass_id =>
$users) {
1194 $this->ctrl->setParameter($this,
"part_id",
$_GET[
"part_id"]);
1195 $this->ctrl->redirect($this,
"showParticipant");
1210 include_once(
"./Services/Utilities/classes/class.ilConfirmationGUI.php");
1212 $cgui->setFormAction(
$ilCtrl->getFormAction($this));
1213 $cgui->setHeaderText(
$lng->txt(
"exc_msg_sure_to_deassign_participant"));
1214 $cgui->setCancel(
$lng->txt(
"cancel"),
"members");
1215 $cgui->setConfirm(
$lng->txt(
"remove"),
"deassignMembers");
1217 include_once(
"./Services/User/classes/class.ilUserUtil.php");
1218 foreach ($members as $k =>
$m) {
1226 $tpl->setContent($cgui->getHTML());
1239 foreach (array_keys($members) as $usr_id) {
1240 $this->exercise->members_obj->deassignMember((
int) $usr_id);
1242 ilUtil::sendSuccess(
$lng->txt(
"exc_msg_participants_removed"),
true);
1243 $ilCtrl->redirect($this,
"members");
1248 if (!isset(
$_POST[
'comments_value'])) {
1252 $this->exercise->members_obj->setNoticeForMember(
1256 ilUtil::sendSuccess($this->lng->txt(
"exc_members_comments_saved"));
1267 $member_id = (int)
$_GET[
"part_id"];
1269 foreach (array_keys(
$_POST[
"id"]) as $ass_id) {
1270 if (is_array($a_selected) &&
1271 !in_array($ass_id, $a_selected)) {
1275 $data[$ass_id][$member_id] = array(
1279 if (array_key_exists(
"mark",
$_POST)) {
1282 if (array_key_exists(
"notice",
$_POST)) {
1287 $ilCtrl->setParameter($this,
"part_id", $member_id);
1294 $user_ids = (array) array_keys((array)
$_POST[
'id']);
1295 $filtered_user_ids =
$GLOBALS[
'DIC']->access()->filterUserIdsByRbacOrPositionOfCurrentUser(
1296 'edit_submissions_grades',
1297 'edit_submissions_grades',
1298 $this->exercise->getRefId(),
1303 foreach ($filtered_user_ids as $user_id) {
1304 if (is_array($a_selected) &&
1305 !in_array($user_id, $a_selected)) {
1309 $data[-1][$user_id] = array(
1313 if (array_key_exists(
"mark",
$_POST)) {
1316 if (array_key_exists(
"notice",
$_POST)) {
1327 if ($this->assignment) {
1341 include_once(
"./Modules/Exercise/classes/class.ilExAssignment.php");
1343 $saved_for = array();
1344 foreach ($a_data as $ass_id =>
$users) {
1345 $ass = ($ass_id < 0)
1351 foreach ($submission->getUserIds() as $sub_user_id) {
1353 $saved_for[$sub_user_id] = $uname[
"lastname"] .
", " . $uname[
"firstname"];
1355 $member_status = $ass->getMemberStatus($sub_user_id);
1359 if ($status ==
"") {
1360 $status = self::GRADE_NOT_GRADED;
1362 $member_status->setStatus($status);
1363 if (array_key_exists(
"mark",
$values)) {
1364 $member_status->setMark(
$values[
"mark"]);
1366 if (array_key_exists(
"notice",
$values)) {
1367 $member_status->setNotice(
$values[
"notice"]);
1369 $member_status->update();
1374 if (count($saved_for) > 0) {
1375 $save_for_str =
"(" . implode($saved_for,
" - ") .
")";
1379 ilUtil::sendSuccess($this->lng->txt(
"exc_status_saved") .
" " . $save_for_str,
true);
1389 $res = array(
"result" =>
false);
1391 if ($this->ctrl->isAsynch()) {
1392 $ass_id = (int)
$_POST[
"ass_id"];
1393 $user_id = (int)
$_POST[
"mem_id"];
1396 if ($ass_id && $user_id) {
1398 $user_ids = $submission->getUserIds();
1401 $all_members = $all_members->getMembers();
1403 $reci_ids = array();
1404 foreach ($user_ids as $user_id) {
1405 if (in_array($user_id, $all_members)) {
1406 $member_status = $this->assignment->getMemberStatus($user_id);
1408 $member_status->setFeedback(
true);
1409 $member_status->update();
1412 $reci_ids[] = $user_id;
1417 if (
sizeof($reci_ids)) {
1419 $this->exercise->sendFeedbackFileNotification(
1427 $res = array(
"result" =>
true,
"snippet" => nl2br(
$comment));
1440 $this->exercise->exportGradesExcel();
1455 $new_members = array();
1457 include_once
"Modules/Exercise/classes/class.ilExAssignmentTeam.php";
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 include_once
"Modules/Exercise/classes/class.ilExAssignmentTeam.php";
1505 foreach ($members as $group) {
1507 if (is_array($group)) {
1510 $first_user = $group;
1511 $first_user = array_shift($first_user);
1513 foreach ($group as $user_id) {
1514 $team->removeTeamMember($user_id);
1518 $this->exercise->processExerciseStatus(
1526 ilUtil::sendSuccess($this->lng->txt(
"msg_obj_modified"),
true);
1527 $ilCtrl->redirect($this,
"members");
1537 $ilTabs->clearTargets();
1538 $ilTabs->setBackTarget(
1546 $tpl->setContent($a_form->getHTML());
1553 include_once(
"Services/Form/classes/class.ilPropertyFormGUI.php");
1555 $form->setTitle(
$lng->txt(
"exc_adopt_group_teams") .
" - " . $this->assignment->getTitle());
1556 $form->setFormAction($this->ctrl->getFormAction($this,
"createTeamsFromGroups"));
1558 include_once
"Modules/Exercise/classes/class.ilExAssignmentTeam.php";
1559 include_once
"Services/User/classes/class.ilUserUtil.php";
1560 $all_members = array();
1562 if (
sizeof($group[
"members"])) {
1565 foreach ($group[
"members"] as $user_id) {
1568 if (!in_array($user_id, $all_members)) {
1569 $grp_value[] = $user_id;
1570 $all_members[] = $user_id;
1574 foreach (
$options as $user_id => $user_name) {
1577 $grp_team->setValue($grp_value);
1578 $form->addItem($grp_team);
1581 $grp_team->setValue(
$lng->txt(
"exc_adopt_group_teams_no_members"));
1582 $form->addItem($grp_team);
1586 if (
sizeof($all_members)) {
1587 $form->addCommandButton(
"createTeamsFromGroups",
$lng->txt(
"save"));
1589 $form->addCommandButton(
"members",
$lng->txt(
"cancel"));
1599 if (
$form->checkInput()) {
1600 include_once
"Services/User/classes/class.ilUserUtil.php";
1602 $all_members = $teams = array();
1604 foreach (array_keys(
$map) as $grp_id) {
1605 $postvar =
"grpt_" . $grp_id;
1606 $members =
$_POST[$postvar];
1607 if (is_array($members)) {
1608 $teams[] = $members;
1609 $invalid_team_members = array();
1611 foreach ($members as $user_id) {
1612 if (!array_key_exists($user_id, $all_members)) {
1613 $all_members[$user_id] = $grp_id;
1616 $invalid_team_members[] = $user_id;
1620 if (
sizeof($invalid_team_members)) {
1624 foreach ($invalid_team_members as $user_id) {
1626 $grp_title =
$map[$all_members[$user_id]][
"title"];
1627 $alert[] = sprintf(
$lng->txt(
"exc_adopt_group_teams_conflict"), $user_name, $grp_title);
1630 $input->setAlert(implode(
"<br/>", $alert));
1635 if (
sizeof($teams)) {
1639 $sum = array(
"added" => 0,
"blocked" => 0);
1640 foreach ($teams as $members) {
1641 foreach ($members as $user_id) {
1642 if (!$this->exercise->members_obj->isAssigned($user_id)) {
1643 $this->exercise->members_obj->assignMember($user_id);
1646 if (!in_array($user_id, $existing_users)) {
1653 $first = array_shift($members);
1659 if (
sizeof($members)) {
1660 foreach ($members as $user_id) {
1661 $team->addTeamMember($user_id);
1667 if ($sum[
"added"]) {
1668 $mess[] = sprintf(
$lng->txt(
"exc_adopt_group_teams_added"), $sum[
"added"]);
1670 if ($sum[
"blocked"]) {
1671 $mess[] = sprintf(
$lng->txt(
"exc_adopt_group_teams_blocked"), $sum[
"blocked"]);
1673 if ($sum[
"added"]) {
1674 ilUtil::sendSuccess(implode(
" ", $mess),
true);
1679 $this->ctrl->redirect($this,
"members");
1685 $form->setValuesByPost();
1698 include_once(
"Services/Form/classes/class.ilPropertyFormGUI.php");
1700 $form->addCommandButton(
"uploadMultiFeedback",
$lng->txt(
"upload"));
1701 $form->addCommandButton(
"members",
$lng->txt(
"cancel"));
1706 $fi->setRequired(
true);
1707 $form->addItem($fi);
1710 $form->setFormAction($this->ctrl->getFormAction($this,
"uploadMultiFeedback"));
1732 include_once(
"./Services/UIComponent/Button/classes/class.ilLinkButton.php");
1734 $button->setCaption(
"exc_download_zip_structure");
1735 $button->setUrl($this->ctrl->getLinkTarget($this,
"downloadMultiFeedbackZip"));
1736 $button->setOmitPreventDoubleSubmission(
true);
1737 $ilToolbar->addButtonInstance($button);
1743 $tpl->setContent($a_form->getHTML());
1751 $this->assignment->sendMultiFeedbackStructureFile($this->exercise);
1761 if (
$form->checkInput()) {
1764 $this->ctrl->redirect($this,
"showMultiFeedbackConfirmationTable");
1767 $this->ctrl->redirect($this,
"showMultiFeedback");
1771 $form->setValuesByPost();
1787 include_once(
"./Modules/Exercise/classes/class.ilFeedbackConfirmationTable2GUI.php");
1797 $this->assignment->clearMultiFeedbackDirectory();
1798 $this->ctrl->redirect($this,
"members");
1806 $this->assignment->saveMultiFeedbackFiles(
$_POST[
"file"], $this->exercise);
1808 ilUtil::sendSuccess($this->lng->txt(
"msg_obj_modified"),
true);
1809 $this->ctrl->redirect($this,
"members");
1823 include_once
"./Services/UIComponent/Modal/classes/class.ilModalGUI.php";
1825 $modal->setHeading(
$lng->txt(
"exc_individual_deadline"));
1826 $modal->setId(
"ilExcIDl");
1827 $modal->setBody(
'<div id="ilExcIDlBody"></div>');
1828 $modal = $modal->getHTML();
1830 $ajax_url = $this->ctrl->getLinkTarget($this,
"handleIndividualDeadlineCalls",
"",
true,
false);
1832 $tpl->addJavaScript(
"./Modules/Exercise/js/ilExcIDl.js",
true, 3);
1833 $tpl->addOnloadCode(
'il.ExcIDl.init("' . $ajax_url .
'");');
1835 include_once
"Services/Calendar/classes/class.ilCalendarUtil.php";
1846 foreach ($a_data as $item) {
1847 $item = explode(
"_", $item);
1849 $user_id = $item[1];
1851 if (!array_key_exists($ass_id, $ass_tmp)) {
1852 if ($this->assignment &&
1853 $ass_id == $this->assignment->getId()) {
1860 $map[$ass_id][] = $user_id;
1863 return array(
$map, $ass_tmp);
1871 $this->ctrl->saveParameter($this,
"part_id");
1874 if ((
bool)
$_GET[
"dn"]) {
1875 ilUtil::sendSuccess($this->lng->txt(
"settings_saved"),
true);
1876 $this->ctrl->redirect($this, $this->assignment
1878 :
"showParticipant");
1881 include_once
"Modules/Exercise/classes/class.ilExAssignment.php";
1884 if ($_GET[
"idlid"]) {
1886 if (is_array($tmp)) {
1889 $tpl->getOnLoadCodeForAsynch();
1896 if (substr($id, 0, 3) ==
"dl_") {
1897 $tmp[] = substr($id, 3);
1909 $ass = $ass_map[$ass_id];
1914 foreach (
$users as $user_id) {
1915 $date_field =
$form->getItemByPostVar(
"dl_" . $ass_id .
"_" . $user_id);
1920 $res[$ass_id][$user_id] = $date_field->getDate();
1927 $form->setValuesByPost();
1929 $tpl->getOnLoadCodeForAsynch();
1932 $ass = $ass_map[$ass_id];
1934 foreach (
$users as $id => $date) {
1935 $ass->setIndividualDeadline($id, $date);
1938 $ass->recalculateLateSubmissions();
1950 include_once
"Services/Form/classes/class.ilPropertyFormGUI.php";
1952 $form->setFormAction($this->ctrl->getFormAction($this));
1953 $form->setName(
"ilExcIDlForm");
1955 include_once
"Services/User/classes/class.ilUserUtil.php";
1956 foreach ($ids as $ass_id =>
$users) {
1957 $ass = $a_ass_map[$ass_id];
1960 $section->setTitle($ass->getTitle());
1963 include_once(
"./Modules/Exercise/classes/class.ilExAssignmentTeam.php");
1966 $values = $ass->getIndividualDeadlines();
1970 if (is_numeric($id)) {
1977 $team_id = (int) substr($id, 1);
1978 if (array_key_exists($team_id, $teams)) {
1980 foreach ($teams[$team_id]->getMembers() as $member_id) {
1982 $name[] = $uname[
"lastname"] .
", " . $uname[
"firstname"];
1990 $dl->setShowTime(
true);
1991 $dl->setRequired(
true);
1992 $form->addItem($dl);
1994 if (array_key_exists($id, $values)) {
2000 $form->addCommandButton(
"", $this->lng->txt(
"save"));
2010 if ($this->assignment) {
2019 $this->lng->loadLanguageModule(
"search");
2021 $this->toolbar->setFormAction($this->ctrl->getFormAction($this,
"listTextAssignment"));
2025 if (
$_POST[
"filter_status"]) {
2029 $si_status =
new ilSelectInputGUI($this->lng->txt(
"exc_tbl_status"),
"filter_status");
2031 "" => $this->lng->txt(
"search_any"),
2032 self::GRADE_NOT_GRADED => $this->lng->txt(
"exc_notgraded"),
2033 self::GRADE_PASSED => $this->lng->txt(
"exc_passed"),
2034 self::GRADE_FAILED => $this->lng->txt(
"exc_failed")
2036 $si_status->setOptions($options);
2037 $si_status->setValue($this->filter[
"status"]);
2039 $this->toolbar->addInputItem($si_status,
true);
2043 if ($this->assignment->getPeerReview()) {
2044 if (
$_POST[
"filter_feedback"]) {
2047 $this->filter[
"feedback"] =
"submission_feedback";
2050 $si_feedback =
new ilSelectInputGUI($this->lng->txt(
"feedback"),
"filter_feedback");
2052 "submission_feedback" => $this->lng->txt(
"submissions_feedback"),
2053 "submission_only" => $this->lng->txt(
"submissions_only")
2056 $si_feedback->setValue($this->filter[
"feedback"]);
2058 $this->toolbar->addInputItem($si_feedback,
true);
2062 include_once
"Services/UIComponent/Button/classes/class.ilSubmitButton.php";
2064 $submit->setCaption(
"filter");
2065 $submit->setCommand(
"listTextAssignment");
2066 $this->toolbar->addButtonInstance($submit);
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.
if(!array_key_exists('StateId', $_REQUEST)) $id
static downloadAllAssignmentFiles(ilExAssignment $a_ass, array $members, $to_path)
Download all submitted files of an assignment (all user)
static _lookupId($a_user_str)
Lookup id by login.
downloadSubmissionsObject()
showMultiFeedbackObject(ilPropertyFormGUI $a_form=null)
Show multi-feedback screen.
addUserFromAutoCompleteObject()
Add user as member.
Class ilExerciseMembersFilter.
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)
static hasAnySubmissions($a_ass_id)
showParticipantResetObject()
selectParticipantObject()
Select participant.
static sendInfo($a_info="", $a_keep=false)
Send Info Message to Screen.
setTableId($a_val)
Set table id.
__construct(ilObjExercise $a_exercise, ilExAssignment $a_ass=null)
Constructor.
redirectFeedbackMailObject()
set feedback status for member and redirect to mail screen
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
if(isset($_POST['submit'])) $form
getId()
get object id public
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)
special template class to simplify handling of ITX/PEAR
This class represents a text property in a property form.
downloadMultiFeedbackZipObject()
Download multi-feedback structrue file.
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.
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)
This class represents a text area property in a property form.
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 fillAutoCompleteToolbar($parent_object, ilToolbarGUI $toolbar=null, $a_options=array(), $a_sticky=false)
fill toolbar with
saveMultiFeedbackObject()
Save multi feedback.
File System Explorer GUI class.
setValue($a_value)
Set Value.
static redirect($a_script)
saveStatusSelectedObject()
Exercise participant table.
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)
$GLOBALS['JPEG_Segment_Names']
Global Variable: XMP_tag_captions.
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.