57 bool $a_enable_peer_review_completion_settings,
63 $this->
ctrl = $DIC->ctrl();
64 $this->
tabs = $DIC->tabs();
65 $this->
lng = $DIC->language();
66 $this->tpl =
$DIC[
"tpl"];
67 $this->
toolbar = $DIC->toolbar();
69 $this->
help = $DIC[
"ilHelp"];
70 $this->exercise_id = $a_exercise_id;
71 $this->assignment = $a_ass;
72 $this->enable_peer_review_completion = $a_enable_peer_review_completion_settings;
75 $request =
$DIC->exercise()->internal()->gui()->request();
76 $this->exc = $request->getExercise();
77 $this->requested_ass_type = $request->getAssType();
78 $this->requested_type = $request->getType();
79 $this->random_manager =
$DIC->exercise()->internal()->domain()->assignment()->randomAssignments(
80 $request->getExercise()
82 $this->requested_ass_ids = $request->getAssignmentIds();
83 $this->requested_order = $request->getOrder();
95 $class = $ilCtrl->getNextClass($this);
96 $cmd = $ilCtrl->getCmd(
"listAssignments");
99 case "ilpropertyformgui":
101 $ilCtrl->forwardCommand($form);
105 case "ilexassignmentfilesystemgui":
107 $ilTabs->activateTab(
"ass_files");
112 $fs_gui->setTitle(
$lng->
txt(
"exc_instruction_files"));
113 $fs_gui->setTableId(
"excassfil" . $this->assignment->getId());
114 $fs_gui->setAllowDirectories(
false);
115 $ilCtrl->forwardCommand($fs_gui);
118 case "ilexpeerreviewgui":
119 $ilTabs->clearTargets();
120 $ilTabs->setBackTarget(
122 $ilCtrl->getLinkTarget($this,
"listAssignments")
126 $ilCtrl->forwardCommand($peer_gui);
130 $this->{$cmd .
"Object"}();
146 $ilToolbar->setFormAction($ilCtrl->getFormAction($this,
"addAssignment"));
151 $button->setCaption(
"exc_add_assignment");
152 $button->setCommand(
"addAssignment");
153 $ilToolbar->addStickyItem($button);
170 $this->assignment =
null;
172 if ($this->requested_type == 0) {
173 $ilCtrl->
redirect($this,
"listAssignments");
188 foreach ($this->types->getAllAllowed($this->exc) as $k => $t) {
189 $types[$k] = $t->getTitle();
194 $ty->setRequired(
true);
203 string $a_mode =
"create"
208 $ass_type = $this->types->getById($a_type);
209 $ass_type_gui = $this->type_guis->getById($a_type);
214 if ($a_mode ==
"edit") {
215 $form->setTitle(
$lng->
txt(
"exc_edit_assignment"));
217 $form->setTitle(
$lng->
txt(
"exc_new_assignment"));
219 $form->setFormAction($ilCtrl->getFormAction($this));
223 $ti->setMaxLength(200);
224 $ti->setRequired(
true);
229 $ty->setValue($a_type);
230 $ty->setDisabled(
true);
237 $ass_type_gui->addEditFormCustomProperties($form);
243 if ($ass_type->usesTeams()) {
244 if ($a_mode ==
"edit") {
255 $lng->
txt(
"exc_team_by_participants"),
257 $lng->
txt(
"exc_team_by_participants_info")
261 $lng->
txt(
"exc_team_by_tutors"),
263 $lng->
txt(
"exc_team_by_tutors_info")
270 $rd_creation_method->setRequired(
true);
271 $rd_creation_method->setValue(
"0");
275 $lng->
txt(
"exc_team_by_tutors_manual"),
277 $lng->
txt(
"exc_team_by_tutors_manual_info")
279 $rd_creation_method->addOption($rd_creation_manual);
284 $add_info =
" <strong>" .
$lng->
txt(
"exc_team_by_random_add_info") .
"</strong>";
287 $lng->
txt(
"exc_team_by_random"),
289 $lng->
txt(
"exc_team_by_random_info") .
"<br>" .
$lng->
txt(
"exc_total_members") .
": " . $this->getExerciseTotalMembers() . $add_info
291 $rd_creation_method->addOption($rd_creation_random);
294 $number_teams->setSize(3);
295 $number_teams->setMinValue(1);
297 $number_teams->setRequired(
true);
298 $number_teams->setSuffix(
$lng->
txt(
"exc_team_assignment_adopt_teams"));
299 $rd_creation_random->addSubItem($number_teams);
301 $min_team_participants =
new ilNumberInputGUI(
$lng->
txt(
"exc_min_team_participants"),
"min_participants_team");
302 $min_team_participants->setSize(3);
303 $min_team_participants->setMinValue(1);
305 $min_team_participants->setRequired(
true);
306 $min_team_participants->setSuffix(
$lng->
txt(
"exc_participants"));
307 $rd_creation_random->addSubItem($min_team_participants);
309 $max_team_participants =
new ilNumberInputGUI(
$lng->
txt(
"exc_max_team_participants"),
"max_participants_team");
310 $max_team_participants->setSize(3);
311 $max_team_participants->setMinValue(1);
313 $max_team_participants->setRequired(
true);
314 $max_team_participants->setSuffix(
$lng->
txt(
"exc_participants"));
315 $rd_creation_random->addSubItem($max_team_participants);
318 if (count($options)) {
320 $lng->
txt(
"exc_team_by_assignment"),
322 $lng->
txt(
"exc_team_by_assignment_info")
326 $radio_assignment_adopt->setRequired(
true);
327 $radio_assignment_adopt->addOption(
new ilRadioOption(
$lng->
txt(
"exc_team_assignment_adopt_none"), -1));
329 foreach ($options as
$id => $item) {
331 $option->setInfo(
$lng->
txt(
"exc_team_assignment_adopt_teams") .
": " . $item[
"teams"]);
332 $radio_assignment_adopt->addOption($option);
334 $radio_assignment->addSubItem($radio_assignment_adopt);
335 $rd_creation_method->addOption($radio_assignment);
338 $radio_tutors->addSubItem($rd_creation_method);
340 $rd_team->addOption($radio_participants);
341 $rd_team->addOption($radio_tutors);
345 $form->addItem($rd_team);
348 $rd_team->setDisabled(
true);
353 if (!$this->random_manager->isActivated()) {
355 $cb->setInfo(
$lng->
txt(
"exc_mandatory_info"));
356 $cb->setChecked(
true);
361 $ne->setValue(
$lng->
txt(
"exc_mandatory_rand_determined"));
367 $sub_header->setTitle(
$lng->
txt(
"exc_work_instructions"));
368 $form->addItem($sub_header);
371 $desc_input->setRows(20);
373 $desc_input->setUseRte(
true);
374 $desc_input->setRteTagSet(
"mini");
376 $form->addItem($desc_input);
379 if ($a_mode ==
"create") {
381 $files->setFilenames(array(0 =>
''));
382 $form->addItem($files);
387 $sub_header->setTitle(
$lng->
txt(
"exc_schedule"));
388 $form->addItem($sub_header);
392 $start_date->setShowTime(
true);
393 $form->addItem($start_date);
399 $radg->addOption($op1);
401 $radg->addOption($op2);
402 $form->addItem($radg);
406 $deadline->setShowTime(
true);
407 $op1->addSubItem($deadline);
411 $deadline2->setInfo(
$lng->
txt(
"exc_deadline_extended_info"));
412 $deadline2->setShowTime(
true);
413 $deadline->addSubItem($deadline2);
417 $rmd_submit =
new ilCheckboxInputGUI($this->
lng->txt(
"exc_reminder_submit_setting"),
"rmd_submit_status");
419 $rmd_submit_start =
new ilNumberInputGUI($this->
lng->txt(
"exc_reminder_start"),
"rmd_submit_start");
420 $rmd_submit_start->setSize(3);
421 $rmd_submit_start->setMaxLength(3);
422 $rmd_submit_start->setSuffix(
$lng->
txt(
'days'));
423 $rmd_submit_start->setInfo($this->
lng->txt(
"exc_reminder_start_info"));
424 $rmd_submit_start->setRequired(
true);
425 $rmd_submit_start->setMinValue(1);
426 $rmd_submit->addSubItem($rmd_submit_start);
428 $rmd_submit_frequency =
new ilNumberInputGUI($this->
lng->txt(
"exc_reminder_frequency"),
"rmd_submit_freq");
429 $rmd_submit_frequency->setSize(3);
430 $rmd_submit_frequency->setMaxLength(3);
431 $rmd_submit_frequency->setSuffix(
$lng->
txt(
'days'));
432 $rmd_submit_frequency->setRequired(
true);
433 $rmd_submit_frequency->setMinValue(1);
434 $rmd_submit->addSubItem($rmd_submit_frequency);
437 $rmd_submit_end->setRequired(
true);
438 $rmd_submit->addSubItem($rmd_submit_end);
443 $rmd_grade =
new ilCheckboxInputGUI($this->
lng->txt(
"exc_reminder_grade_setting"),
"rmd_grade_status");
445 $rmd_grade_frequency =
new ilNumberInputGUI($this->
lng->txt(
"exc_reminder_frequency"),
"rmd_grade_freq");
446 $rmd_grade_frequency->setSize(3);
447 $rmd_grade_frequency->setMaxLength(3);
448 $rmd_grade_frequency->setSuffix(
$lng->
txt(
'days'));
449 $rmd_grade_frequency->setRequired(
true);
450 $rmd_grade_frequency->setMinValue(1);
451 $rmd_grade->addSubItem($rmd_grade_frequency);
454 $rmd_grade_end->setRequired(
true);
455 $rmd_grade->addSubItem($rmd_grade_end);
459 $form->addItem($rmd_submit);
460 $form->addItem($rmd_grade);
465 $ti->setRequired(
true);
466 $ti->setMaxLength(3);
467 $ti->setSuffix(
$lng->
txt(
"days"));
469 $op2->addSubItem($ti);
473 $last_submission->setInfo(
$lng->
txt(
"exc_rel_last_submission_info"));
474 $last_submission->setShowTime(
true);
475 $op2->addSubItem($last_submission);
480 if ($ass_type->usesFileUpload()) {
482 $sub_header->setTitle($ass_type->getTitle());
483 $form->addItem($sub_header);
485 $form->addItem($max_file_tgl);
488 $max_file->setInfo(
$lng->
txt(
"exc_max_file_info"));
489 $max_file->setRequired(
true);
490 $max_file->setSize(3);
491 $max_file->setMinValue(1);
492 $max_file_tgl->addSubItem($max_file);
497 $sub_header->setTitle(
$lng->
txt(
"exc_after_submission"));
498 $form->addItem($sub_header);
500 if (!$ass_type->usesTeams() && !$this->random_manager->isActivated()) {
503 $peer->setInfo(
$lng->
txt(
"exc_peer_review_ass_setting_info"));
504 $form->addItem($peer);
514 $fb_file->setRequired(
true);
516 $fb->addSubItem($fb_file);
519 $fb_date->setRequired(
true);
525 $fb_date_custom_date->setRequired(
true);
526 $fb_date_custom_date->setShowTime(
true);
528 $fb_date_custom_option->addSubItem($fb_date_custom_date);
529 $fb_date->addOption($fb_date_custom_option);
532 $fb->addSubItem($fb_date);
535 $fb_cron->setInfo(
$lng->
txt(
"exc_global_feedback_file_cron_info"));
536 $fb->addSubItem($fb_cron);
539 if ($a_mode ==
"create") {
540 $form->addCommandButton(
"saveAssignment",
$lng->
txt(
"save"));
542 $form->addCommandButton(
"updateAssignment",
$lng->
txt(
"save"));
544 $form->addCommandButton(
"listAssignments",
$lng->
txt(
"cancel"));
553 $post_var =
"rmd_" . $a_reminder_type .
"_template_id";
556 $r_group->setRequired(
true);
557 $r_group->addOption(
new ilRadioOption($this->
lng->txt(
"exc_reminder_mail_no_tpl"), 0));
558 $r_group->setValue(0);
560 switch ($a_reminder_type) {
575 $templateService =
$DIC[
'mail.texttemplates.service'];
576 foreach ($templateService->loadTemplatesForContextId(
$context->getId()) as $template) {
577 $r_group->addOption(
new ilRadioOption($template->getTitle(), $template->getTplId()));
578 if ($template->isDefault()) {
579 $r_group->setValue($template->getTplId());
596 $protected_peer_review_groups =
false;
598 if ($this->assignment) {
599 if ($this->assignment->getPeerReview()) {
601 if ($peer_review->hasPeerReviewGroups()) {
602 $protected_peer_review_groups =
true;
606 if ($this->assignment->getFeedbackFile()) {
612 if ($protected_peer_review_groups) {
620 $ass_type = $this->types->getById(
$type);
625 $time_start = $time_start
629 $time_fb_custom_date = $a_form->
getItemByPostVar(
"fb_date_custom")->getDate();
630 $time_fb_custom_date = $time_fb_custom_date
634 $reminder_submit_end_date = $a_form->
getItemByPostVar(
"rmd_submit_end")->getDate();
635 $reminder_submit_end_date = $reminder_submit_end_date
639 $reminder_grade_end_date = $a_form->
getItemByPostVar(
"rmd_grade_end")->getDate();
640 $reminder_grade_end_date = $reminder_grade_end_date
644 $time_deadline =
null;
645 $time_deadline_ext =
null;
649 $time_deadline = $time_deadline
653 $time_deadline_ext = $time_deadline_ext
660 if ($protected_peer_review_groups) {
661 $time_deadline = $this->assignment->getDeadline();
662 $time_deadline_ext = $this->assignment->getExtendedDeadline();
666 if (!$time_deadline) {
668 if (!$protected_peer_review_groups &&
671 ->setAlert(
$lng->txt(
"exc_needs_fixed_deadline"));
678 ->setAlert(
$lng->txt(
"exc_needs_deadline"));
684 $time_deadline_max = max($time_deadline, $time_deadline_ext);
685 $peer_dl = $this->assignment
686 ? $this->assignment->getPeerReviewDeadline()
688 if ($peer_dl && $peer_dl < $time_deadline_max) {
692 ->setAlert(
$lng->txt(
"exc_peer_deadline_mismatch"));
697 if ($time_deadline_ext && $time_deadline_ext < $time_deadline) {
699 ->setAlert(
$lng->txt(
"exc_deadline_ext_mismatch"));
703 $time_deadline_min = $time_deadline_ext
704 ? min($time_deadline, $time_deadline_ext)
708 if ($time_start && $time_deadline_min && $time_start > $time_deadline_min) {
710 ->setAlert(
$lng->txt(
"exc_start_date_should_be_before_end_date"));
715 if ($ass_type->usesTeams()) {
718 $team_validation = $this->validationTeamsFormation(
720 $a_form->
getInput(
"min_participants_team"),
721 $a_form->
getInput(
"max_participants_team")
723 if ($team_validation[
'status'] ==
'error') {
725 ->setAlert($team_validation[
'msg']);
727 ->setAlert(
$lng->txt(
"exc_value_can_not_set"));
736 ,
"title" => trim($a_form->
getInput(
"title"))
737 ,
"instruction" => trim($a_form->
getInput(
"instruction"))
739 ,
"start" => $time_start
740 ,
"deadline" => $time_deadline
741 ,
"deadline_ext" => $time_deadline_ext
742 ,
"max_file" => $a_form->
getInput(
"max_file_tgl")
746 if (!$this->random_manager->isActivated()) {
750 $res[
'team_creator'] = $a_form->
getInput(
"team_creator");
751 $res[
"team_creation"] = $a_form->
getInput(
"team_creation");
754 $res[
"number_teams"] = $a_form->
getInput(
"number_teams");
755 $res[
"min_participants_team"] = $a_form->
getInput(
"min_participants_team");
756 $res[
"max_participants_team"] = $a_form->
getInput(
"max_participants_team");
762 $res[
"deadline_mode"] = $a_form->
getInput(
"deadline_mode");
765 $res[
"relative_deadline"] = $a_form->
getInput(
"relative_deadline");
766 $rel_deadline_last_subm = $a_form->
getItemByPostVar(
"rel_deadline_last_subm")->getDate();
767 $rel_deadline_last_subm = $rel_deadline_last_subm
770 $res[
"rel_deadline_last_subm"] = $rel_deadline_last_subm;
775 $protected_peer_review_groups) {
780 if (isset($_FILES[
"files"])) {
783 $res[
"files"] = $_FILES[
"files"];
791 $res[
"fb_date_custom"] = $time_fb_custom_date;
793 if ($_FILES[
"fb_file"][
"tmp_name"]) {
794 $res[
"fb_file"] = $_FILES[
"fb_file"];
797 if ($a_form->
getInput(
"rmd_submit_status")) {
798 $res[
"rmd_submit_status"] =
true;
799 $res[
"rmd_submit_start"] = $a_form->
getInput(
"rmd_submit_start");
800 $res[
"rmd_submit_freq"] = $a_form->
getInput(
"rmd_submit_freq");
801 $res[
"rmd_submit_end"] = $reminder_submit_end_date;
802 $res[
"rmd_submit_template_id"] = $a_form->
getInput(
"rmd_submit_template_id");
804 if ($a_form->
getInput(
"rmd_grade_status")) {
805 $res[
"rmd_grade_status"] =
true;
806 $res[
"rmd_grade_freq"] = $a_form->
getInput(
"rmd_grade_freq");
807 $res[
"rmd_grade_end"] = $reminder_grade_end_date;
808 $res[
"rmd_grade_template_id"] = $a_form->
getInput(
"rmd_grade_template_id");
813 $this->tpl->setOnScreenMessage(
'failure',
$lng->txt(
"form_input_not_valid"));
829 $is_create = !(bool) $a_ass->
getId();
831 $a_ass->
setTitle($a_input[
"title"]);
833 if (!$this->random_manager->isActivated()) {
845 $a_ass->
setTeamTutor((
bool) ($a_input[
"team_creator"] ??
false));
852 if (!$this->random_manager->isActivated()) {
867 if (isset($a_input[
"fb"])) {
878 if (is_array($a_input[
"files"])) {
883 if (!isset($a_input[
"fb"])) {
892 if (isset($a_input[
"fb"], $a_input[
"fb_file"])) {
896 $this->importFormToAssignmentReminders($a_input, $a_ass->
getId());
904 $this->saveReminderData($reminder, $a_input);
907 $this->saveReminderData($reminder, $a_input);
916 $this->saveReminderData($reminder, $a_input);
923 if ($reminder->getReminderStatus() === null) {
928 $type = $reminder->getReminderType();
929 $reminder->setReminderStatus((
bool) ($a_input[
"rmd_" .
$type .
"_status"] ??
false));
930 $reminder->setReminderStart((
int) ($a_input[
"rmd_" .
$type .
"_start"] ?? 0));
931 $reminder->setReminderEnd((
int) ($a_input[
"rmd_" .
$type .
"_end"] ?? 0));
932 $reminder->setReminderFrequency((
int) ($a_input[
"rmd_" .
$type .
"_freq"] ?? 0));
933 $reminder->setReminderMailTemplate((
int) ($a_input[
"rmd_" .
$type .
"_template_id"] ?? 0));
934 $reminder->{$action}();
946 $ilCtrl = $this->ctrl;
949 $this->assignment =
null;
951 $form = $this->initAssignmentForm($this->requested_type,
"create");
952 $input = $this->processForm($form);
953 if (is_array($input)) {
955 $ass->setExerciseId($this->exercise_id);
956 $ass->setType($input[
"type"]);
957 $ass_type_gui = $this->type_guis->getById($ass->getType());
959 $this->importFormToAssignment($ass, $input);
961 $this->generateTeams($ass, $input);
962 $this->tpl->setOnScreenMessage(
'success',
$lng->txt(
"msg_obj_modified"),
true);
964 $ass_type_gui->importFormToAssignment($ass, $form);
967 $this->tpl->setOnScreenMessage(
'success',
$lng->txt(
"msg_obj_modified"),
true);
970 $ilCtrl->setParameter($this,
"ass_id", $ass->getId());
971 $ilCtrl->redirect($this,
"editAssignment");
973 $form->setValuesByPost();
974 $tpl->setContent($form->getHTML());
984 $ilTabs = $this->tabs;
987 $this->setAssignmentHeader();
988 $ilTabs->activateTab(
"ass_settings");
990 $form = $this->initAssignmentForm($this->assignment->getType(),
"edit");
991 $this->getAssignmentValues($form);
992 $tpl->setContent($form->getHTML());
1002 $ilCtrl = $this->ctrl;
1004 $ass_type_gui = $this->type_guis->getById($this->assignment->getType());
1007 $values[
"type"] = $this->assignment->getType();
1008 $values[
"title"] = $this->assignment->getTitle();
1009 $values[
"mandatory"] = $this->assignment->getMandatory();
1010 $values[
"instruction"] = $this->assignment->getInstruction();
1011 if ($this->assignment->getStartTime()) {
1015 if ($this->assignment->getAssignmentType()->usesFileUpload()) {
1016 if ($this->assignment->getMaxFile()) {
1017 $values[
"max_file_tgl"] =
true;
1018 $values[
"max_file"] = $this->assignment->getMaxFile();
1022 if ($this->assignment->getAssignmentType()->usesTeams()) {
1023 $values[
"team_creator"] = (string) (
int) $this->assignment->getTeamTutor();
1024 $values[
"team_creation"] =
"0";
1027 if ($this->assignment->getFeedbackDateCustom()) {
1028 $values[
"fb_date_custom"] =
new ilDateTime($this->assignment->getFeedbackDateCustom(),
IL_CAL_UNIX);
1033 if ($rmd_sub->getReminderStatus()) {
1034 $values[
"rmd_submit_status"] = $rmd_sub->getReminderStatus();
1035 $values[
"rmd_submit_start"] = $rmd_sub->getReminderStart();
1037 $values[
"rmd_submit_freq"] = $rmd_sub->getReminderFrequency();
1038 $values[
"rmd_submit_template_id"] = $rmd_sub->getReminderMailTemplate();
1042 if ($rmd_grade->getReminderStatus()) {
1043 $values[
"rmd_grade_status"] = $rmd_grade->getReminderStatus();
1045 $values[
"rmd_grade_freq"] = $rmd_grade->getReminderFrequency();
1046 $values[
"rmd_grade_template_id"] = $rmd_grade->getReminderMailTemplate();
1049 $type_values = $ass_type_gui->getFormValuesArray($this->assignment);
1050 $values = array_merge($values, $type_values);
1053 $values[
"deadline_mode"] = $this->assignment->getDeadlineMode();
1054 $values[
"relative_deadline"] = $this->assignment->getRelativeDeadline();
1062 if ($this->assignment->getFeedbackFile()) {
1064 $a_form->
getItemByPostVar(
"fb_file")->setValue(basename($this->assignment->getGlobalFeedbackFilePath()));
1068 '<a href="' . $ilCtrl->getLinkTarget($this,
"downloadGlobalFeedbackFile") .
'">' .
1069 $lng->txt(
"download") .
'</a>'
1072 $a_form->
getItemByPostVar(
"fb_cron")->setChecked($this->assignment->hasFeedbackCron());
1073 $a_form->
getItemByPostVar(
"fb_date")->setValue($this->assignment->getFeedbackDate());
1075 $this->handleDisabledFields($a_form,
true);
1084 if ($this->assignment->getDeadline() > 0) {
1087 $ed_item->setDate($edit_date);
1089 if ($this->assignment->getExtendedDeadline() > 0) {
1092 $ed_item->setDate($edit_date);
1096 if ($this->assignment->getPeerReview()) {
1097 $a_form->
getItemByPostVar(
"peer")->setChecked($this->assignment->getPeerReview());
1106 bool $a_force_set_values =
false
1113 $peer_review = null;
1114 if (!$this->assignment->getAssignmentType()->usesTeams() &&
1115 $this->assignment->getPeerReview()) {
1118 if ($peer_review->hasPeerReviewGroups()) {
1129 if ($a_force_set_values ||
1130 ($peer_review && $peer_review->hasPeerReviewGroups())) {
1131 $this->setDisabledFieldValues($a_form);
1144 $ilCtrl = $this->ctrl;
1145 $ilTabs = $this->tabs;
1147 $form = $this->initAssignmentForm($this->assignment->getType(),
"edit");
1148 $input = $this->processForm($form);
1150 $ass_type = $this->assignment->getType();
1151 $ass_type_gui = $this->type_guis->getById($ass_type);
1153 if (is_array($input)) {
1154 $old_deadline = $this->assignment->getDeadline();
1155 $old_ext_deadline = $this->assignment->getExtendedDeadline();
1157 $this->importFormToAssignment($this->assignment, $input);
1158 $this->generateTeams($this->assignment, $input);
1160 $ass_type_gui->importFormToAssignment($this->assignment, $form);
1161 $this->assignment->update();
1163 $new_deadline = $this->assignment->getDeadline();
1164 $new_ext_deadline = $this->assignment->getExtendedDeadline();
1167 if ($old_deadline != $new_deadline ||
1168 $old_ext_deadline != $new_ext_deadline) {
1169 $this->assignment->recalculateLateSubmissions();
1172 $this->tpl->setOnScreenMessage(
'success',
$lng->txt(
"msg_obj_modified"),
true);
1173 $ilCtrl->redirect($this,
"editAssignment");
1175 $this->setAssignmentHeader();
1176 $ilTabs->activateTab(
"ass_settings");
1178 $form->setValuesByPost();
1179 $this->handleDisabledFields($form);
1180 $tpl->setContent($form->getHTML());
1186 $ilCtrl = $this->ctrl;
1190 $ilCtrl->setParameterByClass(ilObjExerciseGUI::class,
"ass_id",
null);
1191 if (count($this->requested_ass_ids) == 0) {
1192 $this->tpl->setOnScreenMessage(
'failure',
$lng->txt(
"no_checkbox"),
true);
1193 $ilCtrl->redirect($this,
"listAssignments");
1196 $cgui->setFormAction($ilCtrl->getFormAction($this));
1197 $cgui->setHeaderText(
$lng->txt(
"exc_conf_del_assignments"));
1198 $cgui->setCancel(
$lng->txt(
"cancel"),
"listAssignments");
1199 $cgui->setConfirm(
$lng->txt(
"delete"),
"deleteAssignments");
1201 foreach ($this->requested_ass_ids as
$i) {
1205 $tpl->setContent($cgui->getHTML());
1215 $ilCtrl = $this->ctrl;
1219 foreach ($this->requested_ass_ids as
$id) {
1221 $ass->delete($this->exc);
1226 $this->tpl->setOnScreenMessage(
'success',
$lng->txt(
"exc_assignments_deleted"),
true);
1228 $ilCtrl->setParameter($this,
"ass_id",
"");
1229 $ilCtrl->redirect($this,
"listAssignments");
1235 $ilCtrl = $this->ctrl;
1239 $this->requested_order
1242 $this->tpl->setOnScreenMessage(
'success',
$lng->txt(
"exc_saved_order"),
true);
1243 $ilCtrl->redirect($this,
"listAssignments");
1249 $ilCtrl = $this->ctrl;
1253 $this->tpl->setOnScreenMessage(
'success',
$lng->txt(
"exc_saved_order"),
true);
1254 $ilCtrl->redirect($this,
"listAssignments");
1259 $ilTabs = $this->tabs;
1261 $ilCtrl = $this->ctrl;
1263 $ilHelp = $this->help;
1265 $tpl->setTitle($this->assignment->getTitle());
1266 $tpl->setDescription(
"");
1268 $ilTabs->clearTargets();
1269 $ilHelp->setScreenIdComponent(
"exc");
1271 $ilTabs->setBackTarget(
1273 $ilCtrl->getLinkTarget($this,
"listAssignments")
1278 $lng->txt(
"settings"),
1279 $ilCtrl->getLinkTarget($this,
"editAssignment")
1282 if (!$this->assignment->getAssignmentType()->usesTeams() &&
1283 $this->assignment->getPeerReview()) {
1286 $lng->txt(
"exc_peer_review"),
1287 $ilCtrl->getLinkTarget($this,
"editPeerReview")
1293 $lng->txt(
"exc_instruction_files"),
1294 $ilCtrl->getLinkTargetByClass(array(
"ilexassignmenteditorgui",
"ilexassignmentfilesystemgui"),
"listFiles")
1300 $ilCtrl = $this->ctrl;
1302 if (!$this->assignment ||
1303 !$this->assignment->getFeedbackFile()) {
1304 $ilCtrl->redirect($this,
"returnToParent");
1317 $ilCtrl = $this->ctrl;
1321 $form->setTitle(
$lng->txt(
"exc_peer_review"));
1322 $form->setFormAction($ilCtrl->getFormAction($this));
1325 $peer_min->setInfo(
$lng->txt(
"exc_peer_review_min_number_info"));
1326 $peer_min->setRequired(
true);
1327 $peer_min->setSize(3);
1328 $peer_min->setValue(2);
1329 $form->addItem($peer_min);
1332 $peer_unlock->addOption(
new ilRadioOption(
$lng->txt(
"exc_peer_review_simple_unlock_active"), 1));
1333 $peer_unlock->addOption(
new ilRadioOption(
$lng->txt(
"exc_peer_review_simple_unlock_inactive"), 0));
1334 $peer_unlock->setRequired(
true);
1335 $peer_unlock->setValue(0);
1336 $form->addItem($peer_unlock);
1338 if ($this->enable_peer_review_completion) {
1341 $option->setInfo(
$lng->txt(
"exc_peer_review_completion_none_info"));
1342 $peer_cmpl->addOption($option);
1344 $option->setInfo(
$lng->txt(
"exc_peer_review_completion_one_info"));
1345 $peer_cmpl->addOption($option);
1347 $option->setInfo(
$lng->txt(
"exc_peer_review_completion_all_info"));
1348 $peer_cmpl->addOption($option);
1349 $peer_cmpl->setRequired(
true);
1351 $form->addItem($peer_cmpl);
1355 $peer_dl->setInfo(
$lng->txt(
"exc_peer_review_deadline_info"));
1356 $peer_dl->setShowTime(
true);
1357 $form->addItem($peer_dl);
1360 $peer_prsl->setInfo(
$lng->txt(
"exc_peer_review_personal_info"));
1361 $form->addItem($peer_prsl);
1364 $rmd_feedback =
new ilCheckboxInputGUI($this->
lng->txt(
"exc_reminder_feedback_setting"),
"rmd_peer_status");
1366 $rmd_submit_start =
new ilNumberInputGUI($this->
lng->txt(
"exc_reminder_feedback_start"),
"rmd_peer_start");
1367 $rmd_submit_start->setSize(3);
1368 $rmd_submit_start->setMaxLength(3);
1369 $rmd_submit_start->setSuffix(
$lng->txt(
'days'));
1370 $rmd_submit_start->setRequired(
true);
1371 $rmd_submit_start->setMinValue(1);
1372 $rmd_feedback->addSubItem($rmd_submit_start);
1374 $rmd_submit_frequency =
new ilNumberInputGUI($this->
lng->txt(
"exc_reminder_frequency"),
"rmd_peer_freq");
1375 $rmd_submit_frequency->setSize(3);
1376 $rmd_submit_frequency->setMaxLength(3);
1377 $rmd_submit_frequency->setSuffix(
$lng->txt(
'days'));
1378 $rmd_submit_frequency->setRequired(
true);
1379 $rmd_submit_frequency->setMinValue(1);
1380 $rmd_feedback->addSubItem($rmd_submit_frequency);
1383 $rmd_submit_end->setRequired(
true);
1384 $rmd_feedback->addSubItem($rmd_submit_end);
1388 $form->addItem($rmd_feedback);
1393 $form->addItem($cats);
1398 $cats->addOption($def);
1401 $def->addSubItem($peer_text);
1404 $peer_char->setInfo(
$lng->txt(
"exc_peer_review_min_chars_info"));
1405 $peer_char->setSize(3);
1406 $peer_text->addSubItem($peer_char);
1409 $def->addSubItem($peer_rating);
1412 $peer_file->setInfo(
$lng->txt(
"exc_peer_review_file_info"));
1413 $def->addSubItem($peer_file);
1418 if (
sizeof($cat_objs)) {
1419 foreach ($cat_objs as $cat_obj) {
1423 if (
sizeof($crits)) {
1425 foreach ($crits as $crit) {
1426 $titles[] = $crit->getTitle();
1428 $opt =
new ilRadioOption($cat_obj->getTitle(), $cat_obj->getId());
1429 $opt->setInfo(implode(
", ", $titles));
1430 $cats->addOption($opt);
1435 $url = $ilCtrl->getLinkTargetByClass(
"ilexccriteriacataloguegui",
"");
1436 $def->setInfo(
'<a href="' .
$url .
'">[+] ' .
1437 $lng->txt(
"exc_add_criteria_catalogue") .
1442 $form->addCommandButton(
"updatePeerReview",
$lng->txt(
"save"));
1443 $form->addCommandButton(
"editAssignment",
$lng->txt(
"cancel"));
1453 $ilTabs = $this->tabs;
1456 $this->setAssignmentHeader();
1457 $ilTabs->activateTab(
"peer_settings");
1459 if ($a_form ===
null) {
1460 $a_form = $this->initPeerReviewForm();
1461 $this->getPeerReviewValues($a_form);
1473 if ($this->assignment->getPeerReviewDeadline() > 0) {
1478 if ($reminder->getReminderStatus()) {
1479 $values[
"rmd_peer_status"] = $reminder->getReminderStatus();
1480 $values[
"rmd_peer_start"] = $reminder->getReminderStart();
1482 $values[
"rmd_peer_freq"] = $reminder->getReminderFrequency();
1483 $values[
"rmd_peer_template_id"] = $reminder->getReminderMailTemplate();
1488 $this->handleDisabledPeerFields($a_form,
true);
1493 $a_form->
getItemByPostVar(
"peer_min")->setValue($this->assignment->getPeerReviewMin());
1494 $a_form->
getItemByPostVar(
"peer_prsl")->setChecked($this->assignment->hasPeerReviewPersonalized());
1495 $a_form->
getItemByPostVar(
"peer_unlock")->setValue((
int) $this->assignment->getPeerReviewSimpleUnlock());
1497 if ($this->enable_peer_review_completion) {
1498 $a_form->
getItemByPostVar(
"peer_valid")->setValue($this->assignment->getPeerReviewValid());
1501 $cat = $this->assignment->getPeerReviewCriteriaCatalogue();
1506 $a_form->
getItemByPostVar(
"peer_text")->setChecked($this->assignment->hasPeerReviewText());
1507 $a_form->
getItemByPostVar(
"peer_rating")->setChecked($this->assignment->hasPeerReviewRating());
1508 $a_form->
getItemByPostVar(
"peer_file")->setChecked($this->assignment->hasPeerReviewFileUpload());
1509 if ($this->assignment->getPeerReviewChars() > 0) {
1510 $a_form->
getItemByPostVar(
"peer_char")->setValue($this->assignment->getPeerReviewChars());
1518 bool $a_force_set_values =
false
1522 if ($peer_review->hasPeerReviewGroups()) {
1530 if ($this->enable_peer_review_completion) {
1542 $min->setValue($this->assignment->getPeerReviewMin());
1546 if ($a_force_set_values ||
1547 $peer_review->hasPeerReviewGroups()) {
1548 $this->setDisabledPeerReviewFieldValues($a_form);
1561 $protected_peer_review_groups =
false;
1563 if ($peer_review->hasPeerReviewGroups()) {
1564 $protected_peer_review_groups =
true;
1570 $time_deadline = $this->assignment->getDeadline();
1571 $time_deadline_ext = $this->assignment->getExtendedDeadline();
1572 $time_deadline_max = max($time_deadline, $time_deadline_ext);
1580 $reminder_date = $reminder_date
1585 if ($time_peer && $time_deadline_max && $time_peer < $time_deadline_max) {
1587 ->setAlert(
$lng->txt(
"exc_peer_deadline_mismatch"));
1591 if (!$protected_peer_review_groups) {
1592 if ($a_form->
getInput(
"crit_cat") < 0 &&
1594 !$a_form->
getInput(
"peer_rating") &&
1597 ->setAlert(
$lng->txt(
"select_one"));
1604 $res[
"peer_dl"] = $time_peer;
1606 if ($protected_peer_review_groups) {
1607 $res[
"peer_min"] = $this->assignment->getPeerReviewMin();
1608 $res[
"peer_unlock"] = $this->assignment->getPeerReviewSimpleUnlock();
1609 $res[
"peer_prsl"] = $this->assignment->hasPeerReviewPersonalized();
1610 $res[
"peer_valid"] = $this->assignment->getPeerReviewValid();
1612 $res[
"peer_text"] = $this->assignment->hasPeerReviewText();
1613 $res[
"peer_rating"] = $this->assignment->hasPeerReviewRating();
1614 $res[
"peer_file"] = $this->assignment->hasPeerReviewFileUpload();
1615 $res[
"peer_char"] = $this->assignment->getPeerReviewChars();
1616 $res[
"crit_cat"] = $this->assignment->getPeerReviewCriteriaCatalogue();
1618 $res[
"peer_valid"] = $this->enable_peer_review_completion
1619 ?
$res[
"peer_valid"]
1623 $res[
"peer_unlock"] = $a_form->
getInput(
"peer_unlock");
1628 $res[
"peer_rating"] = $a_form->
getInput(
"peer_rating");
1633 if ($a_form->
getInput(
"rmd_peer_status")) {
1634 $res[
"rmd_peer_status"] = $a_form->
getInput(
"rmd_peer_status");
1635 $res[
"rmd_peer_start"] = $a_form->
getInput(
"rmd_peer_start");
1636 $res[
"rmd_peer_end"] = $reminder_date;
1637 $res[
"rmd_peer_freq"] = $a_form->
getInput(
"rmd_peer_freq");
1638 $res[
"rmd_peer_template_id"] = $a_form->
getInput(
"rmd_peer_template_id");
1643 $this->tpl->setOnScreenMessage(
'failure',
$lng->txt(
"form_input_not_valid"));
1656 $a_ass->setPeerReviewMin((
int) $a_input[
"peer_min"]);
1670 ? (
int) $a_input[
"crit_cat"]
1675 $this->importPeerReviewFormToAssignmentReminders($a_input, $a_ass->
getId());
1685 $ilCtrl = $this->ctrl;
1686 $ilTabs = $this->tabs;
1688 $form = $this->initPeerReviewForm();
1689 $input = $this->processPeerReviewForm($form);
1690 if (is_array($input)) {
1691 $this->importPeerReviewFormToAssignment($this->assignment, $input);
1692 $this->tpl->setOnScreenMessage(
'success',
$lng->txt(
"msg_obj_modified"),
true);
1693 $ilCtrl->redirect($this,
"editPeerReview");
1695 $this->setAssignmentHeader();
1696 $ilTabs->activateTab(
"peer_settings");
1698 $form->setValuesByPost();
1699 $this->handleDisabledPeerFields($form);
1700 $tpl->setContent($form->getHTML());
1711 int $a_min_participants,
1712 int $a_max_participants
1714 $total_members = $this->getExerciseTotalMembers();
1715 $number_of_teams = $a_num_teams;
1717 if ($number_of_teams) {
1718 $members_per_team = round($total_members / $a_num_teams);
1720 if ($a_min_participants) {
1721 $number_of_teams = round($total_members / $a_min_participants);
1722 $participants_extra_team = $total_members % $a_min_participants;
1723 if ($participants_extra_team > $number_of_teams) {
1725 $message = sprintf($this->
lng->txt(
"exc_team_minimal_too_big"), $a_min_participants);
1726 return array(
"status" =>
"error",
"msg" =>
$message,
"field" =>
"min_participants_team");
1729 $members_per_team = 0;
1732 if ($a_min_participants > $a_max_participants) {
1733 $message = $this->
lng->txt(
"exc_team_min_big_than_max");
1734 return array(
"status" =>
"error",
"msg" =>
$message,
"field" =>
"max_participants_team");
1737 if ($a_max_participants > 0 && $members_per_team > $a_max_participants) {
1738 $message = sprintf($this->
lng->txt(
"exc_team_max_small_than_members"), $a_max_participants, $members_per_team);
1739 return array(
"status" =>
"error",
"msg" =>
$message,
"field" =>
"max_participants_team");
1742 if ($members_per_team > 0 && $members_per_team < $a_min_participants) {
1743 $message = sprintf($this->
lng->txt(
"exc_team_min_small_than_members"), $a_min_participants, $members_per_team);
1744 return array(
"status" =>
"error",
"msg" =>
$message,
"field" =>
"min_participants_team");
1747 return array(
"status" =>
"success",
"msg" =>
"");
1756 return count($exc_members->getMembers());
1763 $ass_type = $a_assignment->getAssignmentType();
1764 if ($ass_type->usesTeams() &&
1767 $number_teams = $a_input[
'number_teams'];
1770 $ass_team->createRandomTeams($this->exercise_id, $a_assignment->
getId(), $number_teams, $a_input[
'min_participants_team']);
1774 $this->tpl->setOnScreenMessage(
'info', $this->
lng->txt(
"exc_teams_assignment_adopted"),
true);
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
Manages random mandatory assignments of an exercise (business logic)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
Class ilCtrl provides processing control methods.
redirect(object $a_gui_obj, string $a_cmd=null, string $a_anchor=null, bool $is_async=false)
@inheritDoc
setParameter(object $a_gui_obj, string $a_parameter, $a_value)
@inheritDoc
@classDescription Date and time handling
Class ilExAssignmentEditorGUI.
confirmAssignmentsDeletionObject()
ilExAssignment $assignment
orderAssignmentsByDeadlineObject()
downloadGlobalFeedbackFileObject()
deleteAssignmentsObject()
saveAssignmentOrderObject()
processPeerReviewForm(ilPropertyFormGUI $a_form)
setDisabledPeerReviewFieldValues(ilPropertyFormGUI $a_form)
Mandatory RandomAssignmentsManager $random_manager
addAssignmentObject()
Create assignment.
saveReminderData(ilExAssignmentReminder $reminder, array $a_input)
importFormToAssignment(ilExAssignment $a_ass, array $a_input)
Import form values to assignment.
handleDisabledPeerFields(ilPropertyFormGUI $a_form, bool $a_force_set_values=false)
ilGlobalPageTemplate $tpl
importFormToAssignmentReminders(array $a_input, int $a_ass_id)
ilExAssignmentTypesGUI $type_guis
setDisabledFieldValues(ilPropertyFormGUI $a_form)
importPeerReviewFormToAssignmentReminders(array $a_input, int $a_ass_id)
generateTeams(ilExAssignment $a_assignment, array $a_input)
editPeerReviewObject(ilPropertyFormGUI $a_form=null)
getExerciseTotalMembers()
initAssignmentForm(int $a_type, string $a_mode="create")
string $requested_ass_type
importPeerReviewFormToAssignment(ilExAssignment $a_ass, array $a_input)
getAssignmentValues(ilPropertyFormGUI $a_form)
handleDisabledFields(ilPropertyFormGUI $a_form, bool $a_force_set_values=false)
bool $enable_peer_review_completion
processForm(ilPropertyFormGUI $a_form)
Custom form validation.
getPeerReviewValues(\ilPropertyFormGUI $a_form)
validationTeamsFormation(int $a_num_teams, int $a_min_participants, int $a_max_participants)
ilExAssignmentTypes $types
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static adoptTeams(int $a_source_ass_id, int $a_target_ass_id, int $a_user_id=null, int $a_exc_ref_id=null)
static getAssignmentTeamMap(int $a_ass_id)
static getAdoptableTeamAssignments(int $a_exercise_id, int $a_exclude_ass_id=null, int $a_user_id=null)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static getInstance()
Get instance.
deleteGlobalFeedbackFile()
setTeamTutor(bool $a_value)
static saveAssOrderOfExercise(int $a_ex_id, array $a_order)
uploadAssignmentFiles(array $a_files)
Upload assignment files (from creation form)
setRelativeDeadline(int $a_val)
setPeerReviewMin(int $a_value)
const TEAMS_FORMED_BY_TUTOR
setExtendedDeadline(?int $a_val)
setPeerReviewText(bool $a_val)
setPeerReviewCriteriaCatalogue(?int $a_value)
setPeerReview(bool $a_value)
const PEER_REVIEW_VALID_NONE
const TEAMS_FORMED_BY_PARTICIPANTS
const PEER_REVIEW_VALID_ALL
handleGlobalFeedbackFileUpload(array $a_file)
setStartTime(?int $a_val)
setDeadlineMode(int $a_val)
Set deadline mode.
setFeedbackCron(bool $a_value)
Toggle (global) feedback file cron.
setPeerReviewValid(int $a_value)
Set peer review validation.
setPeerReviewPersonalized(bool $a_val)
const TEAMS_FORMED_BY_RANDOM
setInstruction(string $a_val)
const FEEDBACK_DATE_CUSTOM
const TEAMS_FORMED_BY_ASSIGNMENT
const FEEDBACK_DATE_DEADLINE
setRelDeadlineLastSubmission(int $a_val)
setFeedbackFile(?string $a_value)
setPeerReviewSimpleUnlock(bool $a_value)
const PEER_REVIEW_VALID_ONE
setPeerReviewChars(?int $a_value)
setPeerReviewRating(bool $a_val)
static orderAssByDeadline(int $a_ex_id)
setPeerReviewDeadline(int $a_val)
const FEEDBACK_DATE_SUBMISSION
setFeedbackDateCustom(int $a_value)
Set (global) feedback file availability using a custom date.
setFeedbackDate(int $a_value)
setMaxFile(?int $a_value)
setMandatory(bool $a_val)
setPeerReviewFileUpload(bool $a_val)
static lookupTitle(int $a_id)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static getInstancesByParentId(int $a_parent_id)
static getInstancesByParentId(int $a_parent_id)
Handles exercise Grade reminder mail placeholders If all contexts are using the same placeholders,...
Handles exercise Peer reminder mail placeholders If all contexts are using the same placeholders,...
Handles exercise Submit reminder mail placeholders If all contexts are using the same placeholders,...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static deliverFileLegacy(string $a_file, ?string $a_filename=null, ?string $a_mime=null, ?bool $isInline=false, ?bool $removeAfterDelivery=false, ?bool $a_exit_after=true)
setContent(string $a_html)
Sets content for standard template.
loadLanguageModule(string $a_module)
Load language module.
txt(string $a_topic, string $a_default_lang_fallback_mod="")
gets the text for a given topic if the topic is not in the list, the topic itself with "-" will be re...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static _getRichTextEditor()
Returns the identifier for the Rich Text Editor.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
This class represents a text area property in a property form.
This class represents a text property in a property form.
static stripSlashes(string $a_str, bool $a_strip_html=true, string $a_allow="")
if(!file_exists(getcwd() . '/ilias.ini.php'))
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
if($DIC->http() ->request() ->getMethod()=="GET" &&isset($DIC->http() ->request() ->getQueryParams()['tex'])) $tpl
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
__construct(Container $dic, ilPlugin $plugin)
@inheritDoc