ILIAS  trunk Revision v11.0_alpha-2638-g80c1d007f79
class.ilExAssignmentEditorGUI.php
Go to the documentation of this file.
1 <?php
2 
23 
33 {
34  protected \ILIAS\Exercise\InternalDomainService $domain;
35  protected \ILIAS\Exercise\InstructionFile\InstructionFileManager $instruction_files;
36  protected ?int $ref_id = null;
38  protected \ILIAS\Exercise\InternalGUIService $gui;
39  protected ilObjUser $user;
40  protected ilCtrl $ctrl;
41  protected ilTabsGUI $tabs;
42  protected ilLanguage $lng;
45  protected ilSetting $settings;
46  protected ilHelpGUI $help;
47  protected int $exercise_id;
52  protected ?ilObjExercise $exc;
54  protected string $requested_ass_type;
55  protected int $requested_type;
59  protected array $requested_ass_ids;
63  protected array $requested_order;
64  private \ILIAS\ResourceStorage\Services $irss;
65  private \ILIAS\FileUpload\FileUpload $upload;
66 
67  public function __construct(
68  int $a_exercise_id,
69  bool $a_enable_peer_review_completion_settings,
70  ?ilExAssignment $a_ass = null
71  ) {
73  global $DIC;
74 
75  $this->user = $DIC->user();
76  $this->ctrl = $DIC->ctrl();
77  $this->tabs = $DIC->tabs();
78  $this->lng = $DIC->language();
79  $this->tpl = $DIC["tpl"];
80  $this->toolbar = $DIC->toolbar();
81  $this->settings = $DIC->settings();
82  $this->help = $DIC["ilHelp"];
83  $this->exercise_id = $a_exercise_id;
84  $this->assignment = $a_ass;
85  $this->gui = $DIC->exercise()
86  ->internal()
87  ->gui();
88  $this->enable_peer_review_completion = $a_enable_peer_review_completion_settings;
89  $this->types = ilExAssignmentTypes::getInstance();
90  $this->type_guis = $this->gui->assignment()->types();
91  $request = $DIC->exercise()->internal()->gui()->request();
92  $this->exc = $request->getExercise();
93  $this->requested_ass_type = $request->getAssType();
94  $this->requested_type = $request->getType();
95  $this->random_manager = $DIC->exercise()->internal()->domain()->assignment()->randomAssignments(
96  $request->getExercise()
97  );
98  $this->domain = $DIC->exercise()->internal()->domain();
99  $this->requested_ass_ids = $request->getAssignmentIds();
100  $this->requested_order = $request->getOrder();
101  $this->irss = $DIC->resourceStorage();
102  $this->access = $DIC->access();
103  $this->ref_id = $DIC->http()->wrapper()->query()->has('ref_id')
104  ? $DIC->http()->wrapper()->query()->retrieve(
105  'ref_id',
106  $DIC->refinery()->kindlyTo()->int()
107  ) : null;
108  }
109 
113  public function executeCommand(): void
114  {
115  $ilCtrl = $this->ctrl;
116  $ilTabs = $this->tabs;
117  $lng = $this->lng;
118 
119  $class = $ilCtrl->getNextClass($this);
120  $cmd = $ilCtrl->getCmd("listAssignments");
121 
122  switch ($class) {
123  case "ilpropertyformgui":
124  $form = $this->initAssignmentForm($this->requested_ass_type);
125  $ilCtrl->forwardCommand($form);
126  break;
127 
128  case strtolower(ilResourceCollectionGUI::class):
129  $this->setAssignmentHeader();
130  $ilTabs->activateTab("ass_files");
131  $irss = $this->domain->assignment()->instructionFiles($this->assignment->getId());
132  if ($irss->getCollectionIdString() === "") {
133  $this->tpl->setOnScreenMessage(
134  "info",
135  $this->lng->txt("exc_instruction_migration_not_run")
136  );
137  } else {
138  $gui = $this->gui->assignment()->getInstructionFileResourceCollectionGUI(
139  (int) $this->ref_id,
140  $this->assignment->getId()
141  );
142  $this->ctrl->forwardCommand($gui);
143  }
144  break;
145 
146  case "ilexpeerreviewgui":
147  $ilTabs->clearTargets();
148  $ilTabs->setBackTarget(
149  $lng->txt("back"),
150  $ilCtrl->getLinkTarget($this, "listAssignments")
151  );
152 
153  $peer_gui = new ilExPeerReviewGUI($this->assignment);
154  $ilCtrl->forwardCommand($peer_gui);
155  break;
156 
157  default:
158  $this->{$cmd . "Object"}();
159  break;
160  }
161  }
162 
166  public function listAssignmentsObject(): void
167  {
168  $tpl = $this->tpl;
169  $ilToolbar = $this->toolbar;
170  $ilCtrl = $this->ctrl;
171 
172  $ilCtrl->setParameter($this, "ass_id", null);
173 
174  $ilToolbar->setFormAction($ilCtrl->getFormAction($this, "addAssignment"));
175 
176  $ilToolbar->addStickyItem($this->getTypeDropdown(), true);
177 
178  $this->gui->button(
179  $this->lng->txt("exc_add_assignment"),
180  "addAssignment"
181  )->submit()->toToolbar(true);
182 
183  $t = new ilAssignmentsTableGUI($this, "listAssignments", $this->exercise_id);
184  $tpl->setContent($t->getHTML());
185  }
186 
191  public function addAssignmentObject(): void
192  {
193  $tpl = $this->tpl;
194  $ilCtrl = $this->ctrl;
195 
196  // #16163 - ignore ass id from request
197  $this->assignment = null;
198 
199  if ($this->requested_type == 0) {
200  $ilCtrl->redirect($this, "listAssignments");
201  }
202 
203  $form = $this->initAssignmentForm($this->requested_type, "create");
204  $tpl->setContent($form->getHTML());
205  }
206 
210  protected function getTypeDropdown(): ilSelectInputGUI
211  {
212  $lng = $this->lng;
213 
214  $types = [];
215  foreach ($this->types->getAllAllowed($this->exc) as $k => $t) {
216  $types[$k] = $t->getTitle();
217  }
218 
219  $ty = new ilSelectInputGUI($lng->txt("exc_assignment_type"), "type");
220  $ty->setOptions($types);
221  $ty->setRequired(true);
222  return $ty;
223  }
224 
228  protected function initAssignmentForm(
229  int $a_type,
230  string $a_mode = "create"
231  ): ilPropertyFormGUI {
232  $lng = $this->lng;
233  $ilCtrl = $this->ctrl;
234 
235  $ass_type = $this->types->getById($a_type);
236  $ass_type_gui = $this->type_guis->getById($a_type);
237  $ilCtrl->setParameter($this, "ass_type", $a_type);
238 
239  $lng->loadLanguageModule("form");
240  $form = new ilPropertyFormGUI();
241  if ($a_mode == "edit") {
242  $form->setTitle($lng->txt("exc_edit_assignment"));
243  } else {
244  $form->setTitle($lng->txt("exc_new_assignment"));
245  }
246  $form->setFormAction($ilCtrl->getFormAction($this));
247 
248  // title
249  $ti = new ilTextInputGUI($lng->txt("title"), "title");
250  $ti->setMaxLength(200);
251  $ti->setRequired(true);
252  $form->addItem($ti);
253 
254  // type
255  $ty = $this->getTypeDropdown();
256  $ty->setValue($a_type);
257  $ty->setDisabled(true);
258  $form->addItem($ty);
259 
260  //
261  // type specific start
262  //
263 
264  $ass_type_gui->addEditFormCustomProperties($form);
265 
266  //
267  // type specific end
268  //
269 
270  if ($ass_type->usesTeams()) {
271  if ($a_mode == "edit") {
272  $has_teams = (bool) count(ilExAssignmentTeam::getAssignmentTeamMap($this->assignment->getId()));
273  } else {
274  $has_teams = false;
275  }
276 
277  // Radio for creators
278  $rd_team = new ilRadioGroupInputGUI($lng->txt("exc_team_formation"), "team_creator");
279 
280  $radio_participants = new ilRadioOption(
281  $lng->txt("exc_team_by_participants"),
283  $lng->txt("exc_team_by_participants_info")
284  );
285 
286  $radio_tutors = new ilRadioOption(
287  $lng->txt("exc_team_by_tutors"),
289  $lng->txt("exc_team_by_tutors_info")
290  );
291 
292  #23679
293  if (!$has_teams) {
294  // Creation options
295  $rd_creation_method = new ilRadioGroupInputGUI($lng->txt("exc_team_creation"), "team_creation");
296  $rd_creation_method->setRequired(true);
297  $rd_creation_method->setValue("0");
298 
299  //manual
300  $rd_creation_manual = new ilRadioOption(
301  $lng->txt("exc_team_by_tutors_manual"),
302  "0",
303  $lng->txt("exc_team_by_tutors_manual_info")
304  );
305  $rd_creation_method->addOption($rd_creation_manual);
306 
307  //random options
308  $add_info = "";
309  if ($this->getExerciseTotalMembers() < 4) {
310  $add_info = " <strong>" . $lng->txt("exc_team_by_random_add_info") . "</strong>";
311  }
312  $rd_creation_random = new ilRadioOption(
313  $lng->txt("exc_team_by_random"),
315  $lng->txt("exc_team_by_random_info") . "<br>" . $lng->txt("exc_total_members") . ": " . $this->getExerciseTotalMembers() . $add_info
316  );
317  $rd_creation_method->addOption($rd_creation_random);
318 
319  $number_teams = new ilNumberInputGUI($lng->txt("exc_num_teams"), "number_teams");
320  $number_teams->setSize(3);
321  $number_teams->setMinValue(1);
322  $number_teams->setMaxValue($this->getExerciseTotalMembers());
323  $number_teams->setRequired(true);
324  $number_teams->setSuffix($lng->txt("exc_team_assignment_adopt_teams"));
325  $rd_creation_random->addSubItem($number_teams);
326 
327  $min_team_participants = new ilNumberInputGUI($lng->txt("exc_min_team_participants"), "min_participants_team");
328  $min_team_participants->setSize(3);
329  $min_team_participants->setMinValue(1);
330  $min_team_participants->setMaxValue($this->getExerciseTotalMembers());
331  $min_team_participants->setRequired(true);
332  $min_team_participants->setSuffix($lng->txt("exc_participants"));
333  $rd_creation_random->addSubItem($min_team_participants);
334 
335  $max_team_participants = new ilNumberInputGUI($lng->txt("exc_max_team_participants"), "max_participants_team");
336  $max_team_participants->setSize(3);
337  $max_team_participants->setMinValue(1);
338  $max_team_participants->setMaxValue($this->getExerciseTotalMembers());
339  $max_team_participants->setRequired(true);
340  $max_team_participants->setSuffix($lng->txt("exc_participants"));
341  $rd_creation_random->addSubItem($max_team_participants);
342 
343  $options = ilExAssignmentTeam::getAdoptableTeamAssignments($this->exercise_id);
344  if (count($options)) {
345  $radio_assignment = new ilRadioOption(
346  $lng->txt("exc_team_by_assignment"),
348  $lng->txt("exc_team_by_assignment_info")
349  );
350 
351  $radio_assignment_adopt = new ilRadioGroupInputGUI($lng->txt("exc_assignment"), "ass_adpt");
352  $radio_assignment_adopt->setRequired(true);
353  $radio_assignment_adopt->addOption(new ilRadioOption($lng->txt("exc_team_assignment_adopt_none"), -1));
354 
355  foreach ($options as $id => $item) {
356  $option = new ilRadioOption($item["title"], $id);
357  $option->setInfo($lng->txt("exc_team_assignment_adopt_teams") . ": " . $item["teams"]);
358  $radio_assignment_adopt->addOption($option);
359  }
360  $radio_assignment->addSubItem($radio_assignment_adopt);
361  $rd_creation_method->addOption($radio_assignment);
362  }
363 
364  $radio_tutors->addSubItem($rd_creation_method);
365  }
366  $rd_team->addOption($radio_participants);
367  $rd_team->addOption($radio_tutors);
368  /*if(!$has_teams) {
369  $rd_team->addOption($radio_assignment);
370  }*/
371  $form->addItem($rd_team);
372 
373  if ($has_teams) {
374  $rd_team->setDisabled(true);
375  }
376  }
377 
378  // mandatory
379  if (!$this->random_manager->isActivated()) {
380  $cb = new ilCheckboxInputGUI($lng->txt("exc_mandatory"), "mandatory");
381  $cb->setInfo($lng->txt("exc_mandatory_info"));
382  $cb->setChecked(true);
383  $form->addItem($cb);
384  } else {
385  //
386  $ne = new ilNonEditableValueGUI($lng->txt("exc_mandatory"), "");
387  $ne->setValue($lng->txt("exc_mandatory_rand_determined"));
388  $form->addItem($ne);
389  }
390 
391  // Work Instructions
392  $sub_header = new ilFormSectionHeaderGUI();
393  $sub_header->setTitle($lng->txt("exc_work_instructions"));
394  $form->addItem($sub_header);
395 
396  $desc_input = new ilTextAreaInputGUI($lng->txt("exc_instruction"), "instruction");
397  $desc_input->setRows(20);
398  if ((new ilRTESettings($this->lng, $this->user))->getRichTextEditor() === "tinymce") {
399  $desc_input->setUseRte(true);
400  $desc_input->setRteTagSet("mini");
401  }
402  $form->addItem($desc_input);
403 
404  // files
405  if ($a_mode == "create") {
406  $files = new ilFileWizardInputGUI($lng->txt('objs_file'), 'files');
407  $files->setFilenames(array(0 => ''));
408  $form->addItem($files);
409  }
410 
411  // Schedule
412  $sub_header = new ilFormSectionHeaderGUI();
413  $sub_header->setTitle($lng->txt("exc_schedule"));
414  $form->addItem($sub_header);
415 
416  // start time
417  $start_date = new ilDateTimeInputGUI($lng->txt("exc_start_time"), "start_time");
418  $start_date->setShowTime(true);
419  $form->addItem($start_date);
420 
421  // Deadline Mode
422  $radg = new ilRadioGroupInputGUI($lng->txt("exc_deadline"), "deadline_mode");
423  $radg->setValue(0);
424  $op0 = new ilRadioOption($lng->txt("exc_no_deadline"), -1, $lng->txt("exc_no_deadline_info"));
425  $radg->addOption($op0);
426  $op1 = new ilRadioOption($lng->txt("exc_fixed_date"), 0, $lng->txt("exc_fixed_date_info"));
427  $radg->addOption($op1);
428  if (!$ass_type->usesTeams()) {
429  $op3 = new ilRadioOption($lng->txt("exc_fixed_date_individual"), 2, $lng->txt("exc_fixed_date_individual_info"));
430  $radg->addOption($op3);
431  }
432  $op2 = new ilRadioOption($lng->txt("exc_relative_date"), 1, $lng->txt("exc_relative_date_info"));
433  $radg->addOption($op2);
434  $form->addItem($radg);
435 
436  // Deadline fixed date
437  $deadline = new ilDateTimeInputGUI($lng->txt("date"), "deadline");
438  $deadline->setRequired(true);
439  $deadline->setShowTime(true);
440  $op1->addSubItem($deadline);
441 
442  // extended Deadline
443  $deadline2 = new ilDateTimeInputGUI($lng->txt("exc_deadline_extended"), "deadline2");
444  $deadline2->setInfo($lng->txt("exc_deadline_extended_info"));
445  $deadline2->setShowTime(true);
446  $op1->addSubItem($deadline2);
447 
448 
449  // submit reminder
450  $rmd_submit = new ilCheckboxInputGUI($this->lng->txt("exc_reminder_submit_setting"), "rmd_submit_status");
451 
452  $rmd_submit_start = new ilNumberInputGUI($this->lng->txt("exc_reminder_start"), "rmd_submit_start");
453  $rmd_submit_start->setSize(3);
454  $rmd_submit_start->setMaxLength(3);
455  $rmd_submit_start->setSuffix($lng->txt('days'));
456  $rmd_submit_start->setInfo($this->lng->txt("exc_reminder_start_info"));
457  $rmd_submit_start->setRequired(true);
458  $rmd_submit_start->setMinValue(1);
459  $rmd_submit->addSubItem($rmd_submit_start);
460 
461  $rmd_submit_frequency = new ilNumberInputGUI($this->lng->txt("exc_reminder_frequency"), "rmd_submit_freq");
462  $rmd_submit_frequency->setSize(3);
463  $rmd_submit_frequency->setMaxLength(3);
464  $rmd_submit_frequency->setSuffix($lng->txt('days'));
465  $rmd_submit_frequency->setRequired(true);
466  $rmd_submit_frequency->setMinValue(1);
467  $rmd_submit->addSubItem($rmd_submit_frequency);
468 
469  $rmd_submit_end = new ilDateTimeInputGUI($lng->txt("exc_reminder_end"), "rmd_submit_end");
470  $rmd_submit_end->setRequired(true);
471  $rmd_submit->addSubItem($rmd_submit_end);
472 
473  $rmd_submit->addSubItem($this->addMailTemplatesRadio(ilExAssignmentReminder::SUBMIT_REMINDER));
474 
475  // grade reminder
476  $rmd_grade = new ilCheckboxInputGUI($this->lng->txt("exc_reminder_grade_setting"), "rmd_grade_status");
477 
478  $rmd_grade_frequency = new ilNumberInputGUI($this->lng->txt("exc_reminder_frequency"), "rmd_grade_freq");
479  $rmd_grade_frequency->setSize(3);
480  $rmd_grade_frequency->setMaxLength(3);
481  $rmd_grade_frequency->setSuffix($lng->txt('days'));
482  $rmd_grade_frequency->setRequired(true);
483  $rmd_grade_frequency->setMinValue(1);
484  $rmd_grade->addSubItem($rmd_grade_frequency);
485 
486  $rmd_grade_end = new ilDateTimeInputGUI($lng->txt("exc_reminder_end"), "rmd_grade_end");
487  $rmd_grade_end->setRequired(true);
488  $rmd_grade->addSubItem($rmd_grade_end);
489 
490  $rmd_grade->addSubItem($this->addMailTemplatesRadio(ilExAssignmentReminder::GRADE_REMINDER));
491 
492  $form->addItem($rmd_submit);
493  $form->addItem($rmd_grade);
494 
495  // relative deadline
496  $ti = new ilNumberInputGUI($lng->txt("exc_relative_date_period"), "relative_deadline");
497  $ti->setSuffix($lng->txt("days"));
498  $ti->setMaxLength(3);
499  $ti->setSize(3);
500  $ti->setMinValue(1);
501  $ti->setRequired(true);
502  $op2->addSubItem($ti);
503 
504  // last submission for relative deadline
505  $last_submission = new ilDateTimeInputGUI($lng->txt("exc_rel_last_submission"), "rel_deadline_last_subm");
506  $last_submission->setInfo($lng->txt("exc_rel_last_submission_info"));
507  $last_submission->setShowTime(true);
508  $op2->addSubItem($last_submission);
509 
510 
511 
512  // max number of files
513  if ($ass_type->usesFileUpload()) {
514  $sub_header = new ilFormSectionHeaderGUI();
515  $sub_header->setTitle($ass_type->getTitle());
516  $form->addItem($sub_header);
517  $max_file_tgl = new ilCheckboxInputGUI($lng->txt("exc_max_file_tgl"), "max_file_tgl");
518  $form->addItem($max_file_tgl);
519 
520  $max_file = new ilNumberInputGUI($lng->txt("exc_max_file"), "max_file");
521  $max_file->setInfo($lng->txt("exc_max_file_info"));
522  $max_file->setRequired(true);
523  $max_file->setSize(3);
524  $max_file->setMinValue(1);
525  $max_file_tgl->addSubItem($max_file);
526  }
527 
528  // after submission
529  $sub_header = new ilFormSectionHeaderGUI();
530  $sub_header->setTitle($lng->txt("exc_after_submission"));
531  $form->addItem($sub_header);
532 
533  if (!$ass_type->usesTeams() && !$this->random_manager->isActivated()) {
534  // peer review
535  $peer = new ilCheckboxInputGUI($lng->txt("exc_peer_review"), "peer");
536  $peer->setInfo($lng->txt("exc_peer_review_ass_setting_info"));
537  $form->addItem($peer);
538  }
539 
540 
541  // global feedback
542 
543  $fb = new ilCheckboxInputGUI($lng->txt("exc_global_feedback_file"), "fb");
544  $form->addItem($fb);
545 
546  $fb_file = new ilFileInputGUI($lng->txt("file"), "fb_file");
547  $fb_file->setRequired(true); // will be disabled on update if file exists - see getAssignmentValues()
548  // $fb_file->setAllowDeletion(true); makes no sense if required (overwrite or keep)
549  $fb->addSubItem($fb_file);
550 
551  $fb_date = new ilRadioGroupInputGUI($lng->txt("exc_global_feedback_file_date"), "fb_date");
552  $fb_date->setRequired(true);
553  $fb_date->setValue(ilExAssignment::FEEDBACK_DATE_DEADLINE);
554  $fb_date->addOption(new ilRadioOption($lng->txt("exc_global_feedback_file_date_deadline"), ilExAssignment::FEEDBACK_DATE_DEADLINE));
555  $fb_date->addOption(new ilRadioOption($lng->txt("exc_global_feedback_file_date_upload"), ilExAssignment::FEEDBACK_DATE_SUBMISSION));
556 
557  //Extra radio option with date selection
558  $fb_date_custom_date = new ilDateTimeInputGUI($lng->txt("date"), "fb_date_custom");
559  $fb_date_custom_date->setRequired(true);
560  $fb_date_custom_date->setShowTime(true);
561  $fb_date_custom_option = new ilRadioOption($lng->txt("exc_global_feedback_file_after_date"), ilExAssignment::FEEDBACK_DATE_CUSTOM);
562  $fb_date_custom_option->addSubItem($fb_date_custom_date);
563  $fb_date->addOption($fb_date_custom_option);
564 
565 
566  $fb->addSubItem($fb_date);
567 
568  $fb_cron = new ilCheckboxInputGUI($lng->txt("exc_global_feedback_file_cron"), "fb_cron");
569  $fb_cron->setInfo($lng->txt("exc_global_feedback_file_cron_info"));
570  $fb->addSubItem($fb_cron);
571 
572 
573  if ($a_mode == "create") {
574  $form->addCommandButton("saveAssignment", $lng->txt("save"));
575  } else {
576  $form->addCommandButton("updateAssignment", $lng->txt("save"));
577  }
578  $form->addCommandButton("listAssignments", $lng->txt("cancel"));
579 
580  return $form;
581  }
582 
583  public function addMailTemplatesRadio(string $a_reminder_type): ilRadioGroupInputGUI
584  {
585  global $DIC;
586 
587  $post_var = "rmd_" . $a_reminder_type . "_template_id";
588 
589  $r_group = new ilRadioGroupInputGUI($this->lng->txt("exc_reminder_mail_template"), $post_var);
590  $r_group->setRequired(true);
591  $r_group->addOption(new ilRadioOption($this->lng->txt("exc_reminder_mail_no_tpl"), 0));
592  $r_group->setValue(0);
593 
594  switch ($a_reminder_type) {
597  break;
600  break;
603  break;
604  default:
605  exit();
606  }
607 
608  $templateService = $DIC->mail()->textTemplates();
609  foreach ($templateService->loadTemplatesForContextId($context->getId()) as $template) {
610  $r_group->addOption(new ilRadioOption($template->getTitle(), $template->getTplId()));
611  if ($template->isDefault()) {
612  $r_group->setValue($template->getTplId());
613  }
614  }
615 
616  return $r_group;
617  }
618 
625  protected function processForm(ilPropertyFormGUI $a_form): ?array
626  {
627  $lng = $this->lng;
628 
629  $protected_peer_review_groups = false;
630 
631  if ($this->assignment) {
632  if ($this->assignment->getPeerReview()) {
633  $peer_review = new ilExPeerReview($this->assignment);
634  if ($peer_review->hasPeerReviewGroups()) {
635  $protected_peer_review_groups = true;
636  }
637  }
638 
639  if ($this->assignment->getFeedbackFile()) {
640  $a_form->getItemByPostVar("fb_file")->setRequired(false); // #15467
641  }
642  }
643 
644  $valid = $a_form->checkInput();
645  if ($protected_peer_review_groups) {
646  // checkInput() will add alert to disabled fields
647  $a_form->getItemByPostVar("deadline")->setAlert("");
648  $a_form->getItemByPostVar("deadline2")->setAlert("");
649  }
650 
651  if ($valid) {
652  $type = $a_form->getInput("type");
653  $ass_type = $this->types->getById($type);
654 
655  // dates
656 
657  $time_start = $a_form->getItemByPostVar("start_time")->getDate();
658  $time_start = $time_start
659  ? $time_start->get(IL_CAL_UNIX)
660  : null;
661 
662  $time_fb_custom_date = $a_form->getItemByPostVar("fb_date_custom")->getDate();
663  $time_fb_custom_date = $time_fb_custom_date
664  ? $time_fb_custom_date->get(IL_CAL_UNIX)
665  : null;
666 
667  $reminder_submit_end_date = $a_form->getItemByPostVar("rmd_submit_end")->getDate();
668  $reminder_submit_end_date = $reminder_submit_end_date
669  ? $reminder_submit_end_date->get(IL_CAL_UNIX)
670  : null;
671 
672  $reminder_grade_end_date = $a_form->getItemByPostVar("rmd_grade_end")->getDate();
673  $reminder_grade_end_date = $reminder_grade_end_date
674  ? $reminder_grade_end_date->get(IL_CAL_UNIX)
675  : null;
676 
677  $time_deadline = null;
678  $time_deadline_ext = null;
679 
680  $deadline_mode = (int) $a_form->getInput("deadline_mode");
681  if ($deadline_mode === -1) {
682  $deadline_mode = 0;
683  }
684 
685  if ($deadline_mode === ilExAssignment::DEADLINE_ABSOLUTE) {
686  $time_deadline = $a_form->getItemByPostVar("deadline")->getDate();
687  $time_deadline = $time_deadline
688  ? $time_deadline->get(IL_CAL_UNIX)
689  : null;
690  $time_deadline_ext = $a_form->getItemByPostVar("deadline2")->getDate();
691  $time_deadline_ext = $time_deadline_ext
692  ? $time_deadline_ext->get(IL_CAL_UNIX)
693  : null;
694  }
695 
696 
697  // handle disabled elements
698  if ($protected_peer_review_groups) {
699  $time_deadline = $this->assignment->getDeadline();
700  $time_deadline_ext = $this->assignment->getExtendedDeadline();
701  }
702 
703  // no deadline?
704  if (!$time_deadline) {
705  // peer review
706  if (!$protected_peer_review_groups &&
707  $a_form->getInput("peer")) {
708  $a_form->getItemByPostVar("peer")
709  ->setAlert($lng->txt("exc_needs_fixed_deadline"));
710  $valid = false;
711  }
712  // global feedback
713  if ($a_form->getInput("fb") &&
714  $a_form->getInput("fb_date") == ilExAssignment::FEEDBACK_DATE_DEADLINE) {
715  $a_form->getItemByPostVar("fb")
716  ->setAlert($lng->txt("exc_needs_deadline"));
717  $valid = false;
718  }
719  } else {
720  // #18269
721  if ($a_form->getInput("peer")) {
722  $time_deadline_max = max($time_deadline, $time_deadline_ext);
723  $peer_dl = $this->assignment // #18380
724  ? $this->assignment->getPeerReviewDeadline()
725  : null;
726  if ($peer_dl && $peer_dl < $time_deadline_max) {
727  $a_form->getItemByPostVar($peer_dl < $time_deadline_ext
728  ? "deadline2"
729  : "deadline")
730  ->setAlert($lng->txt("exc_peer_deadline_mismatch"));
731  $valid = false;
732  }
733  }
734 
735  if ($time_deadline_ext && $time_deadline_ext < $time_deadline) {
736  $a_form->getItemByPostVar("deadline2")
737  ->setAlert($lng->txt("exc_deadline_ext_mismatch"));
738  $valid = false;
739  }
740 
741  $time_deadline_min = $time_deadline_ext
742  ? min($time_deadline, $time_deadline_ext)
743  : $time_deadline;
744 
745  // start > any deadline ?
746  if ($time_start && $time_deadline_min && $time_start > $time_deadline_min) {
747  $a_form->getItemByPostVar("start_time")
748  ->setAlert($lng->txt("exc_start_date_should_be_before_end_date"));
749  $valid = false;
750  }
751  }
752 
753  if ($ass_type->usesTeams()) {
754  if ($a_form->getInput("team_creation") == ilExAssignment::TEAMS_FORMED_BY_RANDOM &&
755  $a_form->getInput("team_creator") == ilExAssignment::TEAMS_FORMED_BY_TUTOR) {
756  $team_validation = $this->validationTeamsFormation(
757  $a_form->getInput("number_teams"),
758  $a_form->getInput("min_participants_team"),
759  $a_form->getInput("max_participants_team")
760  );
761  if ($team_validation['status'] == 'error') {
762  $a_form->getItemByPostVar("team_creation")
763  ->setAlert($team_validation['msg']);
764  $a_form->getItemByPostVar($team_validation["field"])
765  ->setAlert($lng->txt("exc_value_can_not_set"));
766  $valid = false;
767  }
768  }
769  }
770  if ($valid) {
771  $res = array(
772  // core
773  "type" => $a_form->getInput("type")
774  ,"title" => trim($a_form->getInput("title"))
775  ,"instruction" => trim($a_form->getInput("instruction"))
776  // dates
777  ,"start" => $time_start
778  ,"deadline" => $time_deadline
779  ,"deadline_ext" => $time_deadline_ext
780  ,"max_file" => $a_form->getInput("max_file_tgl")
781  ? $a_form->getInput("max_file")
782  : null
783  );
784  if (!$this->random_manager->isActivated()) {
785  $res["mandatory"] = $a_form->getInput("mandatory");
786  }
787 
788  $res['team_creator'] = $a_form->getInput("team_creator");
789  $res["team_creation"] = $a_form->getInput("team_creation");
790  if ($a_form->getInput("team_creator") == ilExAssignment::TEAMS_FORMED_BY_TUTOR) {
791  if ($a_form->getInput("team_creation") == ilExAssignment::TEAMS_FORMED_BY_RANDOM) {
792  $res["number_teams"] = $a_form->getInput("number_teams");
793  $res["min_participants_team"] = $a_form->getInput("min_participants_team");
794  $res["max_participants_team"] = $a_form->getInput("max_participants_team");
795  } elseif ($a_form->getInput("team_creation") == ilExAssignment::TEAMS_FORMED_BY_ASSIGNMENT) {
796  $res['ass_adpt'] = $a_form->getInput("ass_adpt");
797  }
798  }
799 
800  $res["deadline_mode"] = $deadline_mode;
801 
802  if ($res["deadline_mode"] == ilExAssignment::DEADLINE_RELATIVE) {
803  $res["relative_deadline"] = $a_form->getInput("relative_deadline");
804  $rel_deadline_last_subm = $a_form->getItemByPostVar("rel_deadline_last_subm")->getDate();
805  $rel_deadline_last_subm = $rel_deadline_last_subm
806  ? $rel_deadline_last_subm->get(IL_CAL_UNIX)
807  : null;
808  $res["rel_deadline_last_subm"] = $rel_deadline_last_subm;
809  }
810 
811  // peer
812  if ($a_form->getInput("peer") ||
813  $protected_peer_review_groups) {
814  $res["peer"] = true;
815  }
816 
817  // files
818  if (isset($_FILES["files"])) {
819  // #15994 - we are keeping the upload files array structure
820  $res["files"] = $_FILES["files"];
821  }
822 
823  // global feedback
824  if ($a_form->getInput("fb")) {
825  $res["fb"] = true;
826  $res["fb_cron"] = $a_form->getInput("fb_cron");
827  $res["fb_date"] = $a_form->getInput("fb_date");
828  $res["fb_date_custom"] = $time_fb_custom_date;
829 
830  if ($_FILES["fb_file"]["tmp_name"]) {
831  $res["fb_file"] = $_FILES["fb_file"];
832  }
833  }
834  if ($a_form->getInput("rmd_submit_status")) {
835  $res["rmd_submit_status"] = true;
836  $res["rmd_submit_start"] = $a_form->getInput("rmd_submit_start");
837  $res["rmd_submit_freq"] = $a_form->getInput("rmd_submit_freq");
838  $res["rmd_submit_end"] = $reminder_submit_end_date;
839  $res["rmd_submit_template_id"] = $a_form->getInput("rmd_submit_template_id");
840  }
841  if ($a_form->getInput("rmd_grade_status")) {
842  $res["rmd_grade_status"] = true;
843  $res["rmd_grade_freq"] = $a_form->getInput("rmd_grade_freq");
844  $res["rmd_grade_end"] = $reminder_grade_end_date;
845  $res["rmd_grade_template_id"] = $a_form->getInput("rmd_grade_template_id");
846  }
847 
848  return $res;
849  } else {
850  $this->tpl->setOnScreenMessage('failure', $lng->txt("form_input_not_valid"));
851  }
852  }
853 
854  return null;
855  }
856 
862  protected function importFormToAssignment(
863  ilExAssignment $a_ass,
864  array $a_input
865  ): void {
866  $is_create = !(bool) $a_ass->getId();
867 
868  $a_ass->setTitle($a_input["title"]);
869  $a_ass->setInstruction($a_input["instruction"]);
870  if (!$this->random_manager->isActivated()) {
871  $a_ass->setMandatory($a_input["mandatory"]);
872  }
873 
874  $a_ass->setStartTime($a_input["start"]);
875  $a_ass->setDeadline($a_input["deadline"]);
876  $a_ass->setExtendedDeadline($a_input["deadline_ext"]);
877  $a_ass->setDeadlineMode($a_input["deadline_mode"]);
878  $a_ass->setRelativeDeadline((int) ($a_input["relative_deadline"] ?? 0));
879  $a_ass->setRelDeadlineLastSubmission((int) ($a_input["rel_deadline_last_subm"] ?? 0));
880 
881  $a_ass->setMaxFile($a_input["max_file"]);
882  $a_ass->setTeamTutor((bool) ($a_input["team_creator"] ?? false));
883 
884  //$a_ass->setPortfolioTemplateId($a_input['template_id']);
885 
886  //$a_ass->setMinCharLimit($a_input['min_char_limit']);
887  //$a_ass->setMaxCharLimit($a_input['max_char_limit']);
888 
889  if (!$this->random_manager->isActivated()) {
890  $a_ass->setPeerReview((bool) ($a_input["peer"] ?? false));
891  }
892 
893  // peer review default values (on separate form)
894  if ($is_create) {
895  $a_ass->setPeerReviewMin(2);
896  $a_ass->setPeerReviewSimpleUnlock(0);
898  $a_ass->setPeerReviewPersonalized(false);
899  $a_ass->setPeerReviewFileUpload(false);
900  $a_ass->setPeerReviewText(true);
901  $a_ass->setPeerReviewRating(true);
902  }
903 
904  if (isset($a_input["fb"])) {
905  $a_ass->setFeedbackCron((bool) $a_input["fb_cron"]); // #13380
906  $a_ass->setFeedbackDate((int) $a_input["fb_date"]);
907  $a_ass->setFeedbackDateCustom((int) $a_input["fb_date_custom"]);
908  }
909 
910  // id needed for file handling
911  if ($is_create) {
912  $a_ass->save();
913 
914  // #15994 - assignment files
915  if (is_array($a_input["files"])) {
916  $this->domain->assignment()->instructionFiles($a_ass->getId())->importFromLegacyUpload($a_input["files"]);
917  }
918  } else {
919  // remove global feedback file?
920  if (!isset($a_input["fb"])) {
921  $a_ass->setFeedbackFile(null);
922  }
923 
924  $a_ass->update();
925  }
926 
927  // add global feedback file?
928  if (isset($a_input["fb"], $a_input["fb_file"])) {
929  $a_ass->handleGlobalFeedbackFileUpload($a_ass->getId(), $a_input["fb_file"]);
930  $a_ass->update();
931  }
932  $this->importFormToAssignmentReminders($a_input, $a_ass->getId());
933  }
934 
936  array $a_input,
937  int $a_ass_id
938  ): void {
939  $reminder = new ilExAssignmentReminder($this->exercise_id, $a_ass_id, ilExAssignmentReminder::SUBMIT_REMINDER);
940  $this->saveReminderData($reminder, $a_input);
941 
942  $reminder = new ilExAssignmentReminder($this->exercise_id, $a_ass_id, ilExAssignmentReminder::GRADE_REMINDER);
943  $this->saveReminderData($reminder, $a_input);
944  }
945 
946  //todo maybe we can refactor this method to use only one importFormToReminders
948  array $a_input,
949  int $a_ass_id
950  ): void {
951  $reminder = new ilExAssignmentReminder($this->exercise_id, $a_ass_id, ilExAssignmentReminder::FEEDBACK_REMINDER);
952  $this->saveReminderData($reminder, $a_input);
953  }
954 
955  protected function saveReminderData(
956  ilExAssignmentReminder $reminder,
957  array $a_input
958  ): void {
959  if ($reminder->getReminderStatus() === null) {
960  $action = "save";
961  } else {
962  $action = "update";
963  }
964  $type = $reminder->getReminderType();
965  $reminder->setReminderStatus((bool) ($a_input["rmd_" . $type . "_status"] ?? false));
966  $reminder->setReminderStart((int) ($a_input["rmd_" . $type . "_start"] ?? 0));
967  $reminder->setReminderEnd((int) ($a_input["rmd_" . $type . "_end"] ?? 0));
968  $reminder->setReminderFrequency((int) ($a_input["rmd_" . $type . "_freq"] ?? 0));
969  $reminder->setReminderMailTemplate((int) ($a_input["rmd_" . $type . "_template_id"] ?? 0));
970  $reminder->{$action}();
971  }
972 
978  public function saveAssignmentObject(): void
979  {
980  $tpl = $this->tpl;
981  $lng = $this->lng;
982  $ilCtrl = $this->ctrl;
983 
984  // #16163 - ignore ass id from request
985  $this->assignment = null;
986 
987  $form = $this->initAssignmentForm($this->requested_type, "create");
988  $input = $this->processForm($form);
989  if (is_array($input)) {
990  $ass = new ilExAssignment();
991  $ass->setExerciseId($this->exercise_id);
992  $ass->setType($input["type"]);
993  $ass_type_gui = $this->type_guis->getById($ass->getType());
994 
995  $this->importFormToAssignment($ass, $input);
996 
997  $this->generateTeams($ass, $input);
998  $this->tpl->setOnScreenMessage('success', $lng->txt("msg_obj_modified"), true);
999 
1000  $ass_type_gui->importFormToAssignment($ass, $form);
1001  $ass->update();
1002 
1003  $this->tpl->setOnScreenMessage('success', $lng->txt("msg_obj_modified"), true);
1004 
1005  // because of sub-tabs we stay on settings screen
1006  $ilCtrl->setParameter($this, "ass_id", $ass->getId());
1007  $ilCtrl->redirect($this, "editAssignment");
1008  } else {
1009  $form->setValuesByPost();
1010  $tpl->setContent($form->getHTML());
1011  }
1012  }
1013 
1018  public function editAssignmentObject(): void
1019  {
1020  $ilTabs = $this->tabs;
1021  $tpl = $this->tpl;
1022 
1023  $this->setAssignmentHeader();
1024  $ilTabs->activateTab("ass_settings");
1025 
1026  $form = $this->initAssignmentForm($this->assignment->getType(), "edit");
1027  $this->getAssignmentValues($form);
1028  $tpl->setContent($form->getHTML());
1029  }
1030 
1035  public function getAssignmentValues(ilPropertyFormGUI $a_form): void
1036  {
1037  $lng = $this->lng;
1038  $ilCtrl = $this->ctrl;
1039  $ass_type_gui = $this->type_guis->getById($this->assignment->getType());
1040 
1041  $values = array();
1042  $values["type"] = $this->assignment->getType();
1043  $values["title"] = $this->assignment->getTitle();
1044  $values["mandatory"] = $this->assignment->getMandatory();
1045  $values["instruction"] = $this->assignment->getInstruction();
1046  if ($this->assignment->getStartTime()) {
1047  $values["start_time"] = new ilDateTime($this->assignment->getStartTime(), IL_CAL_UNIX);
1048  }
1049 
1050  if ($this->assignment->getAssignmentType()->usesFileUpload()) {
1051  if ($this->assignment->getMaxFile()) {
1052  $values["max_file_tgl"] = true;
1053  $values["max_file"] = $this->assignment->getMaxFile();
1054  }
1055  }
1056 
1057  if ($this->assignment->getAssignmentType()->usesTeams()) {
1058  $values["team_creator"] = (string) (int) $this->assignment->getTeamTutor();
1059  $values["team_creation"] = "0";
1060  }
1061 
1062  if ($this->assignment->getFeedbackDateCustom()) {
1063  $values["fb_date_custom"] = new ilDateTime($this->assignment->getFeedbackDateCustom(), IL_CAL_UNIX);
1064  }
1065 
1066  //Reminders
1067  $rmd_sub = new ilExAssignmentReminder($this->exercise_id, $this->assignment->getId(), ilExAssignmentReminder::SUBMIT_REMINDER);
1068  if ($rmd_sub->getReminderStatus()) {
1069  $values["rmd_submit_status"] = $rmd_sub->getReminderStatus();
1070  $values["rmd_submit_start"] = $rmd_sub->getReminderStart();
1071  $values["rmd_submit_end"] = new ilDateTime($rmd_sub->getReminderEnd(), IL_CAL_UNIX);
1072  $values["rmd_submit_freq"] = $rmd_sub->getReminderFrequency();
1073  $values["rmd_submit_template_id"] = $rmd_sub->getReminderMailTemplate();
1074  }
1075 
1076  $rmd_grade = new ilExAssignmentReminder($this->exercise_id, $this->assignment->getId(), ilExAssignmentReminder::GRADE_REMINDER);
1077  if ($rmd_grade->getReminderStatus()) {
1078  $values["rmd_grade_status"] = $rmd_grade->getReminderStatus();
1079  $values["rmd_grade_end"] = new ilDateTime($rmd_grade->getReminderEnd(), IL_CAL_UNIX);
1080  $values["rmd_grade_freq"] = $rmd_grade->getReminderFrequency();
1081  $values["rmd_grade_template_id"] = $rmd_grade->getReminderMailTemplate();
1082  }
1083 
1084  $type_values = $ass_type_gui->getFormValuesArray($this->assignment);
1085  $values = array_merge($values, $type_values);
1086 
1087 
1088  $values["deadline_mode"] = $this->assignment->getDeadlineMode();
1089  if ($values["deadline_mode"] === 0 && !$this->assignment->getDeadline()) {
1090  $values["deadline_mode"] = -1;
1091  }
1092  $values["relative_deadline"] = $this->assignment->getRelativeDeadline();
1093  $dt = new ilDateTime($this->assignment->getRelDeadlineLastSubmission(), IL_CAL_UNIX);
1094  $values["rel_deadline_last_subm"] = $dt->get(IL_CAL_DATETIME);
1095 
1096 
1097  $a_form->setValuesByArray($values);
1098 
1099  // global feedback
1100  if ($this->assignment->getFeedbackFile()) {
1101  $sample_solution = $this->domain->assignment()->sampleSolution($this->assignment->getId());
1102  $a_form->getItemByPostVar("fb")->setChecked(true);
1103 
1104  $a_form->getItemByPostVar("fb_file")->setValue($sample_solution->getFilename());
1105  $a_form->getItemByPostVar("fb_file")->setRequired(false); // #15467
1106  $a_form->getItemByPostVar("fb_file")->setInfo(
1107  // #16400
1108  '<a href="' . $ilCtrl->getLinkTarget($this, "downloadGlobalFeedbackFile") . '">' .
1109  $lng->txt("download") . '</a>'
1110  );
1111  }
1112  $a_form->getItemByPostVar("fb_cron")->setChecked($this->assignment->hasFeedbackCron());
1113  $a_form->getItemByPostVar("fb_date")->setValue($this->assignment->getFeedbackDate());
1114 
1115  $this->handleDisabledFields($a_form, true);
1116  }
1117 
1121  protected function setDisabledFieldValues(ilPropertyFormGUI $a_form): void
1122  {
1123  // dates
1124  if ($this->assignment->getDeadline() > 0) {
1125  $edit_date = new ilDateTime($this->assignment->getDeadline(), IL_CAL_UNIX);
1126  $ed_item = $a_form->getItemByPostVar("deadline");
1127  $ed_item->setDate($edit_date);
1128 
1129  if ($this->assignment->getExtendedDeadline() > 0) {
1130  $edit_date = new ilDateTime($this->assignment->getExtendedDeadline(), IL_CAL_UNIX);
1131  $ed_item = $a_form->getItemByPostVar("deadline2");
1132  $ed_item->setDate($edit_date);
1133  }
1134  }
1135 
1136  if ($this->assignment->getPeerReview()) {
1137  $a_form->getItemByPostVar("peer")->setChecked($this->assignment->getPeerReview());
1138  }
1139  }
1140 
1144  protected function handleDisabledFields(
1145  ilPropertyFormGUI $a_form,
1146  bool $a_force_set_values = false
1147  ): void {
1148  // potentially disabled elements are initialized here to re-use this
1149  // method after setValuesByPost() - see updateAssignmentObject()
1150 
1151  // team assignments do not support peer review
1152  // with no active peer review there is nothing to protect
1153  $peer_review = null;
1154  if (!$this->assignment->getAssignmentType()->usesTeams() &&
1155  $this->assignment->getPeerReview()) {
1156  // #14450
1157  $peer_review = new ilExPeerReview($this->assignment);
1158  if ($peer_review->hasPeerReviewGroups()) {
1159  // deadline(s) are past and must not change
1160  $a_form->getItemByPostVar("deadline")->setDisabled(true);
1161  $a_form->getItemByPostVar("deadline2")->setDisabled(true);
1162 
1163  $a_form->getItemByPostVar("peer")->setDisabled(true);
1164 
1165  $a_form->getItemByPostVar("deadline_mode")->setDisabled(true);
1166  }
1167  }
1168 
1169  if ($a_force_set_values ||
1170  ($peer_review && $peer_review->hasPeerReviewGroups())) {
1171  $this->setDisabledFieldValues($a_form);
1172  }
1173  }
1174 
1180  public function updateAssignmentObject(): void
1181  {
1182  $tpl = $this->tpl;
1183  $lng = $this->lng;
1184  $ilCtrl = $this->ctrl;
1185  $ilTabs = $this->tabs;
1186 
1187  $form = $this->initAssignmentForm($this->assignment->getType(), "edit");
1188  $input = $this->processForm($form);
1189 
1190  $ass_type = $this->assignment->getType();
1191  $ass_type_gui = $this->type_guis->getById($ass_type);
1192 
1193  if (is_array($input)) {
1194  $old_deadline = $this->assignment->getDeadline();
1195  $old_ext_deadline = $this->assignment->getExtendedDeadline();
1196 
1197  $this->importFormToAssignment($this->assignment, $input);
1198  $this->generateTeams($this->assignment, $input);
1199 
1200  $ass_type_gui->importFormToAssignment($this->assignment, $form);
1201  $this->assignment->update();
1202 
1203  $new_deadline = $this->assignment->getDeadline();
1204  $new_ext_deadline = $this->assignment->getExtendedDeadline();
1205 
1206  // if deadlines were changed
1207  if ($old_deadline != $new_deadline ||
1208  $old_ext_deadline != $new_ext_deadline) {
1209  $subm = $this->domain->submission($this->assignment->getId());
1210  $subm->recalculateLateSubmissions();
1211  }
1212 
1213  $this->tpl->setOnScreenMessage('success', $lng->txt("msg_obj_modified"), true);
1214  $ilCtrl->redirect($this, "editAssignment");
1215  } else {
1216  $this->setAssignmentHeader();
1217  $ilTabs->activateTab("ass_settings");
1218 
1219  $form->setValuesByPost();
1220  $this->handleDisabledFields($form);
1221  $tpl->setContent($form->getHTML());
1222  }
1223  }
1224 
1225  public function confirmAssignmentsDeletionObject(): void
1226  {
1227  $ilCtrl = $this->ctrl;
1228  $tpl = $this->tpl;
1229  $lng = $this->lng;
1230 
1231  $ilCtrl->setParameterByClass(ilObjExerciseGUI::class, "ass_id", null);
1232  if (count($this->requested_ass_ids) == 0) {
1233  $this->tpl->setOnScreenMessage('failure', $lng->txt("no_checkbox"), true);
1234  $ilCtrl->redirect($this, "listAssignments");
1235  } else {
1236  $cgui = new ilConfirmationGUI();
1237  $cgui->setFormAction($ilCtrl->getFormAction($this));
1238  $cgui->setHeaderText($lng->txt("exc_conf_del_assignments"));
1239  $cgui->setCancel($lng->txt("cancel"), "listAssignments");
1240  $cgui->setConfirm($lng->txt("delete"), "deleteAssignments");
1241 
1242  foreach ($this->requested_ass_ids as $i) {
1243  $cgui->addItem("id[]", $i, ilExAssignment::lookupTitle($i));
1244  }
1245 
1246  $tpl->setContent($cgui->getHTML());
1247  }
1248  }
1249 
1254  public function deleteAssignmentsObject(): void
1255  {
1256  $ilCtrl = $this->ctrl;
1257  $lng = $this->lng;
1258  $delete = false;
1259  foreach ($this->requested_ass_ids as $id) {
1260  $ass = new ilExAssignment(ilUtil::stripSlashes($id));
1261  $ass->delete($this->exc);
1262  $delete = true;
1263  }
1264 
1265  if ($delete) {
1266  $this->tpl->setOnScreenMessage('success', $lng->txt("exc_assignments_deleted"), true);
1267  }
1268  $ilCtrl->setParameter($this, "ass_id", "");
1269  $ilCtrl->redirect($this, "listAssignments");
1270  }
1271 
1272  public function saveAssignmentOrderObject(): void
1273  {
1274  $lng = $this->lng;
1275  $ilCtrl = $this->ctrl;
1276 
1278  $this->exercise_id,
1279  $this->requested_order
1280  );
1281 
1282  $this->tpl->setOnScreenMessage('success', $lng->txt("exc_saved_order"), true);
1283  $ilCtrl->redirect($this, "listAssignments");
1284  }
1285 
1286  public function orderAssignmentsByDeadlineObject(): void
1287  {
1288  $lng = $this->lng;
1289  $ilCtrl = $this->ctrl;
1290 
1291  ilExAssignment::orderAssByDeadline($this->exercise_id);
1292 
1293  $this->tpl->setOnScreenMessage('success', $lng->txt("exc_saved_order"), true);
1294  $ilCtrl->redirect($this, "listAssignments");
1295  }
1296 
1297  public function setAssignmentHeader(): void
1298  {
1299  $ilTabs = $this->tabs;
1300  $lng = $this->lng;
1301  $ilCtrl = $this->ctrl;
1302  $tpl = $this->tpl;
1303  $ilHelp = $this->help;
1304 
1305  $tpl->setTitle($this->assignment->getTitle());
1306  $tpl->setDescription("");
1307 
1308  $ilTabs->clearTargets();
1309  $ilHelp->setScreenIdComponent("exc");
1310 
1311  $ilTabs->setBackTarget(
1312  $lng->txt("back"),
1313  $ilCtrl->getLinkTarget($this, "listAssignments")
1314  );
1315 
1316  $ilTabs->addTab(
1317  "ass_settings",
1318  $lng->txt("settings"),
1319  $ilCtrl->getLinkTarget($this, "editAssignment")
1320  );
1321 
1322  if (!$this->assignment->getAssignmentType()->usesTeams() &&
1323  $this->assignment->getPeerReview()) {
1324  $ilTabs->addTab(
1325  "peer_settings",
1326  $lng->txt("exc_peer_review"),
1327  $ilCtrl->getLinkTarget($this, "editPeerReview")
1328  );
1329  }
1330  $ilCtrl->setParameterByClass(ilObjExerciseGUI::class, "mode", null);
1331  $ilTabs->addTab(
1332  "ass_files",
1333  $lng->txt("exc_instruction_files"),
1334  $ilCtrl->getLinkTargetByClass(array("ilexassignmenteditorgui", ilResourceCollectionGUI::class))
1335  );
1336  }
1337 
1338  public function downloadGlobalFeedbackFileObject(): void
1339  {
1340  $ilCtrl = $this->ctrl;
1341 
1342  if (!$this->assignment ||
1343  !$this->assignment->getFeedbackFile()) {
1344  $ilCtrl->redirect($this, "returnToParent");
1345  }
1346  $this->domain->assignment()->sampleSolution($this->assignment->getId())->deliver();
1347  }
1348 
1349 
1350  //
1351  // PEER REVIEW
1352  //
1353 
1355  {
1356  $ilCtrl = $this->ctrl;
1357  $lng = $this->lng;
1358 
1359  $form = new ilPropertyFormGUI();
1360  $form->setTitle($lng->txt("exc_peer_review"));
1361  $form->setFormAction($ilCtrl->getFormAction($this));
1362 
1363  $peer_min = new ilNumberInputGUI($lng->txt("exc_peer_review_min_number"), "peer_min");
1364  $peer_min->setInfo($lng->txt("exc_peer_review_min_number_info")); // #16161
1365  $peer_min->setRequired(true);
1366  $peer_min->setSize(3);
1367  $peer_min->setValue(2);
1368  $form->addItem($peer_min);
1369 
1370  $peer_unlock = new ilRadioGroupInputGUI($lng->txt("exc_peer_review_simple_unlock"), "peer_unlock");
1371  $peer_unlock->addOption(new ilRadioOption($lng->txt("exc_peer_review_simple_unlock_immed"), 2));
1372  $peer_unlock->addOption(new ilRadioOption($lng->txt("exc_peer_review_simple_unlock_active"), 1));
1373  $peer_unlock->addOption(new ilRadioOption($lng->txt("exc_peer_review_simple_unlock_inactive"), 0));
1374  $peer_unlock->setRequired(true);
1375  $peer_unlock->setValue(0);
1376  $form->addItem($peer_unlock);
1377 
1378  if ($this->enable_peer_review_completion) {
1379  $peer_cmpl = new ilRadioGroupInputGUI($lng->txt("exc_peer_review_completion"), "peer_valid");
1380  $option = new ilRadioOption($lng->txt("exc_peer_review_completion_none"), ilExAssignment::PEER_REVIEW_VALID_NONE);
1381  $option->setInfo($lng->txt("exc_peer_review_completion_none_info"));
1382  $peer_cmpl->addOption($option);
1383  $option = new ilRadioOption($lng->txt("exc_peer_review_completion_one"), ilExAssignment::PEER_REVIEW_VALID_ONE);
1384  $option->setInfo($lng->txt("exc_peer_review_completion_one_info"));
1385  $peer_cmpl->addOption($option);
1386  $option = new ilRadioOption($lng->txt("exc_peer_review_completion_all"), ilExAssignment::PEER_REVIEW_VALID_ALL);
1387  $option->setInfo($lng->txt("exc_peer_review_completion_all_info"));
1388  $peer_cmpl->addOption($option);
1389  $peer_cmpl->setRequired(true);
1390  $peer_cmpl->setValue(ilExAssignment::PEER_REVIEW_VALID_NONE);
1391  $form->addItem($peer_cmpl);
1392  }
1393 
1394  $peer_dl = new ilDateTimeInputGUI($lng->txt("exc_peer_review_deadline"), "peer_dl");
1395  $peer_dl->setInfo($lng->txt("exc_peer_review_deadline_info"));
1396  $peer_dl->setShowTime(true);
1397  $form->addItem($peer_dl);
1398 
1399  $peer_prsl = new ilCheckboxInputGUI($lng->txt("exc_peer_review_personal"), "peer_prsl");
1400  $peer_prsl->setInfo($lng->txt("exc_peer_review_personal_info"));
1401  $form->addItem($peer_prsl);
1402 
1403  //feedback reminders
1404  $rmd_feedback = new ilCheckboxInputGUI($this->lng->txt("exc_reminder_feedback_setting"), "rmd_peer_status");
1405 
1406  $rmd_submit_start = new ilNumberInputGUI($this->lng->txt("exc_reminder_feedback_start"), "rmd_peer_start");
1407  $rmd_submit_start->setSize(3);
1408  $rmd_submit_start->setMaxLength(3);
1409  $rmd_submit_start->setSuffix($lng->txt('days'));
1410  $rmd_submit_start->setRequired(true);
1411  $rmd_submit_start->setMinValue(1);
1412  $rmd_feedback->addSubItem($rmd_submit_start);
1413 
1414  $rmd_submit_frequency = new ilNumberInputGUI($this->lng->txt("exc_reminder_frequency"), "rmd_peer_freq");
1415  $rmd_submit_frequency->setSize(3);
1416  $rmd_submit_frequency->setMaxLength(3);
1417  $rmd_submit_frequency->setSuffix($lng->txt('days'));
1418  $rmd_submit_frequency->setRequired(true);
1419  $rmd_submit_frequency->setMinValue(1);
1420  $rmd_feedback->addSubItem($rmd_submit_frequency);
1421 
1422  $rmd_submit_end = new ilDateTimeInputGUI($lng->txt("exc_reminder_end"), "rmd_peer_end");
1423  $rmd_submit_end->setRequired(true);
1424  $rmd_feedback->addSubItem($rmd_submit_end);
1425 
1426  $rmd_feedback->addSubItem($this->addMailTemplatesRadio(ilExAssignmentReminder::FEEDBACK_REMINDER));
1427 
1428  $form->addItem($rmd_feedback);
1429 
1430  // criteria
1431 
1432  $cats = new ilRadioGroupInputGUI($lng->txt("exc_criteria_catalogues"), "crit_cat");
1433  $form->addItem($cats);
1434 
1435  // default (no catalogue)
1436 
1437  $def = new ilRadioOption($lng->txt("exc_criteria_catalogue_default"), -1);
1438  $cats->addOption($def);
1439 
1440  $peer_text = new ilCheckboxInputGUI($lng->txt("exc_peer_review_text"), "peer_text");
1441  $def->addSubItem($peer_text);
1442 
1443  $peer_char = new ilNumberInputGUI($lng->txt("exc_peer_review_min_chars"), "peer_char");
1444  $peer_char->setInfo($lng->txt("exc_peer_review_min_chars_info"));
1445  $peer_char->setSize(3);
1446  $peer_text->addSubItem($peer_char);
1447 
1448  $peer_rating = new ilCheckboxInputGUI($lng->txt("exc_peer_review_rating"), "peer_rating");
1449  $def->addSubItem($peer_rating);
1450 
1451  $peer_file = new ilCheckboxInputGUI($lng->txt("exc_peer_review_file"), "peer_file");
1452  $peer_file->setInfo($lng->txt("exc_peer_review_file_info"));
1453  $def->addSubItem($peer_file);
1454 
1455  // catalogues
1456 
1457  $cat_objs = ilExcCriteriaCatalogue::getInstancesByParentId($this->exercise_id);
1458  if (sizeof($cat_objs)) {
1459  foreach ($cat_objs as $cat_obj) {
1460  $crits = ilExcCriteria::getInstancesByParentId($cat_obj->getId());
1461 
1462  // only non-empty catalogues
1463  if (sizeof($crits)) {
1464  $titles = array();
1465  foreach ($crits as $crit) {
1466  $titles[] = $crit->getTitle();
1467  }
1468  $opt = new ilRadioOption($cat_obj->getTitle(), $cat_obj->getId());
1469  $opt->setInfo(implode(", ", $titles));
1470  $cats->addOption($opt);
1471  }
1472  }
1473  } else {
1474  // see ilExcCriteriaCatalogueGUI::view()
1475  $url = $ilCtrl->getLinkTargetByClass("ilexccriteriacataloguegui", "");
1476  $def->setInfo('<a href="' . $url . '">[+] ' .
1477  $lng->txt("exc_add_criteria_catalogue") .
1478  '</a>');
1479  }
1480 
1481 
1482  $form->addCommandButton("updatePeerReview", $lng->txt("save"));
1483  $form->addCommandButton("editAssignment", $lng->txt("cancel"));
1484 
1485  return $form;
1486  }
1487 
1491  public function editPeerReviewObject(?ilPropertyFormGUI $a_form = null): void
1492  {
1493  $ilTabs = $this->tabs;
1494  $tpl = $this->tpl;
1495 
1496  $this->setAssignmentHeader();
1497  $ilTabs->activateTab("peer_settings");
1498 
1499  if ($a_form === null) {
1500  $a_form = $this->initPeerReviewForm();
1501  $this->getPeerReviewValues($a_form);
1502  }
1503  $tpl->setContent($a_form->getHTML());
1504  }
1505 
1509  protected function getPeerReviewValues(\ilPropertyFormGUI $a_form): void
1510  {
1511  $values = array();
1512 
1513  if ($this->assignment->getPeerReviewDeadline() > 0) {
1514  $values["peer_dl"] = new ilDateTime($this->assignment->getPeerReviewDeadline(), IL_CAL_UNIX);
1515  }
1516 
1517  $reminder = new ilExAssignmentReminder($this->exercise_id, $this->assignment->getId(), ilExAssignmentReminder::FEEDBACK_REMINDER);
1518  if ($reminder->getReminderStatus()) {
1519  $values["rmd_peer_status"] = $reminder->getReminderStatus();
1520  $values["rmd_peer_start"] = $reminder->getReminderStart();
1521  $values["rmd_peer_end"] = new ilDateTime($reminder->getReminderEnd(), IL_CAL_UNIX);
1522  $values["rmd_peer_freq"] = $reminder->getReminderFrequency();
1523  $values["rmd_peer_template_id"] = $reminder->getReminderMailTemplate();
1524  }
1525 
1526  $a_form->setValuesByArray($values);
1527 
1528  $this->handleDisabledPeerFields($a_form, true);
1529  }
1530 
1531  protected function setDisabledPeerReviewFieldValues(ilPropertyFormGUI $a_form): void
1532  {
1533  $a_form->getItemByPostVar("peer_min")->setValue($this->assignment->getPeerReviewMin());
1534  $a_form->getItemByPostVar("peer_prsl")->setChecked($this->assignment->hasPeerReviewPersonalized());
1535  $a_form->getItemByPostVar("peer_unlock")->setValue($this->assignment->getPeerReviewSimpleUnlock());
1536 
1537  if ($this->enable_peer_review_completion) {
1538  $a_form->getItemByPostVar("peer_valid")->setValue($this->assignment->getPeerReviewValid());
1539  }
1540 
1541  $cat = $this->assignment->getPeerReviewCriteriaCatalogue();
1542  if ($cat < 1) {
1543  $cat = -1;
1544 
1545  // default / no catalogue
1546  $a_form->getItemByPostVar("peer_text")->setChecked($this->assignment->hasPeerReviewText());
1547  $a_form->getItemByPostVar("peer_rating")->setChecked($this->assignment->hasPeerReviewRating());
1548  $a_form->getItemByPostVar("peer_file")->setChecked($this->assignment->hasPeerReviewFileUpload());
1549  if ($this->assignment->getPeerReviewChars() > 0) {
1550  $a_form->getItemByPostVar("peer_char")->setValue($this->assignment->getPeerReviewChars());
1551  }
1552  }
1553  $a_form->getItemByPostVar("crit_cat")->setValue($cat);
1554  }
1555 
1556  protected function handleDisabledPeerFields(
1557  ilPropertyFormGUI $a_form,
1558  bool $a_force_set_values = false
1559  ): void {
1560  // #14450
1561  $peer_review = new ilExPeerReview($this->assignment);
1562  if ($peer_review->hasPeerReviewGroups()) {
1563  // JourFixe, 2015-05-11 - editable again
1564  // $a_form->getItemByPostVar("peer_dl")->setDisabled(true);
1565 
1566  $a_form->getItemByPostVar("peer_min")->setDisabled(true);
1567  $a_form->getItemByPostVar("peer_prsl")->setDisabled(true);
1568  $a_form->getItemByPostVar("peer_unlock")->setDisabled(true);
1569 
1570  if ($this->enable_peer_review_completion) {
1571  $a_form->getItemByPostVar("peer_valid")->setDisabled(true);
1572  }
1573 
1574  $a_form->getItemByPostVar("crit_cat")->setDisabled(true);
1575  $a_form->getItemByPostVar("peer_text")->setDisabled(true);
1576  $a_form->getItemByPostVar("peer_char")->setDisabled(true);
1577  $a_form->getItemByPostVar("peer_rating")->setDisabled(true);
1578  $a_form->getItemByPostVar("peer_file")->setDisabled(true);
1579 
1580  // required number input is a problem
1581  $min = new ilHiddenInputGUI("peer_min");
1582  $min->setValue($this->assignment->getPeerReviewMin());
1583  $a_form->addItem($min);
1584  }
1585 
1586  if ($a_force_set_values ||
1587  $peer_review->hasPeerReviewGroups()) {
1588  $this->setDisabledPeerReviewFieldValues($a_form);
1589  }
1590  }
1591 
1596  protected function processPeerReviewForm(
1597  ilPropertyFormGUI $a_form
1598  ): ?array {
1599  $lng = $this->lng;
1600 
1601  $protected_peer_review_groups = false;
1602  $peer_review = new ilExPeerReview($this->assignment);
1603  if ($peer_review->hasPeerReviewGroups()) {
1604  $protected_peer_review_groups = true;
1605  }
1606 
1607  $valid = $a_form->checkInput();
1608  if ($valid) {
1609  // dates
1610  $time_deadline = $this->assignment->getDeadline();
1611  $time_deadline_ext = $this->assignment->getExtendedDeadline();
1612  $time_deadline_max = max($time_deadline, $time_deadline_ext);
1613 
1614  $date = $a_form->getItemByPostVar("peer_dl")->getDate();
1615  $time_peer = $date
1616  ? $date->get(IL_CAL_UNIX)
1617  : null;
1618 
1619  $reminder_date = $a_form->getItemByPostVar("rmd_peer_end")->getDate();
1620  $reminder_date = $reminder_date
1621  ? $reminder_date->get(IL_CAL_UNIX)
1622  : null;
1623 
1624  // peer < any deadline?
1625  if ($time_peer && $time_deadline_max && $time_peer < $time_deadline_max) {
1626  $a_form->getItemByPostVar("peer_dl")
1627  ->setAlert($lng->txt("exc_peer_deadline_mismatch"));
1628  $valid = false;
1629  }
1630 
1631  if (!$protected_peer_review_groups) {
1632  if ($a_form->getInput("crit_cat") < 0 &&
1633  !$a_form->getInput("peer_text") &&
1634  !$a_form->getInput("peer_rating") &&
1635  !$a_form->getInput("peer_file")) {
1636  $a_form->getItemByPostVar("peer_file")
1637  ->setAlert($lng->txt("select_one"));
1638  $valid = false;
1639  }
1640  }
1641 
1642  if ($valid) {
1643  $res = array();
1644  $res["peer_dl"] = $time_peer;
1645 
1646  if ($protected_peer_review_groups) {
1647  $res["peer_min"] = $this->assignment->getPeerReviewMin();
1648  $res["peer_unlock"] = $this->assignment->getPeerReviewSimpleUnlock();
1649  $res["peer_prsl"] = $this->assignment->hasPeerReviewPersonalized();
1650  $res["peer_valid"] = $this->assignment->getPeerReviewValid();
1651 
1652  $res["peer_text"] = $this->assignment->hasPeerReviewText();
1653  $res["peer_rating"] = $this->assignment->hasPeerReviewRating();
1654  $res["peer_file"] = $this->assignment->hasPeerReviewFileUpload();
1655  $res["peer_char"] = $this->assignment->getPeerReviewChars();
1656  $res["crit_cat"] = $this->assignment->getPeerReviewCriteriaCatalogue();
1657 
1658  $res["peer_valid"] = $this->enable_peer_review_completion
1659  ? $res["peer_valid"]
1660  : null;
1661  } else {
1662  $res["peer_min"] = $a_form->getInput("peer_min");
1663  $res["peer_unlock"] = $a_form->getInput("peer_unlock");
1664  $res["peer_prsl"] = $a_form->getInput("peer_prsl");
1665  $res["peer_valid"] = $a_form->getInput("peer_valid");
1666 
1667  $res["peer_text"] = $a_form->getInput("peer_text");
1668  $res["peer_rating"] = $a_form->getInput("peer_rating");
1669  $res["peer_file"] = $a_form->getInput("peer_file");
1670  $res["peer_char"] = $a_form->getInput("peer_char");
1671  $res["crit_cat"] = $a_form->getInput("crit_cat");
1672  }
1673  if ($a_form->getInput("rmd_peer_status")) {
1674  $res["rmd_peer_status"] = $a_form->getInput("rmd_peer_status");
1675  $res["rmd_peer_start"] = $a_form->getInput("rmd_peer_start");
1676  $res["rmd_peer_end"] = $reminder_date;
1677  $res["rmd_peer_freq"] = $a_form->getInput("rmd_peer_freq");
1678  $res["rmd_peer_template_id"] = $a_form->getInput("rmd_peer_template_id");
1679  }
1680 
1681  return $res;
1682  } else {
1683  $this->tpl->setOnScreenMessage('failure', $lng->txt("form_input_not_valid"));
1684  }
1685  }
1686  return null;
1687  }
1688 
1693  ilExAssignment $a_ass,
1694  array $a_input
1695  ): void {
1696  $a_ass->setPeerReviewMin((int) $a_input["peer_min"]);
1697  $a_ass->setPeerReviewDeadline((int) $a_input["peer_dl"]);
1698  $a_ass->setPeerReviewSimpleUnlock((int) $a_input["peer_unlock"]);
1699  $a_ass->setPeerReviewPersonalized((bool) $a_input["peer_prsl"]);
1700 
1701  // #18964
1702  $a_ass->setPeerReviewValid($a_input["peer_valid"]
1704 
1705  $a_ass->setPeerReviewFileUpload((bool) $a_input["peer_file"]);
1706  $a_ass->setPeerReviewChars((int) $a_input["peer_char"]);
1707  $a_ass->setPeerReviewText((bool) $a_input["peer_text"]);
1708  $a_ass->setPeerReviewRating((bool) $a_input["peer_rating"]);
1709  $a_ass->setPeerReviewCriteriaCatalogue($a_input["crit_cat"] > 0
1710  ? (int) $a_input["crit_cat"]
1711  : null);
1712 
1713  $a_ass->update();
1714 
1715  $this->importPeerReviewFormToAssignmentReminders($a_input, $a_ass->getId());
1716  }
1717 
1721  protected function updatePeerReviewObject(): void
1722  {
1723  $tpl = $this->tpl;
1724  $lng = $this->lng;
1725  $ilCtrl = $this->ctrl;
1726  $ilTabs = $this->tabs;
1727 
1728  $form = $this->initPeerReviewForm();
1729  $input = $this->processPeerReviewForm($form);
1730  if (is_array($input)) {
1731  $this->importPeerReviewFormToAssignment($this->assignment, $input);
1732  $this->tpl->setOnScreenMessage('success', $lng->txt("msg_obj_modified"), true);
1733  $ilCtrl->redirect($this, "editPeerReview");
1734  } else {
1735  $this->setAssignmentHeader();
1736  $ilTabs->activateTab("peer_settings");
1737 
1738  $form->setValuesByPost();
1739  $this->handleDisabledPeerFields($form);
1740  $tpl->setContent($form->getHTML());
1741  }
1742  }
1743 
1744 
1745  //
1746  // TEAM
1747  //
1748 
1749  public function validationTeamsFormation(
1750  int $a_num_teams,
1751  int $a_min_participants,
1752  int $a_max_participants
1753  ): array {
1754  $total_members = $this->getExerciseTotalMembers();
1755  $number_of_teams = $a_num_teams;
1756 
1757  if ($number_of_teams) {
1758  $members_per_team = round($total_members / $a_num_teams);
1759  } else {
1760  if ($a_min_participants) {
1761  $number_of_teams = round($total_members / $a_min_participants);
1762  $participants_extra_team = $total_members % $a_min_participants;
1763  if ($participants_extra_team > $number_of_teams) {
1764  //Can't create teams with this minimum of participants.
1765  $message = sprintf($this->lng->txt("exc_team_minimal_too_big"), $a_min_participants);
1766  return array("status" => "error", "msg" => $message, "field" => "min_participants_team");
1767  }
1768  }
1769  $members_per_team = 0;
1770  }
1771 
1772  if ($a_min_participants > $a_max_participants) {
1773  $message = $this->lng->txt("exc_team_min_big_than_max");
1774  return array("status" => "error", "msg" => $message, "field" => "max_participants_team");
1775  }
1776 
1777  if ($a_max_participants > 0 && $members_per_team > $a_max_participants) {
1778  $message = sprintf($this->lng->txt("exc_team_max_small_than_members"), $a_max_participants, $members_per_team);
1779  return array("status" => "error", "msg" => $message, "field" => "max_participants_team");
1780  }
1781 
1782  if ($members_per_team > 0 && $members_per_team < $a_min_participants) {
1783  $message = sprintf($this->lng->txt("exc_team_min_small_than_members"), $a_min_participants, $members_per_team);
1784  return array("status" => "error", "msg" => $message, "field" => "min_participants_team");
1785  }
1786 
1787  return array("status" => "success", "msg" => "");
1788  }
1789 
1790  // Get the total number of exercise members
1791  public function getExerciseTotalMembers(): int
1792  {
1793  $exercise = new ilObjExercise($this->exercise_id, false);
1794  $exc_members = new ilExerciseMembers($exercise);
1795 
1796  return count($exc_members->getMembers());
1797  }
1798 
1799  public function generateTeams(
1800  ilExAssignment $a_assignment,
1801  array $a_input
1802  ): void {
1803  $ass_type = $a_assignment->getAssignmentType();
1804  if ($ass_type->usesTeams() &&
1805  $a_input['team_creator'] == ilExAssignment::TEAMS_FORMED_BY_TUTOR) {
1806  if ($a_input['team_creation'] == ilExAssignment::TEAMS_FORMED_BY_RANDOM) {
1807  $number_teams = $a_input['number_teams'];
1808  if (count(ilExAssignmentTeam::getAssignmentTeamMap($a_assignment->getId())) == 0) {
1809  $ass_team = new ilExAssignmentTeam();
1810  $ass_team->createRandomTeams($this->exercise_id, $a_assignment->getId(), $number_teams, $a_input['min_participants_team']);
1811  }
1812  } elseif ($a_input['team_creation'] == ilExAssignment::TEAMS_FORMED_BY_ASSIGNMENT) {
1813  ilExAssignmentTeam::adoptTeams($a_input["ass_adpt"], $a_assignment->getId());
1814  $this->tpl->setOnScreenMessage('info', $this->lng->txt("exc_teams_assignment_adopted"), true);
1815  }
1816  }
1817  }
1818 }
getPeerReviewValues(\ilPropertyFormGUI $a_form)
setStartTime(?int $a_val)
setRelativeDeadline(int $a_val)
importPeerReviewFormToAssignmentReminders(array $a_input, int $a_ass_id)
static getAdoptableTeamAssignments(int $a_exercise_id, ?int $a_exclude_ass_id=null, ?int $a_user_id=null)
setFilenames(array $a_filenames)
Class ilExAssignmentEditorGUI.
This class represents an option in a radio group.
$res
Definition: ltiservices.php:66
initAssignmentForm(int $a_type, string $a_mode="create")
setSuffix(string $a_value)
handleDisabledFields(ilPropertyFormGUI $a_form, bool $a_force_set_values=false)
ILIAS Exercise InternalDomainService $domain
Exercise assignment.
$context
Definition: webdav.php:31
const IL_CAL_DATETIME
ILIAS ResourceStorage Services $irss
This class represents a selection list property in a property form.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
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...
setFeedbackFile(?string $a_value)
getItemByPostVar(string $a_post_var)
setPeerReviewValid(int $a_value)
Set peer review validation.
setTitle(string $a_title, bool $hidden=false)
Sets title in standard template.
setFeedbackDateCustom(int $a_value)
Set (global) feedback file availability using a custom date.
static getInstancesByParentId(int $a_parent_id)
handleGlobalFeedbackFileUpload(int $ass_id, array $a_file)
This class represents a file property in a property form.
setInfo(string $a_info)
processForm(ilPropertyFormGUI $a_form)
Custom form validation.
static stripSlashes(string $a_str, bool $a_strip_html=true, string $a_allow="")
setPeerReviewMin(int $a_value)
Help GUI class.
setPeerReviewFileUpload(bool $a_val)
$valid
static lookupTitle(int $a_id)
Handles exercise Grade reminder mail placeholders If all contexts are using the same placeholders...
This class represents a file wizard property in a property form.
setDate($a_date, int $a_format)
Set date.
static saveAssOrderOfExercise(int $a_ex_id, array $a_order)
setDeadlineMode(int $a_val)
Set deadline mode.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
validationTeamsFormation(int $a_num_teams, int $a_min_participants, int $a_max_participants)
Mandatory RandomAssignmentsManager $random_manager
setShowTime(bool $a_showtime)
static getInstancesByParentId(int $a_parent_id)
addOption(ilRadioOption $a_option)
loadLanguageModule(string $a_module)
Load language module.
$url
Definition: shib_logout.php:68
setOptions(array $a_options)
setFeedbackCron(bool $a_value)
Toggle (global) feedback file cron.
static orderAssByDeadline(int $a_ex_id)
generateTeams(ilExAssignment $a_assignment, array $a_input)
Handles exercise Peer reminder mail placeholders If all contexts are using the same placeholders...
const IL_CAL_UNIX
getInput(string $a_post_var, bool $ensureValidation=true)
Returns the input of an item, if item provides getInput method and as fallback the value of the HTTP-...
setInstruction(string $a_val)
This class represents a date/time property in a property form.
while($session_entry=$r->fetchRow(ilDBConstants::FETCHMODE_ASSOC)) return null
getAssignmentValues(ilPropertyFormGUI $a_form)
setTeamTutor(bool $a_value)
This class represents a hidden form property in a property form.
Exercise peer review.
ILIAS Exercise InternalGUIService $gui
Class ilObjExercise.
This class represents a property in a property form.
setPeerReviewRating(bool $a_val)
setExtendedDeadline(?int $a_val)
Manages random mandatory assignments of an exercise (business logic)
editPeerReviewObject(?ilPropertyFormGUI $a_form=null)
redirect(object $a_gui_obj, ?string $a_cmd=null, ?string $a_anchor=null, bool $is_async=false)
processPeerReviewForm(ilPropertyFormGUI $a_form)
This class represents a number property in a property form.
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...
global $DIC
Definition: shib_login.php:26
setMandatory(bool $a_val)
setFeedbackDate(int $a_value)
setValuesByArray(array $a_values, bool $a_restrict_to_value_keys=false)
setPeerReviewDeadline(int $a_val)
setRequired(bool $a_required)
setRelDeadlineLastSubmission(int $a_val)
static getAssignmentTeamMap(int $a_ass_id)
exit
importFormToAssignmentReminders(array $a_input, int $a_ass_id)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
setPeerReviewPersonalized(bool $a_val)
saveReminderData(ilExAssignmentReminder $reminder, array $a_input)
importFormToAssignment(ilExAssignment $a_ass, array $a_input)
Import form values to assignment.
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
Definition: plugin.php:23
__construct(Container $dic, ilPlugin $plugin)
This class represents a text area property in a property form.
setDescription(string $a_descr)
Sets description below title in standard template.
setPeerReviewSimpleUnlock(int $a_value)
setPeerReviewChars(?int $a_value)
handleDisabledPeerFields(ilPropertyFormGUI $a_form, bool $a_force_set_values=false)
setPeerReviewText(bool $a_val)
$message
Definition: xapiexit.php:31
ILIAS Exercise InstructionFile InstructionFileManager $instruction_files
importPeerReviewFormToAssignment(ilExAssignment $a_ass, array $a_input)
setParameter(object $a_gui_obj, string $a_parameter, $a_value)
setMaxFile(?int $a_value)
setDisabledPeerReviewFieldValues(ilPropertyFormGUI $a_form)
static adoptTeams(int $a_source_ass_id, int $a_target_ass_id, ?int $a_user_id=null, ?int $a_exc_ref_id=null)
setTitle(string $a_val)
setPeerReview(bool $a_value)
setReminderStatus(?bool $a_status)
Set reminder for users without submission.
addMailTemplatesRadio(string $a_reminder_type)
setPeerReviewCriteriaCatalogue(?int $a_value)
setDeadline(?int $a_val)
Handles exercise Submit reminder mail placeholders If all contexts are using the same placeholders...
setContent(string $a_html)
Sets content for standard template.
ILIAS FileUpload FileUpload $upload
setDisabledFieldValues(ilPropertyFormGUI $a_form)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...