ILIAS  release_8 Revision v8.19
All Data Structures Namespaces Files Functions Variables Modules Pages
class.ilExAssignmentEditorGUI.php
Go to the documentation of this file.
1 <?php
2 
20 
29 {
30  protected ilCtrl $ctrl;
31  protected ilTabsGUI $tabs;
32  protected ilLanguage $lng;
35  protected ilSetting $settings;
36  protected ilHelpGUI $help;
37  protected int $exercise_id;
42  protected ?ilObjExercise $exc;
44  protected string $requested_ass_type;
45  protected int $requested_type;
49  protected array $requested_ass_ids;
53  protected array $requested_order;
54 
55  public function __construct(
56  int $a_exercise_id,
57  bool $a_enable_peer_review_completion_settings,
58  ilExAssignment $a_ass = null
59  ) {
61  global $DIC;
62 
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();
68  $this->settings = $DIC->settings();
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;
73  $this->types = ilExAssignmentTypes::getInstance();
74  $this->type_guis = ilExAssignmentTypesGUI::getInstance();
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()
81  );
82  $this->requested_ass_ids = $request->getAssignmentIds();
83  $this->requested_order = $request->getOrder();
84  }
85 
89  public function executeCommand(): void
90  {
91  $ilCtrl = $this->ctrl;
92  $ilTabs = $this->tabs;
93  $lng = $this->lng;
94 
95  $class = $ilCtrl->getNextClass($this);
96  $cmd = $ilCtrl->getCmd("listAssignments");
97 
98  switch ($class) {
99  case "ilpropertyformgui":
100  $form = $this->initAssignmentForm($this->requested_ass_type);
101  $ilCtrl->forwardCommand($form);
102  break;
103 
104  // instruction files
105  case "ilexassignmentfilesystemgui":
106  $this->setAssignmentHeader();
107  $ilTabs->activateTab("ass_files");
108 
109  $fstorage = new ilFSWebStorageExercise($this->exercise_id, $this->assignment->getId());
110  $fstorage->create();
111  $fs_gui = new ilExAssignmentFileSystemGUI($fstorage->getAbsolutePath());
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);
116  break;
117 
118  case "ilexpeerreviewgui":
119  $ilTabs->clearTargets();
120  $ilTabs->setBackTarget(
121  $lng->txt("back"),
122  $ilCtrl->getLinkTarget($this, "listAssignments")
123  );
124 
125  $peer_gui = new ilExPeerReviewGUI($this->assignment);
126  $ilCtrl->forwardCommand($peer_gui);
127  break;
128 
129  default:
130  $this->{$cmd . "Object"}();
131  break;
132  }
133  }
134 
138  public function listAssignmentsObject(): void
139  {
140  $tpl = $this->tpl;
141  $ilToolbar = $this->toolbar;
142  $ilCtrl = $this->ctrl;
143 
144  $ilCtrl->setParameter($this, "ass_id", null);
145 
146  $ilToolbar->setFormAction($ilCtrl->getFormAction($this, "addAssignment"));
147 
148  $ilToolbar->addStickyItem($this->getTypeDropdown(), true);
149 
150  $button = ilSubmitButton::getInstance();
151  $button->setCaption("exc_add_assignment");
152  $button->setCommand("addAssignment");
153  $ilToolbar->addStickyItem($button);
154 
155 
156  $t = new ilAssignmentsTableGUI($this, "listAssignments", $this->exercise_id);
157  $tpl->setContent($t->getHTML());
158  }
159 
164  public function addAssignmentObject(): void
165  {
166  $tpl = $this->tpl;
167  $ilCtrl = $this->ctrl;
168 
169  // #16163 - ignore ass id from request
170  $this->assignment = null;
171 
172  if ($this->requested_type == 0) {
173  $ilCtrl->redirect($this, "listAssignments");
174  }
175 
176  $form = $this->initAssignmentForm($this->requested_type, "create");
177  $tpl->setContent($form->getHTML());
178  }
179 
183  protected function getTypeDropdown(): ilSelectInputGUI
184  {
185  $lng = $this->lng;
186 
187  $types = [];
188  foreach ($this->types->getAllAllowed($this->exc) as $k => $t) {
189  $types[$k] = $t->getTitle();
190  }
191 
192  $ty = new ilSelectInputGUI($lng->txt("exc_assignment_type"), "type");
193  $ty->setOptions($types);
194  $ty->setRequired(true);
195  return $ty;
196  }
197 
201  protected function initAssignmentForm(
202  int $a_type,
203  string $a_mode = "create"
204  ): ilPropertyFormGUI {
205  $lng = $this->lng;
206  $ilCtrl = $this->ctrl;
207 
208  $ass_type = $this->types->getById($a_type);
209  $ass_type_gui = $this->type_guis->getById($a_type);
210  $ilCtrl->setParameter($this, "ass_type", $a_type);
211 
212  $lng->loadLanguageModule("form");
213  $form = new ilPropertyFormGUI();
214  if ($a_mode == "edit") {
215  $form->setTitle($lng->txt("exc_edit_assignment"));
216  } else {
217  $form->setTitle($lng->txt("exc_new_assignment"));
218  }
219  $form->setFormAction($ilCtrl->getFormAction($this));
220 
221  // title
222  $ti = new ilTextInputGUI($lng->txt("title"), "title");
223  $ti->setMaxLength(200);
224  $ti->setRequired(true);
225  $form->addItem($ti);
226 
227  // type
228  $ty = $this->getTypeDropdown();
229  $ty->setValue($a_type);
230  $ty->setDisabled(true);
231  $form->addItem($ty);
232 
233  //
234  // type specific start
235  //
236 
237  $ass_type_gui->addEditFormCustomProperties($form);
238 
239  //
240  // type specific end
241  //
242 
243  if ($ass_type->usesTeams()) {
244  if ($a_mode == "edit") {
245  $has_teams = (bool) count(ilExAssignmentTeam::getAssignmentTeamMap($this->assignment->getId()));
246  } else {
247  $has_teams = false;
248  }
249 
250  // Radio for creators
251  $rd_team = new ilRadioGroupInputGUI($lng->txt("exc_team_formation"), "team_creator");
253 
254  $radio_participants = new ilRadioOption(
255  $lng->txt("exc_team_by_participants"),
256  (string) ilExAssignment::TEAMS_FORMED_BY_PARTICIPANTS,
257  $lng->txt("exc_team_by_participants_info")
258  );
259 
260  $radio_tutors = new ilRadioOption(
261  $lng->txt("exc_team_by_tutors"),
263  $lng->txt("exc_team_by_tutors_info")
264  );
265 
266  #23679
267  if (!$has_teams) {
268  // Creation options
269  $rd_creation_method = new ilRadioGroupInputGUI($lng->txt("exc_team_creation"), "team_creation");
270  $rd_creation_method->setRequired(true);
271  $rd_creation_method->setValue("0");
272 
273  //manual
274  $rd_creation_manual = new ilRadioOption(
275  $lng->txt("exc_team_by_tutors_manual"),
276  "0",
277  $lng->txt("exc_team_by_tutors_manual_info")
278  );
279  $rd_creation_method->addOption($rd_creation_manual);
280 
281  //random options
282  $add_info = "";
283  if ($this->getExerciseTotalMembers() < 4) {
284  $add_info = " <strong>" . $lng->txt("exc_team_by_random_add_info") . "</strong>";
285  }
286  $rd_creation_random = new ilRadioOption(
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
290  );
291  $rd_creation_method->addOption($rd_creation_random);
292 
293  $number_teams = new ilNumberInputGUI($lng->txt("exc_num_teams"), "number_teams");
294  $number_teams->setSize(3);
295  $number_teams->setMinValue(1);
296  $number_teams->setMaxValue($this->getExerciseTotalMembers());
297  $number_teams->setRequired(true);
298  $number_teams->setSuffix($lng->txt("exc_team_assignment_adopt_teams"));
299  $rd_creation_random->addSubItem($number_teams);
300 
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);
304  $min_team_participants->setMaxValue($this->getExerciseTotalMembers());
305  $min_team_participants->setRequired(true);
306  $min_team_participants->setSuffix($lng->txt("exc_participants"));
307  $rd_creation_random->addSubItem($min_team_participants);
308 
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);
312  $max_team_participants->setMaxValue($this->getExerciseTotalMembers());
313  $max_team_participants->setRequired(true);
314  $max_team_participants->setSuffix($lng->txt("exc_participants"));
315  $rd_creation_random->addSubItem($max_team_participants);
316 
317  $options = ilExAssignmentTeam::getAdoptableTeamAssignments($this->exercise_id);
318  if (count($options)) {
319  $radio_assignment = new ilRadioOption(
320  $lng->txt("exc_team_by_assignment"),
322  $lng->txt("exc_team_by_assignment_info")
323  );
324 
325  $radio_assignment_adopt = new ilRadioGroupInputGUI($lng->txt("exc_assignment"), "ass_adpt");
326  $radio_assignment_adopt->setRequired(true);
327  $radio_assignment_adopt->addOption(new ilRadioOption($lng->txt("exc_team_assignment_adopt_none"), -1));
328 
329  foreach ($options as $id => $item) {
330  $option = new ilRadioOption($item["title"], $id);
331  $option->setInfo($lng->txt("exc_team_assignment_adopt_teams") . ": " . $item["teams"]);
332  $radio_assignment_adopt->addOption($option);
333  }
334  $radio_assignment->addSubItem($radio_assignment_adopt);
335  $rd_creation_method->addOption($radio_assignment);
336  }
337 
338  $radio_tutors->addSubItem($rd_creation_method);
339  }
340  $rd_team->addOption($radio_participants);
341  $rd_team->addOption($radio_tutors);
342  /*if(!$has_teams) {
343  $rd_team->addOption($radio_assignment);
344  }*/
345  $form->addItem($rd_team);
346 
347  if ($has_teams) {
348  $rd_team->setDisabled(true);
349  }
350  }
351 
352  // mandatory
353  if (!$this->random_manager->isActivated()) {
354  $cb = new ilCheckboxInputGUI($lng->txt("exc_mandatory"), "mandatory");
355  $cb->setInfo($lng->txt("exc_mandatory_info"));
356  $cb->setChecked(true);
357  $form->addItem($cb);
358  } else {
359  //
360  $ne = new ilNonEditableValueGUI($lng->txt("exc_mandatory"), "");
361  $ne->setValue($lng->txt("exc_mandatory_rand_determined"));
362  $form->addItem($ne);
363  }
364 
365  // Work Instructions
366  $sub_header = new ilFormSectionHeaderGUI();
367  $sub_header->setTitle($lng->txt("exc_work_instructions"));
368  $form->addItem($sub_header);
369 
370  $desc_input = new ilTextAreaInputGUI($lng->txt("exc_instruction"), "instruction");
371  $desc_input->setRows(20);
372  if (ilObjAdvancedEditing::_getRichTextEditor() === "tinymce") {
373  $desc_input->setUseRte(true);
374  $desc_input->setRteTagSet("mini");
375  }
376  $form->addItem($desc_input);
377 
378  // files
379  if ($a_mode == "create") {
380  $files = new ilFileWizardInputGUI($lng->txt('objs_file'), 'files');
381  $files->setFilenames(array(0 => ''));
382  $form->addItem($files);
383  }
384 
385  // Schedule
386  $sub_header = new ilFormSectionHeaderGUI();
387  $sub_header->setTitle($lng->txt("exc_schedule"));
388  $form->addItem($sub_header);
389 
390  // start time
391  $start_date = new ilDateTimeInputGUI($lng->txt("exc_start_time"), "start_time");
392  $start_date->setShowTime(true);
393  $form->addItem($start_date);
394 
395  // Deadline Mode
396  $radg = new ilRadioGroupInputGUI($lng->txt("exc_deadline"), "deadline_mode");
397  $radg->setValue(0);
398  $op1 = new ilRadioOption($lng->txt("exc_fixed_date"), 0, $lng->txt("exc_fixed_date_info"));
399  $radg->addOption($op1);
400  $op2 = new ilRadioOption($lng->txt("exc_relative_date"), 1, $lng->txt("exc_relative_date_info"));
401  $radg->addOption($op2);
402  $form->addItem($radg);
403 
404  // Deadline fixed date
405  $deadline = new ilDateTimeInputGUI($lng->txt("date"), "deadline");
406  $deadline->setShowTime(true);
407  $op1->addSubItem($deadline);
408 
409  // extended Deadline
410  $deadline2 = new ilDateTimeInputGUI($lng->txt("exc_deadline_extended"), "deadline2");
411  $deadline2->setInfo($lng->txt("exc_deadline_extended_info"));
412  $deadline2->setShowTime(true);
413  $deadline->addSubItem($deadline2);
414 
415 
416  // submit reminder
417  $rmd_submit = new ilCheckboxInputGUI($this->lng->txt("exc_reminder_submit_setting"), "rmd_submit_status");
418 
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);
427 
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);
435 
436  $rmd_submit_end = new ilDateTimeInputGUI($lng->txt("exc_reminder_end"), "rmd_submit_end");
437  $rmd_submit_end->setRequired(true);
438  $rmd_submit->addSubItem($rmd_submit_end);
439 
440  $rmd_submit->addSubItem($this->addMailTemplatesRadio(ilExAssignmentReminder::SUBMIT_REMINDER));
441 
442  // grade reminder
443  $rmd_grade = new ilCheckboxInputGUI($this->lng->txt("exc_reminder_grade_setting"), "rmd_grade_status");
444 
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);
452 
453  $rmd_grade_end = new ilDateTimeInputGUI($lng->txt("exc_reminder_end"), "rmd_grade_end");
454  $rmd_grade_end->setRequired(true);
455  $rmd_grade->addSubItem($rmd_grade_end);
456 
457  $rmd_grade->addSubItem($this->addMailTemplatesRadio(ilExAssignmentReminder::GRADE_REMINDER));
458 
459  $form->addItem($rmd_submit);
460  $form->addItem($rmd_grade);
461 
462  // relative deadline
463  $ti = new ilNumberInputGUI($lng->txt("exc_relative_date_period"), "relative_deadline");
464  $ti->setMinValue(1);
465  $ti->setRequired(true);
466  $ti->setMaxLength(3);
467  $ti->setSuffix($lng->txt("days"));
468  $ti->setSize(3);
469  $op2->addSubItem($ti);
470 
471  // last submission for relative deadline
472  $last_submission = new ilDateTimeInputGUI($lng->txt("exc_rel_last_submission"), "rel_deadline_last_subm");
473  $last_submission->setInfo($lng->txt("exc_rel_last_submission_info"));
474  $last_submission->setShowTime(true);
475  $op2->addSubItem($last_submission);
476 
477 
478 
479  // max number of files
480  if ($ass_type->usesFileUpload()) {
481  $sub_header = new ilFormSectionHeaderGUI();
482  $sub_header->setTitle($ass_type->getTitle());
483  $form->addItem($sub_header);
484  $max_file_tgl = new ilCheckboxInputGUI($lng->txt("exc_max_file_tgl"), "max_file_tgl");
485  $form->addItem($max_file_tgl);
486 
487  $max_file = new ilNumberInputGUI($lng->txt("exc_max_file"), "max_file");
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);
493  }
494 
495  // after submission
496  $sub_header = new ilFormSectionHeaderGUI();
497  $sub_header->setTitle($lng->txt("exc_after_submission"));
498  $form->addItem($sub_header);
499 
500  if (!$ass_type->usesTeams() && !$this->random_manager->isActivated()) {
501  // peer review
502  $peer = new ilCheckboxInputGUI($lng->txt("exc_peer_review"), "peer");
503  $peer->setInfo($lng->txt("exc_peer_review_ass_setting_info"));
504  $form->addItem($peer);
505  }
506 
507 
508  // global feedback
509 
510  $fb = new ilCheckboxInputGUI($lng->txt("exc_global_feedback_file"), "fb");
511  $form->addItem($fb);
512 
513  $fb_file = new ilFileInputGUI($lng->txt("file"), "fb_file");
514  $fb_file->setRequired(true); // will be disabled on update if file exists - see getAssignmentValues()
515  // $fb_file->setAllowDeletion(true); makes no sense if required (overwrite or keep)
516  $fb->addSubItem($fb_file);
517 
518  $fb_date = new ilRadioGroupInputGUI($lng->txt("exc_global_feedback_file_date"), "fb_date");
519  $fb_date->setRequired(true);
520  $fb_date->addOption(new ilRadioOption($lng->txt("exc_global_feedback_file_date_deadline"), ilExAssignment::FEEDBACK_DATE_DEADLINE));
521  $fb_date->addOption(new ilRadioOption($lng->txt("exc_global_feedback_file_date_upload"), ilExAssignment::FEEDBACK_DATE_SUBMISSION));
522 
523  //Extra radio option with date selection
524  $fb_date_custom_date = new ilDateTimeInputGUI($lng->txt("date"), "fb_date_custom");
525  $fb_date_custom_date->setRequired(true);
526  $fb_date_custom_date->setShowTime(true);
527  $fb_date_custom_option = new ilRadioOption($lng->txt("exc_global_feedback_file_after_date"), ilExAssignment::FEEDBACK_DATE_CUSTOM);
528  $fb_date_custom_option->addSubItem($fb_date_custom_date);
529  $fb_date->addOption($fb_date_custom_option);
530 
531 
532  $fb->addSubItem($fb_date);
533 
534  $fb_cron = new ilCheckboxInputGUI($lng->txt("exc_global_feedback_file_cron"), "fb_cron");
535  $fb_cron->setInfo($lng->txt("exc_global_feedback_file_cron_info"));
536  $fb->addSubItem($fb_cron);
537 
538 
539  if ($a_mode == "create") {
540  $form->addCommandButton("saveAssignment", $lng->txt("save"));
541  } else {
542  $form->addCommandButton("updateAssignment", $lng->txt("save"));
543  }
544  $form->addCommandButton("listAssignments", $lng->txt("cancel"));
545 
546  return $form;
547  }
548 
549  public function addMailTemplatesRadio(string $a_reminder_type): ilRadioGroupInputGUI
550  {
551  global $DIC;
552 
553  $post_var = "rmd_" . $a_reminder_type . "_template_id";
554 
555  $r_group = new ilRadioGroupInputGUI($this->lng->txt("exc_reminder_mail_template"), $post_var);
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);
559 
560  switch ($a_reminder_type) {
563  break;
566  break;
569  break;
570  default:
571  exit();
572  }
573 
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());
580  }
581  }
582 
583  return $r_group;
584  }
585 
592  protected function processForm(ilPropertyFormGUI $a_form): ?array
593  {
594  $lng = $this->lng;
595 
596  $protected_peer_review_groups = false;
597 
598  if ($this->assignment) {
599  if ($this->assignment->getPeerReview()) {
600  $peer_review = new ilExPeerReview($this->assignment);
601  if ($peer_review->hasPeerReviewGroups()) {
602  $protected_peer_review_groups = true;
603  }
604  }
605 
606  if ($this->assignment->getFeedbackFile()) {
607  $a_form->getItemByPostVar("fb_file")->setRequired(false); // #15467
608  }
609  }
610 
611  $valid = $a_form->checkInput();
612  if ($protected_peer_review_groups) {
613  // checkInput() will add alert to disabled fields
614  $a_form->getItemByPostVar("deadline")->setAlert("");
615  $a_form->getItemByPostVar("deadline2")->setAlert("");
616  }
617 
618  if ($valid) {
619  $type = $a_form->getInput("type");
620  $ass_type = $this->types->getById($type);
621 
622  // dates
623 
624  $time_start = $a_form->getItemByPostVar("start_time")->getDate();
625  $time_start = $time_start
626  ? $time_start->get(IL_CAL_UNIX)
627  : null;
628 
629  $time_fb_custom_date = $a_form->getItemByPostVar("fb_date_custom")->getDate();
630  $time_fb_custom_date = $time_fb_custom_date
631  ? $time_fb_custom_date->get(IL_CAL_UNIX)
632  : null;
633 
634  $reminder_submit_end_date = $a_form->getItemByPostVar("rmd_submit_end")->getDate();
635  $reminder_submit_end_date = $reminder_submit_end_date
636  ? $reminder_submit_end_date->get(IL_CAL_UNIX)
637  : null;
638 
639  $reminder_grade_end_date = $a_form->getItemByPostVar("rmd_grade_end")->getDate();
640  $reminder_grade_end_date = $reminder_grade_end_date
641  ? $reminder_grade_end_date->get(IL_CAL_UNIX)
642  : null;
643 
644  $time_deadline = null;
645  $time_deadline_ext = null;
646 
647  if ((int) $a_form->getInput("deadline_mode") == ilExAssignment::DEADLINE_ABSOLUTE) {
648  $time_deadline = $a_form->getItemByPostVar("deadline")->getDate();
649  $time_deadline = $time_deadline
650  ? $time_deadline->get(IL_CAL_UNIX)
651  : null;
652  $time_deadline_ext = $a_form->getItemByPostVar("deadline2")->getDate();
653  $time_deadline_ext = $time_deadline_ext
654  ? $time_deadline_ext->get(IL_CAL_UNIX)
655  : null;
656  }
657 
658 
659  // handle disabled elements
660  if ($protected_peer_review_groups) {
661  $time_deadline = $this->assignment->getDeadline();
662  $time_deadline_ext = $this->assignment->getExtendedDeadline();
663  }
664 
665  // no deadline?
666  if (!$time_deadline) {
667  // peer review
668  if (!$protected_peer_review_groups &&
669  $a_form->getInput("peer")) {
670  $a_form->getItemByPostVar("peer")
671  ->setAlert($lng->txt("exc_needs_fixed_deadline"));
672  $valid = false;
673  }
674  // global feedback
675  if ($a_form->getInput("fb") &&
676  $a_form->getInput("fb_date") == ilExAssignment::FEEDBACK_DATE_DEADLINE) {
677  $a_form->getItemByPostVar("fb")
678  ->setAlert($lng->txt("exc_needs_deadline"));
679  $valid = false;
680  }
681  } else {
682  // #18269
683  if ($a_form->getInput("peer")) {
684  $time_deadline_max = max($time_deadline, $time_deadline_ext);
685  $peer_dl = $this->assignment // #18380
686  ? $this->assignment->getPeerReviewDeadline()
687  : null;
688  if ($peer_dl && $peer_dl < $time_deadline_max) {
689  $a_form->getItemByPostVar($peer_dl < $time_deadline_ext
690  ? "deadline2"
691  : "deadline")
692  ->setAlert($lng->txt("exc_peer_deadline_mismatch"));
693  $valid = false;
694  }
695  }
696 
697  if ($time_deadline_ext && $time_deadline_ext < $time_deadline) {
698  $a_form->getItemByPostVar("deadline2")
699  ->setAlert($lng->txt("exc_deadline_ext_mismatch"));
700  $valid = false;
701  }
702 
703  $time_deadline_min = $time_deadline_ext
704  ? min($time_deadline, $time_deadline_ext)
705  : $time_deadline;
706 
707  // start > any deadline ?
708  if ($time_start && $time_deadline_min && $time_start > $time_deadline_min) {
709  $a_form->getItemByPostVar("start_time")
710  ->setAlert($lng->txt("exc_start_date_should_be_before_end_date"));
711  $valid = false;
712  }
713  }
714 
715  if ($ass_type->usesTeams()) {
716  if ($a_form->getInput("team_creation") == ilExAssignment::TEAMS_FORMED_BY_RANDOM &&
717  $a_form->getInput("team_creator") == ilExAssignment::TEAMS_FORMED_BY_TUTOR) {
718  $team_validation = $this->validationTeamsFormation(
719  $a_form->getInput("number_teams"),
720  $a_form->getInput("min_participants_team"),
721  $a_form->getInput("max_participants_team")
722  );
723  if ($team_validation['status'] == 'error') {
724  $a_form->getItemByPostVar("team_creation")
725  ->setAlert($team_validation['msg']);
726  $a_form->getItemByPostVar($team_validation["field"])
727  ->setAlert($lng->txt("exc_value_can_not_set"));
728  $valid = false;
729  }
730  }
731  }
732  if ($valid) {
733  $res = array(
734  // core
735  "type" => $a_form->getInput("type")
736  ,"title" => trim($a_form->getInput("title"))
737  ,"instruction" => trim($a_form->getInput("instruction"))
738  // dates
739  ,"start" => $time_start
740  ,"deadline" => $time_deadline
741  ,"deadline_ext" => $time_deadline_ext
742  ,"max_file" => $a_form->getInput("max_file_tgl")
743  ? $a_form->getInput("max_file")
744  : null
745  );
746  if (!$this->random_manager->isActivated()) {
747  $res["mandatory"] = $a_form->getInput("mandatory");
748  }
749 
750  $res['team_creator'] = $a_form->getInput("team_creator");
751  $res["team_creation"] = $a_form->getInput("team_creation");
752  if ($a_form->getInput("team_creator") == ilExAssignment::TEAMS_FORMED_BY_TUTOR) {
753  if ($a_form->getInput("team_creation") == ilExAssignment::TEAMS_FORMED_BY_RANDOM) {
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");
757  } elseif ($a_form->getInput("team_creation") == ilExAssignment::TEAMS_FORMED_BY_ASSIGNMENT) {
758  $res['ass_adpt'] = $a_form->getInput("ass_adpt");
759  }
760  }
761 
762  $res["deadline_mode"] = $a_form->getInput("deadline_mode");
763 
764  if ($res["deadline_mode"] == ilExAssignment::DEADLINE_RELATIVE) {
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
768  ? $rel_deadline_last_subm->get(IL_CAL_UNIX)
769  : null;
770  $res["rel_deadline_last_subm"] = $rel_deadline_last_subm;
771  }
772 
773  // peer
774  if ($a_form->getInput("peer") ||
775  $protected_peer_review_groups) {
776  $res["peer"] = true;
777  }
778 
779  // files
780  if (isset($_FILES["files"])) {
781  // #15994 - we are keeping the upload files array structure
782  // see ilFSStorageExercise::uploadAssignmentFiles()
783  $res["files"] = $_FILES["files"];
784  }
785 
786  // global feedback
787  if ($a_form->getInput("fb")) {
788  $res["fb"] = true;
789  $res["fb_cron"] = $a_form->getInput("fb_cron");
790  $res["fb_date"] = $a_form->getInput("fb_date");
791  $res["fb_date_custom"] = $time_fb_custom_date;
792 
793  if ($_FILES["fb_file"]["tmp_name"]) {
794  $res["fb_file"] = $_FILES["fb_file"];
795  }
796  }
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");
803  }
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");
809  }
810 
811  return $res;
812  } else {
813  $this->tpl->setOnScreenMessage('failure', $lng->txt("form_input_not_valid"));
814  }
815  }
816 
817  return null;
818  }
819 
825  protected function importFormToAssignment(
826  ilExAssignment $a_ass,
827  array $a_input
828  ): void {
829  $is_create = !(bool) $a_ass->getId();
830 
831  $a_ass->setTitle($a_input["title"]);
832  $a_ass->setInstruction($a_input["instruction"]);
833  if (!$this->random_manager->isActivated()) {
834  $a_ass->setMandatory($a_input["mandatory"]);
835  }
836 
837  $a_ass->setStartTime($a_input["start"]);
838  $a_ass->setDeadline($a_input["deadline"]);
839  $a_ass->setExtendedDeadline($a_input["deadline_ext"]);
840  $a_ass->setDeadlineMode($a_input["deadline_mode"]);
841  $a_ass->setRelativeDeadline((int) ($a_input["relative_deadline"] ?? 0));
842  $a_ass->setRelDeadlineLastSubmission((int) ($a_input["rel_deadline_last_subm"] ?? 0));
843 
844  $a_ass->setMaxFile($a_input["max_file"]);
845  $a_ass->setTeamTutor((bool) ($a_input["team_creator"] ?? false));
846 
847  //$a_ass->setPortfolioTemplateId($a_input['template_id']);
848 
849  //$a_ass->setMinCharLimit($a_input['min_char_limit']);
850  //$a_ass->setMaxCharLimit($a_input['max_char_limit']);
851 
852  if (!$this->random_manager->isActivated()) {
853  $a_ass->setPeerReview((bool) ($a_input["peer"] ?? false));
854  }
855 
856  // peer review default values (on separate form)
857  if ($is_create) {
858  $a_ass->setPeerReviewMin(2);
859  $a_ass->setPeerReviewSimpleUnlock(false);
861  $a_ass->setPeerReviewPersonalized(false);
862  $a_ass->setPeerReviewFileUpload(false);
863  $a_ass->setPeerReviewText(true);
864  $a_ass->setPeerReviewRating(true);
865  }
866 
867  if (isset($a_input["fb"])) {
868  $a_ass->setFeedbackCron((bool) $a_input["fb_cron"]); // #13380
869  $a_ass->setFeedbackDate((int) $a_input["fb_date"]);
870  $a_ass->setFeedbackDateCustom((int) $a_input["fb_date_custom"]);
871  }
872 
873  // id needed for file handling
874  if ($is_create) {
875  $a_ass->save();
876 
877  // #15994 - assignment files
878  if (is_array($a_input["files"])) {
879  $a_ass->uploadAssignmentFiles($a_input["files"]);
880  }
881  } else {
882  // remove global feedback file?
883  if (!isset($a_input["fb"])) {
884  $a_ass->deleteGlobalFeedbackFile();
885  $a_ass->setFeedbackFile(null);
886  }
887 
888  $a_ass->update();
889  }
890 
891  // add global feedback file?
892  if (isset($a_input["fb"], $a_input["fb_file"])) {
893  $a_ass->handleGlobalFeedbackFileUpload($a_input["fb_file"]);
894  $a_ass->update();
895  }
896  $this->importFormToAssignmentReminders($a_input, $a_ass->getId());
897  }
898 
900  array $a_input,
901  int $a_ass_id
902  ): void {
903  $reminder = new ilExAssignmentReminder($this->exercise_id, $a_ass_id, ilExAssignmentReminder::SUBMIT_REMINDER);
904  $this->saveReminderData($reminder, $a_input);
905 
906  $reminder = new ilExAssignmentReminder($this->exercise_id, $a_ass_id, ilExAssignmentReminder::GRADE_REMINDER);
907  $this->saveReminderData($reminder, $a_input);
908  }
909 
910  //todo maybe we can refactor this method to use only one importFormToReminders
912  array $a_input,
913  int $a_ass_id
914  ): void {
915  $reminder = new ilExAssignmentReminder($this->exercise_id, $a_ass_id, ilExAssignmentReminder::FEEDBACK_REMINDER);
916  $this->saveReminderData($reminder, $a_input);
917  }
918 
919  protected function saveReminderData(
920  ilExAssignmentReminder $reminder,
921  array $a_input
922  ): void {
923  if ($reminder->getReminderStatus() === null) {
924  $action = "save";
925  } else {
926  $action = "update";
927  }
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}();
935  }
936 
942  public function saveAssignmentObject(): void
943  {
944  $tpl = $this->tpl;
945  $lng = $this->lng;
946  $ilCtrl = $this->ctrl;
947 
948  // #16163 - ignore ass id from request
949  $this->assignment = null;
950 
951  $form = $this->initAssignmentForm($this->requested_type, "create");
952  $input = $this->processForm($form);
953  if (is_array($input)) {
954  $ass = new ilExAssignment();
955  $ass->setExerciseId($this->exercise_id);
956  $ass->setType($input["type"]);
957  $ass_type_gui = $this->type_guis->getById($ass->getType());
958 
959  $this->importFormToAssignment($ass, $input);
960 
961  $this->generateTeams($ass, $input);
962  $this->tpl->setOnScreenMessage('success', $lng->txt("msg_obj_modified"), true);
963 
964  $ass_type_gui->importFormToAssignment($ass, $form);
965  $ass->update();
966 
967  $this->tpl->setOnScreenMessage('success', $lng->txt("msg_obj_modified"), true);
968 
969  // because of sub-tabs we stay on settings screen
970  $ilCtrl->setParameter($this, "ass_id", $ass->getId());
971  $ilCtrl->redirect($this, "editAssignment");
972  } else {
973  $form->setValuesByPost();
974  $tpl->setContent($form->getHTML());
975  }
976  }
977 
982  public function editAssignmentObject(): void
983  {
984  $ilTabs = $this->tabs;
985  $tpl = $this->tpl;
986 
987  $this->setAssignmentHeader();
988  $ilTabs->activateTab("ass_settings");
989 
990  $form = $this->initAssignmentForm($this->assignment->getType(), "edit");
991  $this->getAssignmentValues($form);
992  $tpl->setContent($form->getHTML());
993  }
994 
999  public function getAssignmentValues(ilPropertyFormGUI $a_form): void
1000  {
1001  $lng = $this->lng;
1002  $ilCtrl = $this->ctrl;
1003 
1004  $ass_type_gui = $this->type_guis->getById($this->assignment->getType());
1005 
1006  $values = array();
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()) {
1012  $values["start_time"] = new ilDateTime($this->assignment->getStartTime(), IL_CAL_UNIX);
1013  }
1014 
1015  if ($this->assignment->getAssignmentType()->usesFileUpload()) {
1016  if ($this->assignment->getMaxFile()) {
1017  $values["max_file_tgl"] = true;
1018  $values["max_file"] = $this->assignment->getMaxFile();
1019  }
1020  }
1021 
1022  if ($this->assignment->getAssignmentType()->usesTeams()) {
1023  $values["team_creator"] = (string) (int) $this->assignment->getTeamTutor();
1024  $values["team_creation"] = "0";
1025  }
1026 
1027  if ($this->assignment->getFeedbackDateCustom()) {
1028  $values["fb_date_custom"] = new ilDateTime($this->assignment->getFeedbackDateCustom(), IL_CAL_UNIX);
1029  }
1030 
1031  //Reminders
1032  $rmd_sub = new ilExAssignmentReminder($this->exercise_id, $this->assignment->getId(), ilExAssignmentReminder::SUBMIT_REMINDER);
1033  if ($rmd_sub->getReminderStatus()) {
1034  $values["rmd_submit_status"] = $rmd_sub->getReminderStatus();
1035  $values["rmd_submit_start"] = $rmd_sub->getReminderStart();
1036  $values["rmd_submit_end"] = new ilDateTime($rmd_sub->getReminderEnd(), IL_CAL_UNIX);
1037  $values["rmd_submit_freq"] = $rmd_sub->getReminderFrequency();
1038  $values["rmd_submit_template_id"] = $rmd_sub->getReminderMailTemplate();
1039  }
1040 
1041  $rmd_grade = new ilExAssignmentReminder($this->exercise_id, $this->assignment->getId(), ilExAssignmentReminder::GRADE_REMINDER);
1042  if ($rmd_grade->getReminderStatus()) {
1043  $values["rmd_grade_status"] = $rmd_grade->getReminderStatus();
1044  $values["rmd_grade_end"] = new ilDateTime($rmd_grade->getReminderEnd(), IL_CAL_UNIX);
1045  $values["rmd_grade_freq"] = $rmd_grade->getReminderFrequency();
1046  $values["rmd_grade_template_id"] = $rmd_grade->getReminderMailTemplate();
1047  }
1048 
1049  $type_values = $ass_type_gui->getFormValuesArray($this->assignment);
1050  $values = array_merge($values, $type_values);
1051 
1052 
1053  $values["deadline_mode"] = $this->assignment->getDeadlineMode();
1054  $values["relative_deadline"] = $this->assignment->getRelativeDeadline();
1055  $dt = new ilDateTime($this->assignment->getRelDeadlineLastSubmission(), IL_CAL_UNIX);
1056  $values["rel_deadline_last_subm"] = $dt->get(IL_CAL_DATETIME);
1057 
1058 
1059  $a_form->setValuesByArray($values);
1060 
1061  // global feedback
1062  if ($this->assignment->getFeedbackFile()) {
1063  $a_form->getItemByPostVar("fb")->setChecked(true);
1064  $a_form->getItemByPostVar("fb_file")->setValue(basename($this->assignment->getGlobalFeedbackFilePath()));
1065  $a_form->getItemByPostVar("fb_file")->setRequired(false); // #15467
1066  $a_form->getItemByPostVar("fb_file")->setInfo(
1067  // #16400
1068  '<a href="' . $ilCtrl->getLinkTarget($this, "downloadGlobalFeedbackFile") . '">' .
1069  $lng->txt("download") . '</a>'
1070  );
1071  }
1072  $a_form->getItemByPostVar("fb_cron")->setChecked($this->assignment->hasFeedbackCron());
1073  $a_form->getItemByPostVar("fb_date")->setValue($this->assignment->getFeedbackDate());
1074 
1075  $this->handleDisabledFields($a_form, true);
1076  }
1077 
1081  protected function setDisabledFieldValues(ilPropertyFormGUI $a_form): void
1082  {
1083  // dates
1084  if ($this->assignment->getDeadline() > 0) {
1085  $edit_date = new ilDateTime($this->assignment->getDeadline(), IL_CAL_UNIX);
1086  $ed_item = $a_form->getItemByPostVar("deadline");
1087  $ed_item->setDate($edit_date);
1088 
1089  if ($this->assignment->getExtendedDeadline() > 0) {
1090  $edit_date = new ilDateTime($this->assignment->getExtendedDeadline(), IL_CAL_UNIX);
1091  $ed_item = $a_form->getItemByPostVar("deadline2");
1092  $ed_item->setDate($edit_date);
1093  }
1094  }
1095 
1096  if ($this->assignment->getPeerReview()) {
1097  $a_form->getItemByPostVar("peer")->setChecked($this->assignment->getPeerReview());
1098  }
1099  }
1100 
1104  protected function handleDisabledFields(
1105  ilPropertyFormGUI $a_form,
1106  bool $a_force_set_values = false
1107  ): void {
1108  // potentially disabled elements are initialized here to re-use this
1109  // method after setValuesByPost() - see updateAssignmentObject()
1110 
1111  // team assignments do not support peer review
1112  // with no active peer review there is nothing to protect
1113  $peer_review = null;
1114  if (!$this->assignment->getAssignmentType()->usesTeams() &&
1115  $this->assignment->getPeerReview()) {
1116  // #14450
1117  $peer_review = new ilExPeerReview($this->assignment);
1118  if ($peer_review->hasPeerReviewGroups()) {
1119  // deadline(s) are past and must not change
1120  $a_form->getItemByPostVar("deadline")->setDisabled(true);
1121  $a_form->getItemByPostVar("deadline2")->setDisabled(true);
1122 
1123  $a_form->getItemByPostVar("peer")->setDisabled(true);
1124 
1125  $a_form->getItemByPostVar("deadline_mode")->setDisabled(true);
1126  }
1127  }
1128 
1129  if ($a_force_set_values ||
1130  ($peer_review && $peer_review->hasPeerReviewGroups())) {
1131  $this->setDisabledFieldValues($a_form);
1132  }
1133  }
1134 
1140  public function updateAssignmentObject(): void
1141  {
1142  $tpl = $this->tpl;
1143  $lng = $this->lng;
1144  $ilCtrl = $this->ctrl;
1145  $ilTabs = $this->tabs;
1146 
1147  $form = $this->initAssignmentForm($this->assignment->getType(), "edit");
1148  $input = $this->processForm($form);
1149 
1150  $ass_type = $this->assignment->getType();
1151  $ass_type_gui = $this->type_guis->getById($ass_type);
1152 
1153  if (is_array($input)) {
1154  $old_deadline = $this->assignment->getDeadline();
1155  $old_ext_deadline = $this->assignment->getExtendedDeadline();
1156 
1157  $this->importFormToAssignment($this->assignment, $input);
1158  $this->generateTeams($this->assignment, $input);
1159 
1160  $ass_type_gui->importFormToAssignment($this->assignment, $form);
1161  $this->assignment->update();
1162 
1163  $new_deadline = $this->assignment->getDeadline();
1164  $new_ext_deadline = $this->assignment->getExtendedDeadline();
1165 
1166  // if deadlines were changed
1167  if ($old_deadline != $new_deadline ||
1168  $old_ext_deadline != $new_ext_deadline) {
1169  $this->assignment->recalculateLateSubmissions();
1170  }
1171 
1172  $this->tpl->setOnScreenMessage('success', $lng->txt("msg_obj_modified"), true);
1173  $ilCtrl->redirect($this, "editAssignment");
1174  } else {
1175  $this->setAssignmentHeader();
1176  $ilTabs->activateTab("ass_settings");
1177 
1178  $form->setValuesByPost();
1179  $this->handleDisabledFields($form);
1180  $tpl->setContent($form->getHTML());
1181  }
1182  }
1183 
1184  public function confirmAssignmentsDeletionObject(): void
1185  {
1186  $ilCtrl = $this->ctrl;
1187  $tpl = $this->tpl;
1188  $lng = $this->lng;
1189 
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");
1194  } else {
1195  $cgui = new ilConfirmationGUI();
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");
1200 
1201  foreach ($this->requested_ass_ids as $i) {
1202  $cgui->addItem("id[]", $i, ilExAssignment::lookupTitle($i));
1203  }
1204 
1205  $tpl->setContent($cgui->getHTML());
1206  }
1207  }
1208 
1213  public function deleteAssignmentsObject(): void
1214  {
1215  $ilCtrl = $this->ctrl;
1216  $lng = $this->lng;
1217 
1218  $delete = false;
1219  foreach ($this->requested_ass_ids as $id) {
1220  $ass = new ilExAssignment(ilUtil::stripSlashes($id));
1221  $ass->delete($this->exc);
1222  $delete = true;
1223  }
1224 
1225  if ($delete) {
1226  $this->tpl->setOnScreenMessage('success', $lng->txt("exc_assignments_deleted"), true);
1227  }
1228  $ilCtrl->setParameter($this, "ass_id", "");
1229  $ilCtrl->redirect($this, "listAssignments");
1230  }
1231 
1232  public function saveAssignmentOrderObject(): void
1233  {
1234  $lng = $this->lng;
1235  $ilCtrl = $this->ctrl;
1236 
1238  $this->exercise_id,
1239  $this->requested_order
1240  );
1241 
1242  $this->tpl->setOnScreenMessage('success', $lng->txt("exc_saved_order"), true);
1243  $ilCtrl->redirect($this, "listAssignments");
1244  }
1245 
1246  public function orderAssignmentsByDeadlineObject(): void
1247  {
1248  $lng = $this->lng;
1249  $ilCtrl = $this->ctrl;
1250 
1251  ilExAssignment::orderAssByDeadline($this->exercise_id);
1252 
1253  $this->tpl->setOnScreenMessage('success', $lng->txt("exc_saved_order"), true);
1254  $ilCtrl->redirect($this, "listAssignments");
1255  }
1256 
1257  public function setAssignmentHeader(): void
1258  {
1259  $ilTabs = $this->tabs;
1260  $lng = $this->lng;
1261  $ilCtrl = $this->ctrl;
1262  $tpl = $this->tpl;
1263  $ilHelp = $this->help;
1264 
1265  $tpl->setTitle($this->assignment->getTitle());
1266  $tpl->setDescription("");
1267 
1268  $ilTabs->clearTargets();
1269  $ilHelp->setScreenIdComponent("exc");
1270 
1271  $ilTabs->setBackTarget(
1272  $lng->txt("back"),
1273  $ilCtrl->getLinkTarget($this, "listAssignments")
1274  );
1275 
1276  $ilTabs->addTab(
1277  "ass_settings",
1278  $lng->txt("settings"),
1279  $ilCtrl->getLinkTarget($this, "editAssignment")
1280  );
1281 
1282  if (!$this->assignment->getAssignmentType()->usesTeams() &&
1283  $this->assignment->getPeerReview()) {
1284  $ilTabs->addTab(
1285  "peer_settings",
1286  $lng->txt("exc_peer_review"),
1287  $ilCtrl->getLinkTarget($this, "editPeerReview")
1288  );
1289  }
1290 
1291  $ilTabs->addTab(
1292  "ass_files",
1293  $lng->txt("exc_instruction_files"),
1294  $ilCtrl->getLinkTargetByClass(array("ilexassignmenteditorgui", "ilexassignmentfilesystemgui"), "listFiles")
1295  );
1296  }
1297 
1298  public function downloadGlobalFeedbackFileObject(): void
1299  {
1300  $ilCtrl = $this->ctrl;
1301 
1302  if (!$this->assignment ||
1303  !$this->assignment->getFeedbackFile()) {
1304  $ilCtrl->redirect($this, "returnToParent");
1305  }
1306 
1307  ilFileDelivery::deliverFileLegacy($this->assignment->getGlobalFeedbackFilePath(), $this->assignment->getFeedbackFile());
1308  }
1309 
1310 
1311  //
1312  // PEER REVIEW
1313  //
1314 
1316  {
1317  $ilCtrl = $this->ctrl;
1318  $lng = $this->lng;
1319 
1320  $form = new ilPropertyFormGUI();
1321  $form->setTitle($lng->txt("exc_peer_review"));
1322  $form->setFormAction($ilCtrl->getFormAction($this));
1323 
1324  $peer_min = new ilNumberInputGUI($lng->txt("exc_peer_review_min_number"), "peer_min");
1325  $peer_min->setInfo($lng->txt("exc_peer_review_min_number_info")); // #16161
1326  $peer_min->setRequired(true);
1327  $peer_min->setSize(3);
1328  $peer_min->setValue(2);
1329  $form->addItem($peer_min);
1330 
1331  $peer_unlock = new ilRadioGroupInputGUI($lng->txt("exc_peer_review_simple_unlock"), "peer_unlock");
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);
1337 
1338  if ($this->enable_peer_review_completion) {
1339  $peer_cmpl = new ilRadioGroupInputGUI($lng->txt("exc_peer_review_completion"), "peer_valid");
1340  $option = new ilRadioOption($lng->txt("exc_peer_review_completion_none"), ilExAssignment::PEER_REVIEW_VALID_NONE);
1341  $option->setInfo($lng->txt("exc_peer_review_completion_none_info"));
1342  $peer_cmpl->addOption($option);
1343  $option = new ilRadioOption($lng->txt("exc_peer_review_completion_one"), ilExAssignment::PEER_REVIEW_VALID_ONE);
1344  $option->setInfo($lng->txt("exc_peer_review_completion_one_info"));
1345  $peer_cmpl->addOption($option);
1346  $option = new ilRadioOption($lng->txt("exc_peer_review_completion_all"), ilExAssignment::PEER_REVIEW_VALID_ALL);
1347  $option->setInfo($lng->txt("exc_peer_review_completion_all_info"));
1348  $peer_cmpl->addOption($option);
1349  $peer_cmpl->setRequired(true);
1350  $peer_cmpl->setValue(ilExAssignment::PEER_REVIEW_VALID_NONE);
1351  $form->addItem($peer_cmpl);
1352  }
1353 
1354  $peer_dl = new ilDateTimeInputGUI($lng->txt("exc_peer_review_deadline"), "peer_dl");
1355  $peer_dl->setInfo($lng->txt("exc_peer_review_deadline_info"));
1356  $peer_dl->setShowTime(true);
1357  $form->addItem($peer_dl);
1358 
1359  $peer_prsl = new ilCheckboxInputGUI($lng->txt("exc_peer_review_personal"), "peer_prsl");
1360  $peer_prsl->setInfo($lng->txt("exc_peer_review_personal_info"));
1361  $form->addItem($peer_prsl);
1362 
1363  //feedback reminders
1364  $rmd_feedback = new ilCheckboxInputGUI($this->lng->txt("exc_reminder_feedback_setting"), "rmd_peer_status");
1365 
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);
1373 
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);
1381 
1382  $rmd_submit_end = new ilDateTimeInputGUI($lng->txt("exc_reminder_end"), "rmd_peer_end");
1383  $rmd_submit_end->setRequired(true);
1384  $rmd_feedback->addSubItem($rmd_submit_end);
1385 
1386  $rmd_feedback->addSubItem($this->addMailTemplatesRadio(ilExAssignmentReminder::FEEDBACK_REMINDER));
1387 
1388  $form->addItem($rmd_feedback);
1389 
1390  // criteria
1391 
1392  $cats = new ilRadioGroupInputGUI($lng->txt("exc_criteria_catalogues"), "crit_cat");
1393  $form->addItem($cats);
1394 
1395  // default (no catalogue)
1396 
1397  $def = new ilRadioOption($lng->txt("exc_criteria_catalogue_default"), -1);
1398  $cats->addOption($def);
1399 
1400  $peer_text = new ilCheckboxInputGUI($lng->txt("exc_peer_review_text"), "peer_text");
1401  $def->addSubItem($peer_text);
1402 
1403  $peer_char = new ilNumberInputGUI($lng->txt("exc_peer_review_min_chars"), "peer_char");
1404  $peer_char->setInfo($lng->txt("exc_peer_review_min_chars_info"));
1405  $peer_char->setSize(3);
1406  $peer_text->addSubItem($peer_char);
1407 
1408  $peer_rating = new ilCheckboxInputGUI($lng->txt("exc_peer_review_rating"), "peer_rating");
1409  $def->addSubItem($peer_rating);
1410 
1411  $peer_file = new ilCheckboxInputGUI($lng->txt("exc_peer_review_file"), "peer_file");
1412  $peer_file->setInfo($lng->txt("exc_peer_review_file_info"));
1413  $def->addSubItem($peer_file);
1414 
1415  // catalogues
1416 
1417  $cat_objs = ilExcCriteriaCatalogue::getInstancesByParentId($this->exercise_id);
1418  if (sizeof($cat_objs)) {
1419  foreach ($cat_objs as $cat_obj) {
1420  $crits = ilExcCriteria::getInstancesByParentId($cat_obj->getId());
1421 
1422  // only non-empty catalogues
1423  if (sizeof($crits)) {
1424  $titles = array();
1425  foreach ($crits as $crit) {
1426  $titles[] = $crit->getTitle();
1427  }
1428  $opt = new ilRadioOption($cat_obj->getTitle(), $cat_obj->getId());
1429  $opt->setInfo(implode(", ", $titles));
1430  $cats->addOption($opt);
1431  }
1432  }
1433  } else {
1434  // see ilExcCriteriaCatalogueGUI::view()
1435  $url = $ilCtrl->getLinkTargetByClass("ilexccriteriacataloguegui", "");
1436  $def->setInfo('<a href="' . $url . '">[+] ' .
1437  $lng->txt("exc_add_criteria_catalogue") .
1438  '</a>');
1439  }
1440 
1441 
1442  $form->addCommandButton("updatePeerReview", $lng->txt("save"));
1443  $form->addCommandButton("editAssignment", $lng->txt("cancel"));
1444 
1445  return $form;
1446  }
1447 
1451  public function editPeerReviewObject(ilPropertyFormGUI $a_form = null): void
1452  {
1453  $ilTabs = $this->tabs;
1454  $tpl = $this->tpl;
1455 
1456  $this->setAssignmentHeader();
1457  $ilTabs->activateTab("peer_settings");
1458 
1459  if ($a_form === null) {
1460  $a_form = $this->initPeerReviewForm();
1461  $this->getPeerReviewValues($a_form);
1462  }
1463  $tpl->setContent($a_form->getHTML());
1464  }
1465 
1469  protected function getPeerReviewValues(\ilPropertyFormGUI $a_form): void
1470  {
1471  $values = array();
1472 
1473  if ($this->assignment->getPeerReviewDeadline() > 0) {
1474  $values["peer_dl"] = new ilDateTime($this->assignment->getPeerReviewDeadline(), IL_CAL_UNIX);
1475  }
1476 
1477  $reminder = new ilExAssignmentReminder($this->exercise_id, $this->assignment->getId(), ilExAssignmentReminder::FEEDBACK_REMINDER);
1478  if ($reminder->getReminderStatus()) {
1479  $values["rmd_peer_status"] = $reminder->getReminderStatus();
1480  $values["rmd_peer_start"] = $reminder->getReminderStart();
1481  $values["rmd_peer_end"] = new ilDateTime($reminder->getReminderEnd(), IL_CAL_UNIX);
1482  $values["rmd_peer_freq"] = $reminder->getReminderFrequency();
1483  $values["rmd_peer_template_id"] = $reminder->getReminderMailTemplate();
1484  }
1485 
1486  $a_form->setValuesByArray($values);
1487 
1488  $this->handleDisabledPeerFields($a_form, true);
1489  }
1490 
1491  protected function setDisabledPeerReviewFieldValues(ilPropertyFormGUI $a_form): void
1492  {
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());
1496 
1497  if ($this->enable_peer_review_completion) {
1498  $a_form->getItemByPostVar("peer_valid")->setValue($this->assignment->getPeerReviewValid());
1499  }
1500 
1501  $cat = $this->assignment->getPeerReviewCriteriaCatalogue();
1502  if ($cat < 1) {
1503  $cat = -1;
1504 
1505  // default / no catalogue
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());
1511  }
1512  }
1513  $a_form->getItemByPostVar("crit_cat")->setValue($cat);
1514  }
1515 
1516  protected function handleDisabledPeerFields(
1517  ilPropertyFormGUI $a_form,
1518  bool $a_force_set_values = false
1519  ): void {
1520  // #14450
1521  $peer_review = new ilExPeerReview($this->assignment);
1522  if ($peer_review->hasPeerReviewGroups()) {
1523  // JourFixe, 2015-05-11 - editable again
1524  // $a_form->getItemByPostVar("peer_dl")->setDisabled(true);
1525 
1526  $a_form->getItemByPostVar("peer_min")->setDisabled(true);
1527  $a_form->getItemByPostVar("peer_prsl")->setDisabled(true);
1528  $a_form->getItemByPostVar("peer_unlock")->setDisabled(true);
1529 
1530  if ($this->enable_peer_review_completion) {
1531  $a_form->getItemByPostVar("peer_valid")->setDisabled(true);
1532  }
1533 
1534  $a_form->getItemByPostVar("crit_cat")->setDisabled(true);
1535  $a_form->getItemByPostVar("peer_text")->setDisabled(true);
1536  $a_form->getItemByPostVar("peer_char")->setDisabled(true);
1537  $a_form->getItemByPostVar("peer_rating")->setDisabled(true);
1538  $a_form->getItemByPostVar("peer_file")->setDisabled(true);
1539 
1540  // required number input is a problem
1541  $min = new ilHiddenInputGUI("peer_min");
1542  $min->setValue($this->assignment->getPeerReviewMin());
1543  $a_form->addItem($min);
1544  }
1545 
1546  if ($a_force_set_values ||
1547  $peer_review->hasPeerReviewGroups()) {
1548  $this->setDisabledPeerReviewFieldValues($a_form);
1549  }
1550  }
1551 
1556  protected function processPeerReviewForm(
1557  ilPropertyFormGUI $a_form
1558  ): ?array {
1559  $lng = $this->lng;
1560 
1561  $protected_peer_review_groups = false;
1562  $peer_review = new ilExPeerReview($this->assignment);
1563  if ($peer_review->hasPeerReviewGroups()) {
1564  $protected_peer_review_groups = true;
1565  }
1566 
1567  $valid = $a_form->checkInput();
1568  if ($valid) {
1569  // dates
1570  $time_deadline = $this->assignment->getDeadline();
1571  $time_deadline_ext = $this->assignment->getExtendedDeadline();
1572  $time_deadline_max = max($time_deadline, $time_deadline_ext);
1573 
1574  $date = $a_form->getItemByPostVar("peer_dl")->getDate();
1575  $time_peer = $date
1576  ? $date->get(IL_CAL_UNIX)
1577  : null;
1578 
1579  $reminder_date = $a_form->getItemByPostVar("rmd_peer_end")->getDate();
1580  $reminder_date = $reminder_date
1581  ? $reminder_date->get(IL_CAL_UNIX)
1582  : null;
1583 
1584  // peer < any deadline?
1585  if ($time_peer && $time_deadline_max && $time_peer < $time_deadline_max) {
1586  $a_form->getItemByPostVar("peer_dl")
1587  ->setAlert($lng->txt("exc_peer_deadline_mismatch"));
1588  $valid = false;
1589  }
1590 
1591  if (!$protected_peer_review_groups) {
1592  if ($a_form->getInput("crit_cat") < 0 &&
1593  !$a_form->getInput("peer_text") &&
1594  !$a_form->getInput("peer_rating") &&
1595  !$a_form->getInput("peer_file")) {
1596  $a_form->getItemByPostVar("peer_file")
1597  ->setAlert($lng->txt("select_one"));
1598  $valid = false;
1599  }
1600  }
1601 
1602  if ($valid) {
1603  $res = array();
1604  $res["peer_dl"] = $time_peer;
1605 
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();
1611 
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();
1617 
1618  $res["peer_valid"] = $this->enable_peer_review_completion
1619  ? $res["peer_valid"]
1620  : null;
1621  } else {
1622  $res["peer_min"] = $a_form->getInput("peer_min");
1623  $res["peer_unlock"] = $a_form->getInput("peer_unlock");
1624  $res["peer_prsl"] = $a_form->getInput("peer_prsl");
1625  $res["peer_valid"] = $a_form->getInput("peer_valid");
1626 
1627  $res["peer_text"] = $a_form->getInput("peer_text");
1628  $res["peer_rating"] = $a_form->getInput("peer_rating");
1629  $res["peer_file"] = $a_form->getInput("peer_file");
1630  $res["peer_char"] = $a_form->getInput("peer_char");
1631  $res["crit_cat"] = $a_form->getInput("crit_cat");
1632  }
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");
1639  }
1640 
1641  return $res;
1642  } else {
1643  $this->tpl->setOnScreenMessage('failure', $lng->txt("form_input_not_valid"));
1644  }
1645  }
1646  return null;
1647  }
1648 
1653  ilExAssignment $a_ass,
1654  array $a_input
1655  ): void {
1656  $a_ass->setPeerReviewMin((int) $a_input["peer_min"]);
1657  $a_ass->setPeerReviewDeadline((int) $a_input["peer_dl"]);
1658  $a_ass->setPeerReviewSimpleUnlock((bool) $a_input["peer_unlock"]);
1659  $a_ass->setPeerReviewPersonalized((bool) $a_input["peer_prsl"]);
1660 
1661  // #18964
1662  $a_ass->setPeerReviewValid($a_input["peer_valid"]
1664 
1665  $a_ass->setPeerReviewFileUpload((bool) $a_input["peer_file"]);
1666  $a_ass->setPeerReviewChars((int) $a_input["peer_char"]);
1667  $a_ass->setPeerReviewText((bool) $a_input["peer_text"]);
1668  $a_ass->setPeerReviewRating((bool) $a_input["peer_rating"]);
1669  $a_ass->setPeerReviewCriteriaCatalogue($a_input["crit_cat"] > 0
1670  ? (int) $a_input["crit_cat"]
1671  : null);
1672 
1673  $a_ass->update();
1674 
1675  $this->importPeerReviewFormToAssignmentReminders($a_input, $a_ass->getId());
1676  }
1677 
1681  protected function updatePeerReviewObject(): void
1682  {
1683  $tpl = $this->tpl;
1684  $lng = $this->lng;
1685  $ilCtrl = $this->ctrl;
1686  $ilTabs = $this->tabs;
1687 
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");
1694  } else {
1695  $this->setAssignmentHeader();
1696  $ilTabs->activateTab("peer_settings");
1697 
1698  $form->setValuesByPost();
1699  $this->handleDisabledPeerFields($form);
1700  $tpl->setContent($form->getHTML());
1701  }
1702  }
1703 
1704 
1705  //
1706  // TEAM
1707  //
1708 
1709  public function validationTeamsFormation(
1710  int $a_num_teams,
1711  int $a_min_participants,
1712  int $a_max_participants
1713  ): array {
1714  $total_members = $this->getExerciseTotalMembers();
1715  $number_of_teams = $a_num_teams;
1716 
1717  if ($number_of_teams) {
1718  $members_per_team = round($total_members / $a_num_teams);
1719  } else {
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) {
1724  //Can't create teams with this minimum of participants.
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");
1727  }
1728  }
1729  $members_per_team = 0;
1730  }
1731 
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");
1735  }
1736 
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");
1740  }
1741 
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");
1745  }
1746 
1747  return array("status" => "success", "msg" => "");
1748  }
1749 
1750  // Get the total number of exercise members
1751  public function getExerciseTotalMembers(): int
1752  {
1753  $exercise = new ilObjExercise($this->exercise_id, false);
1754  $exc_members = new ilExerciseMembers($exercise);
1755 
1756  return count($exc_members->getMembers());
1757  }
1758 
1759  public function generateTeams(
1760  ilExAssignment $a_assignment,
1761  array $a_input
1762  ): void {
1763  $ass_type = $a_assignment->getAssignmentType();
1764  if ($ass_type->usesTeams() &&
1765  $a_input['team_creator'] == ilExAssignment::TEAMS_FORMED_BY_TUTOR) {
1766  if ($a_input['team_creation'] == ilExAssignment::TEAMS_FORMED_BY_RANDOM) {
1767  $number_teams = $a_input['number_teams'];
1768  if (count(ilExAssignmentTeam::getAssignmentTeamMap($a_assignment->getId())) == 0) {
1769  $ass_team = new ilExAssignmentTeam();
1770  $ass_team->createRandomTeams($this->exercise_id, $a_assignment->getId(), $number_teams, $a_input['min_participants_team']);
1771  }
1772  } elseif ($a_input['team_creation'] == ilExAssignment::TEAMS_FORMED_BY_ASSIGNMENT) {
1773  ilExAssignmentTeam::adoptTeams($a_input["ass_adpt"], $a_assignment->getId());
1774  $this->tpl->setOnScreenMessage('info', $this->lng->txt("exc_teams_assignment_adopted"), true);
1775  }
1776  }
1777  }
1778 }
getPeerReviewValues(\ilPropertyFormGUI $a_form)
setStartTime(?int $a_val)
setRelativeDeadline(int $a_val)
importPeerReviewFormToAssignmentReminders(array $a_input, int $a_ass_id)
setFilenames(array $a_filenames)
Class ilExAssignmentEditorGUI.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
$res
Definition: ltiservices.php:69
initAssignmentForm(int $a_type, string $a_mode="create")
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
handleDisabledFields(ilPropertyFormGUI $a_form, bool $a_force_set_values=false)
exit
Definition: login.php:28
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
Exercise assignment.
$context
Definition: webdav.php:29
const IL_CAL_DATETIME
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...
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...
static _getRichTextEditor()
Returns the identifier for the Rich Text Editor.
editPeerReviewObject(ilPropertyFormGUI $a_form=null)
redirect(object $a_gui_obj, string $a_cmd=null, string $a_anchor=null, bool $is_async=false)
setFeedbackFile(?string $a_value)
$type
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)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
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
setPeerReviewSimpleUnlock(bool $a_value)
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...
static getAdoptableTeamAssignments(int $a_exercise_id, int $a_exclude_ass_id=null, int $a_user_id=null)
validationTeamsFormation(int $a_num_teams, int $a_min_participants, int $a_max_participants)
Mandatory RandomAssignmentsManager $random_manager
This class represents a checkbox property in a property form.
setShowTime(bool $a_showtime)
static getInstancesByParentId(int $a_parent_id)
addOption(ilRadioOption $a_option)
loadLanguageModule(string $a_module)
Load language module.
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...
static getInstance()
Get instance.
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 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)
global $DIC
Definition: feed.php:28
getAssignmentValues(ilPropertyFormGUI $a_form)
setTeamTutor(bool $a_value)
uploadAssignmentFiles(array $a_files)
Upload assignment files (from creation form)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
Exercise peer review.
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)
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...
setMandatory(bool $a_val)
setFeedbackDate(int $a_value)
handleGlobalFeedbackFileUpload(array $a_file)
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)
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)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
setMinValue(float $a_minvalue, bool $a_display_always=false)
importFormToAssignment(ilExAssignment $a_ass, array $a_input)
Import form values to assignment.
__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.
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
Definition: plugin.php:23
setPeerReviewChars(?int $a_value)
handleDisabledPeerFields(ilPropertyFormGUI $a_form, bool $a_force_set_values=false)
setPeerReviewText(bool $a_val)
static adoptTeams(int $a_source_ass_id, int $a_target_ass_id, int $a_user_id=null, int $a_exc_ref_id=null)
$message
Definition: xapiexit.php:32
$url
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)
setTitle(string $a_val)
setPeerReview(bool $a_value)
setReminderStatus(?bool $a_status)
Set reminder for users without submission.
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.
setDisabledFieldValues(ilPropertyFormGUI $a_form)
$i
Definition: metadata.php:41
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...