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"));
125 $this->ctrl->saveParameter($this, array(
"part_id"));
134 $class = $ilCtrl->getNextClass($this);
138 case "ilfilesystemgui":
139 $ilTabs->clearTargets();
140 $ilTabs->setBackTarget(
142 $ilCtrl->getLinkTarget($this, $this->
getViewBack())
151 $feedback_id = $submission->getFeedbackId();
152 $noti_rec_ids = $submission->getUserIds();
155 foreach ($noti_rec_ids as $rec_id) {
158 $fs_title = implode(
" / ", $fs_title);
160 $fs_gui =
new ilFileSystemGUI($fstorage->getFeedbackPath($feedback_id));
161 $fs_gui->
setTableId(
"excfbfil" . $this->assignment->getId() .
"_" . $feedback_id);
162 $fs_gui->setAllowDirectories(
false);
163 $fs_gui->setTitle(
$lng->txt(
"exc_fb_files") .
" - " .
164 $this->assignment->getTitle() .
" - " .
166 $pcommand = $fs_gui->getLastPerformedCommand();
167 if (is_array($pcommand) && $pcommand[
"cmd"] ==
"create_file") {
168 foreach ($noti_rec_ids as $user_id) {
169 $member_status = $this->assignment->getMemberStatus($user_id);
170 $member_status->setFeedback(
true);
171 $member_status->update();
174 $this->exercise->sendFeedbackFileNotification(
177 $this->assignment->getId()
180 $this->ctrl->forwardCommand($fs_gui);
183 case 'ilrepositorysearchgui':
185 $ref_id = $this->exercise->getRefId();
186 $rep_search->addUserAccessFilterCallable(
function ($a_user_ids) use ($ref_id) {
187 return $GLOBALS[
'DIC']->access()->filterUserIdsByRbacOrPositionOfCurrentUser(
188 'edit_submissions_grades',
189 'edit_submissions_grades',
194 $rep_search->setTitle($this->lng->txt(
"exc_add_participant"));
195 $rep_search->setCallback($this,
'addMembersObject');
199 $this->ctrl->setReturn($this,
'members');
201 $this->ctrl->forwardCommand($rep_search);
204 case "ilexsubmissionteamgui":
206 $ilCtrl->forwardCommand($gui);
209 case "ilexsubmissionfilegui":
211 $ilCtrl->forwardCommand($gui);
214 case "ilexsubmissiontextgui":
215 $ilCtrl->saveParameter($this, array(
"part_id"));
217 $ilCtrl->forwardCommand($gui);
220 case "ilexpeerreviewgui":
222 $ilCtrl->forwardCommand($gui);
226 $cmd = $ilCtrl->getCmd();
228 case 'downloadSubmissions':
229 $cmd = $ilCtrl->getCmd(
"downloadSubmissions");
232 $cmd = $ilCtrl->getCmd(
"listPublicSubmissions");
235 $this->{$cmd .
"Object"}();
242 switch ($_REQUEST[
"vw"]) {
243 case self::VIEW_PARTICIPANT:
244 $back_cmd =
"showParticipant";
247 case self::VIEW_GRADES:
248 $back_cmd =
"showGradesOverview";
253 $back_cmd =
"members";
262 $this->ctrl->setReturn($this, $back_cmd);
264 $this->tabs_gui->clearTargets();
265 $this->tabs_gui->setBackTarget(
266 $this->lng->txt(
"back"),
267 $this->ctrl->getLinkTarget($this, $back_cmd)
270 return new ilExSubmission($this->assignment, $_REQUEST[
"member_id"], null,
true);
284 $ass_id =
$_GET[
"ass_id"];
285 $part_id =
$_GET[
"part_id"];
287 $ilCtrl->setParameter($this,
"vw",
"");
288 $ilCtrl->setParameter($this,
"member_id",
"");
289 $ilCtrl->setParameter($this,
"ass_id",
"");
290 $ilCtrl->setParameter($this,
"part_id",
"");
294 $lng->txt(
"exc_assignment_view"),
295 $ilCtrl->getLinkTarget($this,
"members")
299 $lng->txt(
"exc_participant_view"),
300 $ilCtrl->getLinkTarget($this,
"showParticipant")
304 $lng->txt(
"exc_grades_overview"),
305 $ilCtrl->getLinkTarget($this,
"showGradesOverview")
307 $ilTabs->activateSubTab($a_activate);
309 $ilCtrl->setParameter($this,
"ass_id", $ass_id);
310 $ilCtrl->setParameter($this,
"part_id", $part_id);
318 $ilCtrl->setParameterByClass(
"ilExSubmissionFileGUI",
"member_id", (
int)
$_GET[
"member_id"]);
319 $url = $ilCtrl->getLinkTargetByClass(array(
"ilRepositoryGUI",
"ilExerciseHandlerGUI",
"ilObjExerciseGUI",
"ilExerciseManagementGUI",
"ilExSubmissionFileGUI"),
"downloadNewReturned");
320 $js_url = $ilCtrl->getLinkTargetByClass(array(
"ilRepositoryGUI",
"ilExerciseHandlerGUI",
"ilObjExerciseGUI",
"ilExerciseManagementGUI",
"ilExSubmissionFileGUI"),
"downloadNewReturned",
"",
"",
false);
321 ilUtil::sendInfo(
$lng->txt(
"exc_wait_for_files") .
"<a href='$url'> " .
$lng->txt(
'exc_download_files') .
"</a><script>window.location.href ='" . $js_url .
"';</script>");
340 if (!$this->assignment) {
341 $this->assignment = current($ass);
345 if (count($ass) > 1) {
347 foreach ($ass as
$a) {
348 $options[$a->getId()] = $a->getTitle();
351 $si->setOptions($options);
352 $si->setValue($this->assignment->getId());
353 $ilToolbar->addStickyItem(
$si,
true);
356 $button->setCaption(
"select");
357 $button->setCommand(
"selectAssignment");
358 $ilToolbar->addStickyItem($button);
360 $ilToolbar->addSeparator();
363 elseif ($this->assignment) {
364 $ilCtrl->setParameter($this,
"ass_id", $this->assignment->getId());
370 $has_rbac_access =
$GLOBALS[
'DIC']->access()->checkAccess(
371 'edit_submissions_grades',
373 $this->exercise->getRefId()
375 if ($has_rbac_access) {
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());
401 $ilToolbar->addButton(
402 $this->lng->txt(
"exc_adopt_group_teams"),
403 $this->ctrl->getLinkTarget($this,
"adoptTeamsFromGroup")
406 $ilToolbar->addSeparator();
408 } elseif ($this->exercise->hasTutorFeedbackFile()) {
409 if (!$this->assignment->getAssignmentType()->usesTeams()) {
411 $ilToolbar->addButton(
412 $this->lng->txt(
"exc_multi_feedback"),
413 $this->ctrl->getLinkTarget($this,
"showMultiFeedback")
416 $ilToolbar->addSeparator();
422 if ($submission_repository->hasSubmissions($this->assignment->getId())) {
423 $ass_type = $this->assignment->getType();
426 $ilToolbar->addFormButton(
$lng->txt(
"exc_list_text_assignment"),
"listTextAssignment");
428 $ilToolbar->addFormButton(
$lng->txt(
"download_all_returned_files"),
"downloadSubmissions");
430 $this->ctrl->setParameter($this,
"vw", self::VIEW_ASSIGNMENT);
434 $exc_tab->getHTML() .
441 $ilCtrl->setParameter($this,
"ass_id",
"");
448 $participant_id = $_REQUEST[
'part_id'];
452 (
int) $this->exercise->getRefId(),
453 (int) $this->exercise->getId(),
455 (
int) $participant_id
458 if ($download_task->run()) {
459 ilUtil::sendSuccess($this->lng->txt(
'exc_down_files_started_bg'),
true);
462 if ($this->assignment) {
463 $this->ctrl->redirect($this,
"members");
465 $this->ctrl->redirect($this,
"showParticipant");
474 $exc_tab->writeFilterToSession();
483 $exc_tab->resetFilter();
496 if (is_array(
$_POST[
"lcomment"])) {
497 foreach (
$_POST[
"lcomment"] as $k => $v) {
498 $marks_obj =
new ilLPMarks($this->exercise->getId(), (int) $k);
501 $marks_obj->update();
504 ilUtil::sendSuccess(
$lng->txt(
"exc_msg_saved_grades"),
true);
505 $ilCtrl->redirect($this,
"showGradesOverview");
520 $button_print = $this->ui_factory->button()->standard($this->lng->txt(
'print'),
"#")
522 return "$('#{$id}').click(function() { window.print(); return false; });";
524 $this->toolbar->addSeparator();
525 $this->toolbar->addComponent($button_print);
527 $group_panels_tpl =
new ilTemplate(
"tpl.exc_group_report_panels.html",
true,
true,
"Modules/Exercise");
528 $group_panels_tpl->setVariable(
'TITLE', $this->lng->txt(
"exc_list_text_assignment") .
": " . $this->assignment->getTitle());
540 $submission_data = $this->assignment->getExerciseMemberAssignmentData($file[
"user_id"], $this->
filter[
"status"]);
542 if (is_array($submission_data)) {
543 $data = array_merge($feedback_data, $submission_data);
549 if ($total_reports == 0) {
550 $mtpl =
new ilTemplate(
"tpl.message.html",
true,
true,
"Services/Utilities");
551 $mtpl->setCurrentBlock(
"info_message");
552 $mtpl->setVariable(
"TEXT", $this->lng->txt(
"fiter_no_results"));
553 $mtpl->parseCurrentBlock();
554 $report_html .= $mtpl->get();
557 $group_panels_tpl->setVariable(
'CONTENT', $report_html);
558 $this->tpl->setContent($group_panels_tpl->get());
570 $group_panels_tpl =
new ilTemplate(
"tpl.exc_group_report_panels.html",
true,
true,
"Modules/Exercise");
571 $group_panels_tpl->setVariable(
'TITLE', $this->lng->txt(
"exc_compare_selected_submissions"));
577 foreach ($participants as $participant_id) {
578 $submission =
new ilExSubmission($this->assignment, $participant_id);
581 $file = reset($submission->getFiles());
585 "user_id" => $participant_id,
593 $submission_data = $this->assignment->getExerciseMemberAssignmentData($file[
"user_id"], $this->
filter[
"status"]);
595 if (is_array($submission_data)) {
596 $data = array_merge($feedback_data, $submission_data);
602 $group_panels_tpl->setVariable(
'CONTENT', $report_html);
603 $this->tpl->setContent($group_panels_tpl->get());
610 $this->ctrl->setParameter($this,
"member_id", $a_data[
'uid']);
612 $this->ui_factory->button()->shy($this->lng->txt(
"grade_evaluate"),
"#")->withOnClick($modal->getShowSignal())
615 if ($this->exercise->hasTutorFeedbackMail()) {
616 $actions[] = $this->ui_factory->button()->shy(
617 $this->lng->txt(
"exc_tbl_action_feedback_mail"),
618 $this->ctrl->getLinkTarget($this,
"redirectFeedbackMail")
621 if ($this->exercise->hasTutorFeedbackFile()) {
622 $actions[] = $this->ui_factory->button()->shy(
623 $this->lng->txt(
"exc_tbl_action_feedback_file"),
624 $this->ctrl->getLinkTargetByClass(
"ilFileSystemGUI",
"listFiles")
628 $this->ctrl->setParameter($this,
"member_id",
"");
630 $actions_dropdown = $this->ui_factory->dropdown()->standard($actions);
632 if ($a_data[
'status'] == self::GRADE_NOT_GRADED) {
633 $str_status_key = $this->lng->txt(
'exc_tbl_status');
634 $str_status_value = $this->lng->txt(
'not_yet');
636 $str_status_key = $this->lng->txt(
'exc_tbl_status_time');
640 $str_mark_key = $this->lng->txt(
"exc_tbl_mark");
641 $str_mark_value = $this->lng->txt(
'not_yet');
643 if (($a_data[
'mark'] !=
"")) {
644 $str_mark_value = $a_data[
'mark'];
647 if ($a_data[
'feedback_time']) {
648 $str_evaluation_key = $this->lng->txt(
'exc_tbl_feedback_time');
651 $str_evaluation_key = $this->lng->txt(
'exc_settings_feedback');
652 $str_evaluation_value = $this->lng->txt(
'not_yet');
655 $card_content = array(
657 $str_status_key => $str_status_value,
658 $str_mark_key => $str_mark_value,
659 $str_evaluation_key => $str_evaluation_value,
660 $this->lng->txt(
'feedback_given') => $a_data[
'fb_given'],
661 $this->lng->txt(
'feedback_received') => $a_data[
'fb_received']
663 $card_tpl =
new ilTemplate(
"tpl.exc_report_details_card.html",
true,
true,
"Modules/Exercise");
664 foreach ($card_content as $key => $value) {
665 $card_tpl->setCurrentBlock(
"assingment_card");
666 $card_tpl->setVariable(
"ROW_KEY", $key);
667 $card_tpl->setVariable(
"ROW_VALUE", $value);
668 $card_tpl->parseCurrentBlock();
671 $main_panel = $this->ui_factory->panel()->sub($a_data[
'uname'], $this->ui_factory->legacy($a_data[
'utext']))
672 ->withCard($this->ui_factory->card()->standard($this->lng->txt(
'text_assignment'))->withSections(array($this->ui_factory->legacy($card_tpl->get()))))->withActions($actions_dropdown);
674 $feedback_tpl =
new ilTemplate(
"tpl.exc_report_feedback.html",
true,
true,
"Modules/Exercise");
676 if (array_key_exists(
"peer", $a_data) && ($this->
filter[
"feedback"] == self::FEEDBACK_FULL_SUBMISSION) || $this->
filter[
"feedback"] ==
"") {
677 $feedback_tpl->setCurrentBlock(
"feedback");
678 foreach ($a_data[
"peer"] as $peer_id) {
681 $peer_name =
$user->getFirstname() .
" " .
$user->getLastname();
683 $peer_name = $this->lng->txt(
"exc_deleted_user");
686 $feedback_tpl->setCurrentBlock(
"peer_feedback");
687 $feedback_tpl->setVariable(
"PEER_NAME", $peer_name);
689 $submission =
new ilExSubmission($this->assignment, $a_data[
"uid"]);
690 $values = $submission->getPeerReview()->getPeerReviewValues($peer_id, $a_data[
"uid"]);
693 foreach ($this->assignment->getPeerReviewCriteriaCatalogueItems() as $crit) {
694 $crit_id = $crit->getId()
697 $crit->setPeerReviewContext($this->assignment, $peer_id, $a_data[
"uid"]);
700 '<div class="ilBlockPropertyCaption">' . $crit->getTitle() .
'</div>' .
701 '<div style="margin:2px 0;">' . $crit->getHTML($values[$crit_id]) .
'</div>';
703 $feedback_tpl->setVariable(
"PEER_FEEDBACK", $review_html);
704 $feedback_tpl->parseCurrentBlock();
706 $feedback_tpl->parseCurrentBlock();
708 $feedback_tpl->setVariable(
"GRADE", $this->lng->txt(
'grade') .
": " . $this->lng->txt(
'exc_' . $a_data[
'status']));
709 $feedback_tpl->setVariable(
"COMMENT", $this->lng->txt(
'exc_comment') .
"<br>" . $a_data[
'comment']);
711 $feedback_panel = $this->ui_factory->panel()->sub(
"", $this->ui_factory->legacy($feedback_tpl->get()));
713 $report = $this->ui_factory->panel()->report(
"", array($main_panel, $feedback_panel));
715 return $this->ui_renderer->render([$modal,$report]);
720 $modal_tpl =
new ilTemplate(
"tpl.exc_report_evaluation_modal.html",
true,
true,
"Modules/Exercise");
721 $modal_tpl->setVariable(
"USER_NAME", $a_data[
'uname']);
724 $form->setFormAction($this->ctrl->getFormAction($this,
"saveEvaluationFromModal"));
725 $form->setId(uniqid(
'form'));
729 self::GRADE_NOT_GRADED => $this->lng->txt(
"exc_notgraded"),
730 self::GRADE_PASSED => $this->lng->txt(
"exc_passed"),
731 self::GRADE_FAILED => $this->lng->txt(
"exc_failed")
734 $si->setOptions($options);
735 $si->setValue($a_data[
'status']);
739 $mark_input =
new ilTextInputGUI($this->lng->txt(
"exc_tbl_mark"),
"mark");
740 $mark_input->setValue($a_data[
'mark']);
741 $mark_input->setMaxLength(32);
742 $mark_input->setSize(4);
743 $form->addItem($mark_input);
746 $item->setValue($a_data[
'uid']);
747 $form->addItem($item);
750 if ($this->exercise->hasTutorFeedbackText()) {
753 $u_text = strip_tags($a_data[
"utext"]);
756 if (strlen($u_text) > $max_chars) {
757 $text =
"<input type='checkbox' class='read-more-state' id='post-1' />";
758 $text .=
"<div class='read-more-wrap'>";
759 $text .= mb_substr($u_text, 0, $max_chars);
760 $text .=
"<span class='read-more-target'>";
761 $text .= mb_substr($u_text, $max_chars);
762 $text .=
"</span></div>";
763 $text .=
"<label for='post-1' class='read-more-trigger'></label>";
765 $modal_tpl->setVariable(
"USER_TEXT", $text);
768 $ta->
setInfo($this->lng->txt(
"exc_comment_for_learner_info"));
769 $ta->setValue($a_data[
'comment']);
774 $modal_tpl->setVariable(
"FORM", $form->getHTML());
776 $form_id =
'form_' . $form->getId();
777 $submit_btn = $this->ui_factory->button()->primary($this->lng->txt(
"save"),
'#')
779 return "$('#{$id}').click(function() { $('#{$form_id}').submit(); return false; });";
782 return $this->ui_factory->modal()->roundtrip(strtoupper($this->lng->txt(
"grade_evaluate")), $this->ui_factory->legacy($modal_tpl->get()))->withActionButtons([$submit_btn]);
791 $user_id = (int)
$_POST[
'mem_id'];
792 $grade = trim(
$_POST[
"grade"]);
793 $mark = trim(
$_POST[
'mark']);
795 if ($this->assignment->getId() && $user_id) {
796 $member_status = $this->assignment->getMemberStatus($user_id);
798 $member_status->setStatus($grade);
799 $member_status->setMark($mark);
801 $member_status->setFeedback(
true);
803 $member_status->update();
805 ilUtil::sendSuccess($this->lng->txt(
"exc_status_saved"),
true);
806 $this->ctrl->redirect($this,
"listTextAssignment");
814 if (!strlen(trim(
$_POST[
'user_login']))) {
819 $users = explode(
',',
$_POST[
'user_login']);
822 foreach ($users as
$user) {
830 $user_ids[] = $user_id;
845 if (!count($a_user_ids)) {
850 if (!$this->exercise->members_obj->assignMembers($a_user_ids)) {
869 ilUtil::sendSuccess($this->lng->txt(
"exc_members_assigned"),
true);
872 $this->ctrl->redirect($this,
"members");
897 $this->ctrl->setParameter($this,
"ass_id",
"");
901 $members = $this->exercise->members_obj->getMembers();
903 $members =
$GLOBALS[
'DIC']->access()->filterUserIdsByRbacOrPositionOfCurrentUser(
904 'edit_submissions_grades',
905 'edit_submissions_grades',
906 $this->exercise->getRefId(),
911 if (count($members) == 0) {
917 foreach ($members as $mem_id) {
920 if (trim(
$name[
"login"]) !=
"") {
921 $mems[$mem_id] =
$name;
928 if (
$_GET[
"part_id"] ==
"" && count($mems) > 0) {
929 $_GET[
"part_id"] = key($mems);
932 $current_participant =
$_GET[
"part_id"];
935 if (count($mems) > 1) {
937 foreach ($mems as $k => $m) {
939 $m[
"lastname"] .
", " . $m[
"firstname"] .
" [" . $m[
"login"] .
"]";
942 $si->setOptions($options);
943 $si->setValue($current_participant);
944 $ilToolbar->addStickyItem(
$si,
true);
947 $button->setCaption(
"select");
948 $button->setCommand(
"selectParticipant");
949 $ilToolbar->addStickyItem($button);
952 if (count($mems) > 0) {
953 $this->ctrl->setParameter($this,
"vw", self::VIEW_PARTICIPANT);
954 $this->ctrl->setParameter($this,
"part_id", $current_participant);
956 $ilToolbar->addSeparator();
957 $ilToolbar->setFormAction($ilCtrl->getFormAction($this));
958 $ilToolbar->addFormButton(
$lng->txt(
"download_all_returned_files"),
"downloadSubmissions");
966 $tpl->setContent($part_tab->getHTML() .
976 $exc_tab->resetOffset();
977 $exc_tab->writeFilterToSession();
985 $exc_tab->resetOffset();
986 $exc_tab->resetFilter();
1013 $mems = $mem_obj->getMembers();
1015 $mems =
$GLOBALS[
'DIC']->access()->filterUserIdsByRbacOrPositionOfCurrentUser(
1016 'edit_submissions_grades',
1017 'edit_submissions_grades',
1018 $this->exercise->getRefId(),
1021 if (count($mems) > 0) {
1022 $ilToolbar->addButton(
1023 $lng->txt(
"exc_export_excel"),
1024 $ilCtrl->getLinkTarget($this,
"exportExcel")
1028 $this->ctrl->setParameter($this,
"vw", self::VIEW_GRADES);
1032 "showGradesOverview",
1036 $tpl->setContent($grades_tab->getHTML());
1046 if (
$_GET[
"member_id"] !=
"") {
1048 $members = $submission->getUserIds();
1050 $members = array_keys($members);
1055 foreach ($members as $user_id) {
1056 $member_status = $this->assignment->getMemberStatus($user_id);
1057 $member_status->setFeedback(
true);
1058 $member_status->update();
1062 $logins = implode(
",", $logins);
1065 $sig = chr(13) . chr(10) . chr(13) . chr(10);
1066 $sig .= $this->lng->txt(
'exc_mail_permanent_link');
1067 $sig .= chr(13) . chr(10) . chr(13) . chr(10);
1069 $sig = rawurlencode(base64_encode($sig));
1077 'rcp_to' => $logins,
1091 foreach ($this->exercise->members_obj->getMembers() as $member_id) {
1093 $submission->updateTutorDownloadTime();
1099 foreach ($submission->getFiles() as $file) {
1100 if ($this->assignment->getAssignmentType()->isSubmissionAssignedToTeam()) {
1101 $storage_id = $file[
"team_id"];
1103 $storage_id = $file[
"user_id"];
1106 $members[$storage_id][
"files"][$file[
"returned_id"]] = $file;
1108 if ($this->assignment->getAssignmentType()->isSubmissionAssignedToTeam()) {
1109 $name =
"Team " . $submission->getTeam()->getId();
1112 $name = $tmp_obj->getFirstname() .
" " . $tmp_obj->getLastname();
1114 if ($storage_id > 0) {
1115 $members[$storage_id][
"name"] =
$name;
1127 if ($this->assignment) {
1130 $this->ctrl->redirect($this,
"members");
1133 foreach (array_keys(
$_POST[
"member"]) as $user_id) {
1135 $tmembers = $submission->getUserIds();
1136 if (!(
bool) $a_keep_teams) {
1137 foreach ($tmembers as $tuser_id) {
1138 $members[$tuser_id] = 1;
1142 $members[] = $tmembers;
1145 $members[] = $user_id;
1154 $this->ctrl->redirect($this,
"showParticipant");
1157 $user_id =
$_GET[
"part_id"];
1159 foreach (array_keys(
$_POST[
"ass"]) as $ass_id) {
1161 $tmembers = $submission->getUserIds();
1162 if (!(
bool) $a_keep_teams) {
1163 foreach ($tmembers as $tuser_id) {
1164 $members[$ass_id][] = $tuser_id;
1168 $members[$ass_id][] = $tmembers;
1171 $members[$ass_id][] = $user_id;
1187 ilUtil::sendSuccess($this->lng->txt(
"exc_sent"),
true);
1188 if ($this->assignment) {
1189 $this->exercise->sendAssignment($this->assignment, array_keys($members));
1190 $this->ctrl->redirect($this,
"members");
1192 foreach ($members as $ass_id => $users) {
1193 $this->exercise->sendAssignment(
new ilExAssignment($ass_id), $users);
1195 $this->ctrl->setParameter($this,
"part_id",
$_GET[
"part_id"]);
1196 $this->ctrl->redirect($this,
"showParticipant");
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 foreach ($members as $k => $m) {
1225 $tpl->setContent($cgui->getHTML());
1238 foreach (array_keys($members) as $usr_id) {
1239 $this->exercise->members_obj->deassignMember((
int) $usr_id);
1242 ilUtil::sendSuccess(
$lng->txt(
"exc_msg_participants_removed"),
true);
1243 $ilCtrl->redirect($this,
"members");
1254 if (!isset(
$_POST[
'comments_value'])) {
1258 $this->exercise->members_obj->setNoticeForMember(
1262 ilUtil::sendSuccess($this->lng->txt(
"exc_members_comments_saved"));
1273 $member_id = (int)
$_GET[
"part_id"];
1275 foreach (array_keys(
$_POST[
"id"]) as $ass_id) {
1276 if (is_array($a_selected) &&
1277 !in_array($ass_id, $a_selected)) {
1281 $data[$ass_id][$member_id] = array(
1285 if (array_key_exists(
"mark",
$_POST)) {
1288 if (array_key_exists(
"notice",
$_POST)) {
1293 $ilCtrl->setParameter($this,
"part_id", $member_id);
1300 $user_ids = (array) array_keys((array)
$_POST[
'id']);
1301 $filtered_user_ids =
$GLOBALS[
'DIC']->access()->filterUserIdsByRbacOrPositionOfCurrentUser(
1302 'edit_submissions_grades',
1303 'edit_submissions_grades',
1304 $this->exercise->getRefId(),
1309 foreach ($filtered_user_ids as $user_id) {
1310 if (is_array($a_selected) &&
1311 !in_array($user_id, $a_selected)) {
1315 $data[-1][$user_id] = array(
1319 if (array_key_exists(
"mark",
$_POST)) {
1322 if (array_key_exists(
"notice",
$_POST)) {
1333 if ($this->assignment) {
1347 $saved_for = array();
1348 foreach ($a_data as $ass_id => $users) {
1349 $ass = ($ass_id < 0)
1352 foreach ($users as $user_id => $values) {
1355 foreach ($submission->getUserIds() as $sub_user_id) {
1357 $saved_for[$sub_user_id] = $uname[
"lastname"] .
", " . $uname[
"firstname"];
1359 $member_status = $ass->getMemberStatus($sub_user_id);
1362 $status = $values[
"status"];
1363 if ($status ==
"") {
1364 $status = self::GRADE_NOT_GRADED;
1366 $member_status->setStatus($status);
1367 if (array_key_exists(
"mark", $values)) {
1368 $member_status->setMark($values[
"mark"]);
1370 if (array_key_exists(
"notice", $values)) {
1371 $member_status->setNotice($values[
"notice"]);
1373 $member_status->update();
1378 if (count($saved_for) > 0) {
1379 $save_for_str =
"(" . implode(
" - ", $saved_for) .
")";
1383 ilUtil::sendSuccess($this->lng->txt(
"exc_status_saved") .
" " . $save_for_str,
true);
1393 $res = array(
"result" =>
false);
1395 if ($this->ctrl->isAsynch()) {
1396 $ass_id = (int)
$_POST[
"ass_id"];
1397 $user_id = (int)
$_POST[
"mem_id"];
1400 if ($ass_id && $user_id) {
1402 $user_ids = $submission->getUserIds();
1405 $all_members = $all_members->getMembers();
1407 $reci_ids = array();
1408 foreach ($user_ids as $user_id) {
1409 if (in_array($user_id, $all_members)) {
1410 $member_status = $this->assignment->getMemberStatus($user_id);
1412 $member_status->setFeedback(
true);
1413 $member_status->update();
1416 $reci_ids[] = $user_id;
1421 if (
sizeof($reci_ids)) {
1423 $this->exercise->sendFeedbackFileNotification(
1431 $res = array(
"result" =>
true,
"snippet" => nl2br(
$comment));
1435 echo(json_encode(
$res));
1444 $this->exercise->exportGradesExcel();
1459 $new_members = array();
1461 foreach ($members as $group) {
1462 if (is_array($group)) {
1463 $new_members = array_merge($new_members, $group);
1465 $first_user = $group;
1466 $first_user = array_shift($first_user);
1468 foreach ($group as $user_id) {
1469 $team->removeTeamMember($user_id);
1472 $new_members[] = $group;
1476 if (
sizeof($new_members)) {
1479 $first_user = array_shift($new_members);
1481 if (
sizeof($new_members)) {
1482 foreach ($new_members as $user_id) {
1483 $team->addTeamMember($user_id);
1488 $submission =
new ilExSubmission($this->assignment, $first_user);
1489 $this->exercise->processExerciseStatus(
1491 $team->getMembers(),
1492 $submission->hasSubmitted(),
1493 $submission->validatePeerReviews()
1497 ilUtil::sendSuccess($this->lng->txt(
"msg_obj_modified"),
true);
1498 $ilCtrl->redirect($this,
"members");
1507 foreach ($members as $group) {
1509 if (is_array($group)) {
1512 $first_user = $group;
1513 $first_user = array_shift($first_user);
1515 foreach ($group as $user_id) {
1516 $team->removeTeamMember($user_id);
1520 $this->exercise->processExerciseStatus(
1528 ilUtil::sendSuccess($this->lng->txt(
"msg_obj_modified"),
true);
1529 $ilCtrl->redirect($this,
"members");
1539 $ilTabs->clearTargets();
1540 $ilTabs->setBackTarget(
1542 $ilCtrl->getLinkTarget($this, $this->
getViewBack())
1548 $tpl->setContent($a_form->getHTML());
1556 $form->setTitle(
$lng->txt(
"exc_adopt_group_teams") .
" - " . $this->assignment->getTitle());
1557 $form->setFormAction($this->ctrl->getFormAction($this,
"createTeamsFromGroups"));
1559 $all_members = array();
1561 if (
sizeof($group[
"members"])) {
1563 $grp_value = $options = array();
1564 foreach ($group[
"members"] as $user_id) {
1566 $options[$user_id] = $user_name;
1567 if (!in_array($user_id, $all_members)) {
1568 $grp_value[] = $user_id;
1569 $all_members[] = $user_id;
1573 foreach ($options as $user_id => $user_name) {
1576 $grp_team->setValue($grp_value);
1577 $form->addItem($grp_team);
1580 $grp_team->setValue(
$lng->txt(
"exc_adopt_group_teams_no_members"));
1581 $form->addItem($grp_team);
1585 if (
sizeof($all_members)) {
1586 $form->addCommandButton(
"createTeamsFromGroups",
$lng->txt(
"save"));
1588 $form->addCommandButton(
"members",
$lng->txt(
"cancel"));
1598 if ($form->checkInput()) {
1600 $all_members = $teams = array();
1602 foreach (array_keys($map) as $grp_id) {
1603 $postvar =
"grpt_" . $grp_id;
1604 $members =
$_POST[$postvar];
1605 if (is_array($members)) {
1606 $teams[] = $members;
1607 $invalid_team_members = array();
1609 foreach ($members as $user_id) {
1610 if (!array_key_exists($user_id, $all_members)) {
1611 $all_members[$user_id] = $grp_id;
1614 $invalid_team_members[] = $user_id;
1618 if (
sizeof($invalid_team_members)) {
1622 foreach ($invalid_team_members as $user_id) {
1624 $grp_title = $map[$all_members[$user_id]][
"title"];
1625 $alert[] = sprintf(
$lng->txt(
"exc_adopt_group_teams_conflict"), $user_name, $grp_title);
1627 $input = $form->getItemByPostVar($postvar);
1628 $input->setAlert(implode(
"<br/>", $alert));
1633 if (
sizeof($teams)) {
1637 $sum = array(
"added" => 0,
"blocked" => 0);
1638 foreach ($teams as $members) {
1639 foreach ($members as $user_id) {
1640 if (!$this->exercise->members_obj->isAssigned($user_id)) {
1641 $this->exercise->members_obj->assignMember($user_id);
1644 if (!in_array($user_id, $existing_users)) {
1651 $first = array_shift($members);
1657 if (
sizeof($members)) {
1658 foreach ($members as $user_id) {
1659 $team->addTeamMember($user_id);
1665 if ($sum[
"added"]) {
1666 $mess[] = sprintf(
$lng->txt(
"exc_adopt_group_teams_added"), $sum[
"added"]);
1668 if ($sum[
"blocked"]) {
1669 $mess[] = sprintf(
$lng->txt(
"exc_adopt_group_teams_blocked"), $sum[
"blocked"]);
1671 if ($sum[
"added"]) {
1672 ilUtil::sendSuccess(implode(
" ", $mess),
true);
1677 $this->ctrl->redirect($this,
"members");
1683 $form->setValuesByPost();
1697 $form->addCommandButton(
"uploadMultiFeedback",
$lng->txt(
"upload"));
1698 $form->addCommandButton(
"members",
$lng->txt(
"cancel"));
1703 $fi->setRequired(
true);
1704 $form->addItem($fi);
1707 $form->setFormAction($this->ctrl->getFormAction($this,
"uploadMultiFeedback"));
1730 $button->setCaption(
"exc_download_zip_structure");
1731 $button->setUrl($this->ctrl->getLinkTarget($this,
"downloadMultiFeedbackZip"));
1732 $button->setOmitPreventDoubleSubmission(
true);
1733 $ilToolbar->addButtonInstance($button);
1739 $tpl->setContent($a_form->getHTML());
1747 $this->assignment->sendMultiFeedbackStructureFile($this->exercise);
1757 if ($form->checkInput()) {
1760 $this->ctrl->redirect($this,
"showMultiFeedbackConfirmationTable");
1763 $this->ctrl->redirect($this,
"showMultiFeedback");
1767 $form->setValuesByPost();
1784 $tpl->setContent($tab->getHTML());
1792 $this->assignment->clearMultiFeedbackDirectory();
1793 $this->ctrl->redirect($this,
"members");
1801 $this->assignment->saveMultiFeedbackFiles(
$_POST[
"file"], $this->exercise);
1803 ilUtil::sendSuccess($this->lng->txt(
"msg_obj_modified"),
true);
1804 $this->ctrl->redirect($this,
"members");
1819 $modal->setHeading(
$lng->txt(
"exc_individual_deadline"));
1820 $modal->setId(
"ilExcIDl");
1821 $modal->setBody(
'<div id="ilExcIDlBody"></div>');
1822 $modal = $modal->getHTML();
1824 $ajax_url = $this->ctrl->getLinkTarget($this,
"handleIndividualDeadlineCalls",
"",
true,
false);
1826 $tpl->addJavaScript(
"./Modules/Exercise/js/ilExcIDl.js",
true, 3);
1827 $tpl->addOnloadCode(
'il.ExcIDl.init("' . $ajax_url .
'");');
1839 foreach ($a_data as $item) {
1840 $item = explode(
"_", $item);
1842 $user_id = $item[1];
1844 if (!array_key_exists($ass_id, $ass_tmp)) {
1845 if ($this->assignment &&
1846 $ass_id == $this->assignment->getId()) {
1853 $map[$ass_id][] = $user_id;
1856 return array($map, $ass_tmp);
1864 $this->ctrl->saveParameter($this,
"part_id");
1867 if ((
bool)
$_GET[
"dn"]) {
1868 ilUtil::sendSuccess($this->lng->txt(
"settings_saved"),
true);
1869 $this->ctrl->redirect($this, $this->assignment
1871 :
"showParticipant");
1875 if ($_GET[
"idlid"]) {
1877 if (is_array($tmp)) {
1879 echo $form->getHTML() .
1880 $tpl->getOnLoadCodeForAsynch();
1886 foreach (array_keys(
$_POST) as $id) {
1887 if (substr($id, 0, 3) ==
"dl_") {
1888 $tmp[] = substr($id, 3);
1898 if (
$valid = $form->checkInput()) {
1899 foreach ($users as $ass_id => $users) {
1900 $ass = $ass_map[$ass_id];
1905 foreach ($users as $user_id) {
1906 $date_field = $form->getItemByPostVar(
"dl_" . $ass_id .
"_" . $user_id);
1911 $res[$ass_id][$user_id] = $date_field->getDate();
1918 $form->setValuesByPost();
1919 echo $form->getHTML() .
1920 $tpl->getOnLoadCodeForAsynch();
1922 foreach (
$res as $ass_id => $users) {
1923 $ass = $ass_map[$ass_id];
1925 foreach ($users as $id => $date) {
1926 $ass->setIndividualDeadline($id, $date);
1929 $ass->recalculateLateSubmissions();
1942 $form->setFormAction($this->ctrl->getFormAction($this));
1943 $form->setName(
"ilExcIDlForm");
1945 foreach ($ids as $ass_id => $users) {
1946 $ass = $a_ass_map[$ass_id];
1949 $section->setTitle($ass->getTitle());
1954 $values = $ass->getIndividualDeadlines();
1956 foreach ($users as $id) {
1958 if (is_numeric($id)) {
1965 $team_id = (int) substr($id, 1);
1966 if (array_key_exists($team_id, $teams)) {
1968 foreach ($teams[$team_id]->getMembers() as $member_id) {
1970 $name[] = $uname[
"lastname"] .
", " . $uname[
"firstname"];
1978 $dl->setShowTime(
true);
1979 $dl->setRequired(
true);
1980 $form->addItem($dl);
1982 if (array_key_exists($id, $values)) {
1988 $form->addCommandButton(
"", $this->lng->txt(
"save"));
1998 if ($this->assignment) {
2007 if (
$_POST[
"filter_status"]) {
2011 if (
$_POST[
"filter_feedback"]) {
2015 $this->lng->loadLanguageModule(
"search");
2017 $this->toolbar->setFormAction($this->ctrl->getFormAction($this,
"listTextAssignment"));
2021 if (
$_POST[
"filter_status"]) {
2025 $si_status =
new ilSelectInputGUI($this->lng->txt(
"exc_tbl_status"),
"filter_status");
2027 "" => $this->lng->txt(
"search_any"),
2028 self::GRADE_NOT_GRADED => $this->lng->txt(
"exc_notgraded"),
2029 self::GRADE_PASSED => $this->lng->txt(
"exc_passed"),
2030 self::GRADE_FAILED => $this->lng->txt(
"exc_failed")
2032 $si_status->setOptions($options);
2033 $si_status->setValue($this->
filter[
"status"]);
2035 $si_feedback =
new ilSelectInputGUI($this->lng->txt(
"feedback"),
"filter_feedback");
2037 self::FEEDBACK_FULL_SUBMISSION => $this->lng->txt(
"submissions_feedback"),
2038 self::FEEDBACK_ONLY_SUBMISSION => $this->lng->txt(
"submissions_only")
2041 $si_feedback->setValue($this->
filter[
"feedback"]);
2043 $this->toolbar->addInputItem($si_status,
true);
2047 if ($this->assignment->getPeerReview()) {
2048 if (
$_POST[
"filter_feedback"]) {
2051 $this->
filter[
"feedback"] =
"submission_feedback";
2054 $si_feedback =
new ilSelectInputGUI($this->lng->txt(
"feedback"),
"filter_feedback");
2056 "submission_feedback" => $this->lng->txt(
"submissions_feedback"),
2057 "submission_only" => $this->lng->txt(
"submissions_only")
2060 $si_feedback->setValue($this->
filter[
"feedback"]);
2062 $this->toolbar->addInputItem($si_feedback,
true);
2067 $submit->setCaption(
"filter");
2068 $submit->setCommand(
"listTextAssignment");
2069 $this->toolbar->addButtonInstance($submit);
2079 $ass_id = (int)
$_GET[
"ass_id"];
2080 $member_id = (int)
$_GET[
"member_id"];
2084 $last_opening = $submission->getLastOpeningHTMLView();
2086 $submission_time = $submission->getLastSubmission();
2092 list($obj_date, $obj_id) = explode(
"_", basename($zip_original_full_path));
2094 $obj_dir = $this->assignment->getAssignmentType()->getStringIdentifier() .
"_" . $obj_id;
2097 DIRECTORY_SEPARATOR .
2099 DIRECTORY_SEPARATOR .
2100 dirname($zip_internal_path) .
2101 DIRECTORY_SEPARATOR .
2103 DIRECTORY_SEPARATOR .
2108 $web_filesystem = $DIC->filesystem()->web();
2110 if ($last_opening > $submission_time && $web_filesystem->has($index_html_file)) {
2113 if ($zip_original_full_path) {
2114 $file_copied = $this->
copyFileToWebDir($zip_original_full_path, $zip_internal_path);
2119 $web_filesystem->delete($zip_internal_path);
2122 $submission_repository->updateWebDirAccessTime($this->assignment->getId(), $member_id);
2127 $error_msg = $this->lng->txt(
"exc_copy_zip_error");
2131 $error_msg = $this->lng->txt(
"exc_find_zip_error");
2144 $submitted = $submission->
getFiles();
2146 if (count($submitted) > 0) {
2147 $submitted = array_pop($submitted);
2149 return $submitted[
'filename'];
2161 protected function copyFileToWebDir(
string $origin_path_filename,
string $internal_file_path) : ?string
2165 $web_filesystem = $DIC->filesystem()->web();
2166 $data_filesystem = $DIC->filesystem()->storage();
2168 $internal_dirs = dirname($internal_file_path);
2169 $zip_file = basename($internal_file_path);
2171 if ($data_filesystem->has($internal_file_path)) {
2172 if (!$web_filesystem->hasDir($internal_dirs)) {
2173 $web_filesystem->createDir($internal_dirs);
2176 if (!$web_filesystem->has($internal_file_path)) {
2177 $stream = $data_filesystem->readStream($internal_file_path);
2178 $web_filesystem->writeStream($internal_file_path, $stream);
2180 return ILIAS_ABSOLUTE_PATH .
2181 DIRECTORY_SEPARATOR .
2183 DIRECTORY_SEPARATOR .
2185 DIRECTORY_SEPARATOR .
2187 DIRECTORY_SEPARATOR .
2202 list($external_path, $internal_file_path) = explode(
CLIENT_ID .
"/", $external_file_path);
2204 return $internal_file_path;
2213 $this->tabs_gui->clearTargets();
2214 $this->tabs_gui->setBackTarget(
2215 $this->lng->txt(
"back"),
2216 $this->ctrl->getLinkTarget($this,
"members")
2227 $uname =
$user->getFirstname() .
" " .
$user->getLastname();
2230 "uid" => $a_data[
"user_id"],
2232 "udate" => $a_data[
"ts"],
2238 $data[
"peer"] = array();
2239 foreach ($peer_review->getPeerReviewsByPeerId($a_data[
'user_id']) as $key => $value) {
2240 $data[
"peer"][] = $value[
'giver_id'];
2244 $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 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 unzip(string $path_to_zip_file, bool $overwrite_existing=false, bool $unpack_flat=false)
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.