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"]) {
 
  244                $back_cmd = 
"showParticipant";
 
  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() .
 
  435                $this->initIndividualDeadlineModal()
 
  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");
 
  473        $exc_tab->resetOffset();
 
  474        $exc_tab->writeFilterToSession();
 
  482        $exc_tab->resetOffset();
 
  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'), 
"#")
 
  521            ->withOnLoadCode(
function ($id) {
 
  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());
 
  535        $members = $members_filter->filterParticipantsByAccess();
 
  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"), 
'#')
 
  778            ->withOnLoadCode(
function ($id) use ($form_id) {
 
  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() .
 
  967                $this->initIndividualDeadlineModal());
 
  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");
 
 1249        $storage->deleteUserSubmissionDirectory($user_id);
 
 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 == 
"") {
 
 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"));
 
 1702        $fi->setSuffixes(array(
"zip"));
 
 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")
 
 2040        $si_feedback->setOptions($options);
 
 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")
 
 2059            $si_feedback->setOptions($options);
 
 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"]);
 
if(!defined('PATH_SEPARATOR')) $GLOBALS['_PEAR_default_error_mode']
An exception for terminatinating execution or to throw for unit testing.
static initDateTimePicker()
This class represents an option in a checkbox group.
Confirmation screen class.
static formatDate(ilDateTime $date, $a_skip_day=false, $a_include_wd=false, $include_seconds=false)
Format a date @access public.
@classDescription Date and time handling
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.
Download submissions and feedback for exercises.
static getAdoptableGroups($a_exc_ref_id)
static getGroupMembersMap($a_exc_ref_id)
static getAssignmentTeamMap($a_ass_id)
Get team structure for assignment.
static getInstanceByUserId($a_assignment_id, $a_user_id, $a_create_on_demand=false)
static getInstancesFromMap($a_assignment_id)
static getInstancesByExercise($a_exc_id)
static getAssignmentDataOfExercise($a_exc_id)
Get assignments data of an exercise in an array.
static lookupTitle($a_id)
Lookup title.
Exercise participant table.
Exercise participant table.
Object-based submissions (ends up as static file)
Exercise submission //TODO: This class has to much static methods related to delivered "files".
static downloadAllAssignmentFiles(ilExAssignment $a_ass, array $members, $to_path)
Download all submitted files of an assignment (all user)
static getAssignmentFilesByUsers(int $a_exc_id, int $a_ass_id, array $a_users)
static getAssignmentParticipants(int $a_exercise_id, int $a_ass_id)
getFiles(array $a_file_ids=null, $a_only_valid=false, $a_min_timestamp=null)
Get submission items (not only files)
Exercise exceptions class.
Class ilExerciseManagementGUI.
collectFeedbackDataFromPeer(array $a_data)
initIndividualDeadlineModal()
initIndividualDeadlineForm(array $a_ass_map, array $ids)
selectAssignmentObject()
Select assignment.
exportExcelObject()
Export as excel.
copyFileToWebDir(string $origin_path_filename, string $internal_file_path)
Generate the directories and copy the file if necessary.
redirectFeedbackMailObject()
set feedback status for member and redirect to mail screen
showParticipantResetObject()
confirmDeassignMembersObject()
Confirm deassigning members.
addSubTabs($a_activate)
adds tabs to tab gui object
initMultiFeedbackForm($a_ass_id)
uploadMultiFeedbackObject()
Upload multi feedback file.
getMultiActionUserIds($a_keep_teams=false)
sendMembersObject()
Send assignment per mail to participants.
saveStatusAllObject(array $a_selected=null, $a_redirect=true)
showMultiFeedbackObject(ilPropertyFormGUI $a_form=null)
Show multi-feedback screen.
saveStatusParticipantObject(array $a_selected=null)
Save assignment status (participant view)
adoptTeamsFromGroupObject(ilPropertyFormGUI $a_form=null)
saveEvaluationFromModalObject()
Save assignment submission grade(status) and comment from the roundtrip modal.
getSubmissionZipFilePath(ilExSubmission $submission)
Returns the ZIP file path from outside web directory.
deassignMembersObject()
Deassign members from exercise.
saveStatusSelectedObject()
openSubmissionViewObject()
Open HTML view for portfolio submissions.
showMultiFeedbackConfirmationTableObject()
Show multi feedback confirmation table.
saveMultiFeedbackObject()
Save multi feedback.
setIndividualDeadlineObject()
downloadSubmissionsObject()
getWebFilePathFromExternalFilePath(string $external_file_path)
Get the object specific file path from an external full file path.
cancelMultiFeedbackObject()
Cancel Multi Feedback.
membersObject()
All participants and submission of one assignment.
parseIndividualDeadlineData(array $a_data)
showGradesOverviewObject()
Show grades overview.
addUserFromAutoCompleteObject()
Add user as member.
compareTextAssignmentsObject()
TODO -> Deal with the redirection after update the grade via action button.
listTextAssignmentObject()
todo: Pagination.
selectParticipantObject()
Select participant.
__construct(ilExerciseInternalService $service, ilExAssignment $a_ass=null)
Constructor.
showParticipantObject()
Show Participant.
saveGradesObject()
Save grades.
downloadAllObject()
Download all submitted files (of all members).
const FEEDBACK_ONLY_SUBMISSION
removeUserSubmissionFilesFromWebDir(int $user_id)
downloadMultiFeedbackZipObject()
Download multi-feedback structrue file.
handleIndividualDeadlineCallsObject()
addMembersObject($a_user_ids=array())
Add new partipant.
showParticipantApplyObject()
saveStatus(array $a_data, $a_redirect=true)
Save status of selecte members.
const FEEDBACK_FULL_SUBMISSION
saveCommentForLearnersObject()
Save comment for learner (asynch)
createTeamsFromGroupsObject()
getEvaluationModal($a_data)
Class ilExerciseMembersFilter.
File System Explorer GUI class.
static _getLink($a_ref_id, $a_type='', $a_params=array(), $append="")
static getLogger($a_component_id)
Get component logger.
static getInstance()
Get instance.
This class represents a non editable value in a property form.
static _lookupLogin($a_user_id)
lookup login
static _lookupId($a_user_str)
Lookup id by login.
static _lookupName($a_user_id)
lookup user name
static getInstanceByObjId($a_obj_id, $stop_on_error=true)
get an instance of an Ilias object by object id
static _exists($a_id, $a_reference=false, $a_type=null)
checks if an object exists in object_data@access public
static _lookupType($a_id, $a_reference=false)
lookup object type
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 fillAutoCompleteToolbar($parent_object, ilToolbarGUI $toolbar=null, $a_options=array(), $a_sticky=false)
fill toolbar with
special template class to simplify handling of ITX/PEAR
This class represents a text area property in a property form.
This class represents a text property in a property form.
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:
static sortArray( $array, $a_array_sortby, $a_array_sortorder=0, $a_numeric=false, $a_keep_keys=false)
sortArray
static redirect($a_script)
static sendFailure($a_info="", $a_keep=false)
Send Failure Message to Screen.
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 sendInfo($a_info="", $a_keep=false)
Send Info Message to Screen.
static stripSlashesArray($a_arr, $a_strip_html=true, $a_allow="")
Strip slashes from array.
static signFolderOfStartFile($start_file_path)
$a
thx to https://mlocati.github.io/php-cs-fixer-configurator for the examples
foreach($_POST as $key=> $value) $res