ILIAS  release_10 Revision v10.1-43-ga1241a92c2f
class.ilExerciseSubmissionTableGUI.php
Go to the documentation of this file.
1 <?php
2 
21 
23 {
24  public const MODE_BY_ASSIGNMENT = 1;
25  public const MODE_BY_USER = 2;
26  protected \ILIAS\Exercise\InternalDomainService $domain;
27  protected \ILIAS\Exercise\Assignment\DomainService $ass_domain;
29 
31  protected ilObjExercise $exc;
32  protected int $mode;
33  protected array $filter;
34  protected array $comment_modals = array();
35  protected ?ilExAssignment $ass = null;
36 
37  protected array $cols_mandatory = array("name", "status");
38  protected array $cols_default = array("login", "submission", "idl", "calc_deadline");
39  protected array $cols_order = array("image", "name", "login", "team_members",
40  "sent_time", "submission", "calc_deadline", "idl", "status", "mark", "status_time",
41  "feedback_time", "comment", "notice");
42 
45 
46  protected Factory $ui_factory;
48 
49  public function __construct(
50  object $a_parent_obj,
51  string $a_parent_cmd,
52  ilObjExercise $a_exc,
53  int $a_item_id,
55  ) {
56  global $DIC;
57 
58  $this->ui_factory = $DIC->ui()->factory();
59  $this->ui_renderer = $DIC->ui()->renderer();
60 
61  $this->ctrl = $DIC->ctrl();
62  $this->access = $DIC->access();
63  $this->tpl = $DIC["tpl"];
64  $this->lng = $DIC->language();
65 
66  $ilCtrl = $DIC->ctrl();
67 
68  $this->exc = $a_exc;
69  $this->feedback_gui = $feedback_gui;
70 
71  $this->initMode($a_item_id);
72 
73  parent::__construct($a_parent_obj, $a_parent_cmd);
74 
75  $this->setShowTemplates(true);
76 
77  $this->setFormAction($ilCtrl->getFormAction($a_parent_obj));
78  $this->setRowTemplate("tpl.exc_members_row.html", "components/ILIAS/Exercise");
79 
80  #25100
81  if ($this->mode == self::MODE_BY_ASSIGNMENT) {
82  $this->setDefaultOrderField("name");
83  $this->setDefaultOrderDirection("asc");
84  }
85 
86 
87  // columns
88 
89  $this->addColumn("", "", "1", true);
90 
91  $selected = $this->getSelectedColumns();
92  $columns = $this->parseColumns();
93  foreach ($this->cols_order as $id) {
94  if (in_array($id, $this->cols_mandatory) ||
95  in_array($id, $selected)) {
96  if (array_key_exists($id, $columns)) {
97  $col = $columns[$id];
98  $this->addColumn($col[0], $col[1] ?? "");
99  }
100  }
101  }
102 
103  $this->addColumn($this->lng->txt("actions"));
104 
105 
106  // multi actions
107 
108  $this->addMultiCommand("saveStatusSelected", $this->lng->txt("exc_save_selected"));
109 
110  // TODO get rid of the constant from ilExAssignment. Get this value from ilExAssignmentTypes
111  if ($this->mode == self::MODE_BY_ASSIGNMENT && $this->ass->getType() == ilExAssignment::TYPE_TEXT) {
112  $this->addMultiCommand("compareTextAssignments", $this->lng->txt("exc_compare_submissions"));
113  }
114 
115  $this->setFormName("ilExcIDlForm");
116 
117  // see 0021530 and parseRow here with similar action per user
118  if ($this->mode == self::MODE_BY_ASSIGNMENT &&
119  $this->ass->hasActiveIDl() &&
120  !$this->ass->hasReadOnlyIDl()) {
121  $this->addMultiCommand("setIndividualDeadline", $this->lng->txt("exc_individual_deadline_action"));
122  }
123 
124  if ($this->exc->hasTutorFeedbackMail() &&
125  $this->mode == self::MODE_BY_ASSIGNMENT) {
126  $this->addMultiCommand("redirectFeedbackMail", $this->lng->txt("exc_tbl_action_feedback_mail"));
127  }
128 
129  $this->addMultiCommand("sendMembers", $this->lng->txt("exc_send_assignment"));
130 
131  if ($this->mode == self::MODE_BY_ASSIGNMENT) {
132  $this->addMultiCommand("sendGradingNotification", $this->lng->txt("exc_send_grading_notification"));
133  }
134 
135  if ($this->mode == self::MODE_BY_ASSIGNMENT &&
136  $this->ass &&
137  $this->ass->hasTeam()) {
138  $this->addMultiCommand("createTeams", $this->lng->txt("exc_team_multi_create"));
139  $this->addMultiCommand("dissolveTeams", $this->lng->txt("exc_team_multi_dissolve"));
140  }
141 
142  if ($this->mode == self::MODE_BY_ASSIGNMENT) {
143  $this->addMultiCommand("confirmDeassignMembers", $this->lng->txt("exc_deassign_members"));
144  }
145 
146  $this->setFilterCommand($this->getParentCmd() . "Apply");
147  $this->setResetCommand($this->getParentCmd() . "Reset");
148 
149  $this->initFilter();
150  $this->setData($this->parseData());
151  $this->ass_domain = $DIC->exercise()->internal()->domain()->assignment();
152  $this->domain = $DIC->exercise()->internal()->domain();
153  }
154 
155  public function initFilter(): void
156  {
157  if ($this->mode == self::MODE_BY_ASSIGNMENT) {
158  $item = $this->addFilterItemByMetaType("flt_name", self::FILTER_TEXT, false, $this->lng->txt("name") . " / " . $this->lng->txt("login"));
159  $this->filter["name"] = $item->getValue();
160  }
161 
162  $this->lng->loadLanguageModule("search");
163  $options = array(
164  "" => $this->lng->txt("search_any"),
165  "notgraded" => $this->lng->txt("exc_notgraded"),
166  "passed" => $this->lng->txt("exc_passed"),
167  "failed" => $this->lng->txt("exc_failed")
168  );
169  $item = $this->addFilterItemByMetaType("flt_status", self::FILTER_SELECT, false, $this->lng->txt("exc_tbl_status"));
170  $item->setOptions($options);
171  $this->filter["status"] = $item->getValue();
172 
173  $options = array(
174  "" => $this->lng->txt("search_any"),
175  "y" => $this->lng->txt("exc_tbl_filter_has_submission"),
176  "n" => $this->lng->txt("exc_tbl_filter_has_no_submission")
177  );
178  $item = $this->addFilterItemByMetaType("flt_subm", self::FILTER_SELECT, false, $this->lng->txt("exc_tbl_filter_submission"));
179  $item->setOptions($options);
180  $this->filter["subm"] = $item->getValue();
181 
182  $item = $this->addFilterItemByMetaType("flt_subm_after", self::FILTER_DATE, false, $this->lng->txt("exc_tbl_filter_submission_after"));
183  $this->filter["subm_after"] = $item->getDate();
184 
185  $item = $this->addFilterItemByMetaType("flt_subm_before", self::FILTER_DATE, false, $this->lng->txt("exc_tbl_filter_submission_before"));
186  $this->filter["subm_before"] = $item->getDate();
187 
188  if ($this->mode == self::MODE_BY_ASSIGNMENT && !$this->ass->hasTeam()) {
189  $this->initCourseGroupFilter();
190  }
191  }
192 
193  protected function initCourseGroupFilter(): void
194  {
195  $repo = new ilRepositorySelector2InputGUI(
196  $this->lng->txt('exc_member_of_crs_grp'),
197  'effective_from',
198  false,
199  ($this->isForwardingToFormDispatcher()) ? $this : null
200  );
201  $repo->getExplorerGUI()->setSelectableTypes(["crs", "grp"]);
202  $repo->getExplorerGUI()->setTypeWhiteList(["root", "cat", "crs", "grp"]);
203  $this->addFilterItem($repo);
204  $repo->readFromSession();
205  $this->filter['member_of'] = (int) $repo->getValue();
206  }
207 
208  protected function isForwardingToFormDispatcher(): bool
209  {
210  return false;
211  }
212 
213 
214 
215  abstract protected function initMode(int $a_item_id): void;
216 
217  abstract protected function parseData(): array;
218 
219  abstract protected function parseModeColumns(): array;
220 
221  public function getSelectableColumns(): array
222  {
223  $cols = array();
224 
225  $columns = $this->parseColumns();
226  foreach ($this->cols_order as $id) {
227  if (in_array($id, $this->cols_mandatory)) {
228  continue;
229  }
230 
231  if (array_key_exists($id, $columns)) {
232  $col = $columns[$id];
233 
234  $cols[$id] = array(
235  "txt" => $col[0],
236  "default" => in_array($id, $this->cols_default)
237  );
238  }
239  }
240  return $cols;
241  }
242 
243  protected function parseColumns(): array
244  {
245  $cols = $this->parseModeColumns();
246 
247  $cols["submission"] = array($this->lng->txt("exc_tbl_submission_date"), "submission");
248 
249  $cols["status"] = array($this->lng->txt("exc_tbl_status"), "status");
250  $cols["mark"] = array($this->lng->txt("exc_tbl_mark"), "mark");
251  $cols["status_time"] = array($this->lng->txt("exc_tbl_status_time"), "status_time");
252 
253  $cols["sent_time"] = array($this->lng->txt("exc_tbl_sent_time"), "sent_time");
254 
255  if ($this->exc->hasTutorFeedbackText() ||
256  $this->exc->hasTutorFeedbackMail() ||
257  $this->exc->hasTutorFeedbackFile()) {
258  $cols["feedback_time"] = array($this->lng->txt("exc_tbl_feedback_time"), "feedback_time");
259  }
260 
261  if ($this->exc->hasTutorFeedbackText()) {
262  $cols["comment"] = array($this->lng->txt("exc_tbl_comment"), "comment");
263  }
264 
265  $cols["notice"] = array($this->lng->txt("exc_tbl_notice"), "notice");
266 
267  return $cols;
268  }
269 
275  protected function parseRow(
276  int $a_user_id,
277  ilExAssignment $a_ass,
278  array $a_row
279  ): void {
280  $ilCtrl = $this->ctrl;
281  $ilAccess = $this->access;
282 
283  $has_no_team_yet = ($a_ass->hasTeam() &&
284  !ilExAssignmentTeam::getTeamId($a_ass->getId(), $a_user_id));
285 
286 
287  // static columns
288 
289  if ($this->mode == self::MODE_BY_ASSIGNMENT) {
290  if (!$a_ass->hasTeam()) {
291  $this->tpl->setVariable("VAL_NAME", $a_row["name"]);
292 
293  // #18327
294  if (!$ilAccess->checkAccessOfUser($a_user_id, "read", "", $this->exc->getRefId()) &&
295  is_array($info = $ilAccess->getInfo())) {
296  $this->tpl->setCurrentBlock('access_warning');
297  $this->tpl->setVariable('PARENT_ACCESS', $info[0]["text"]);
298  $this->tpl->parseCurrentBlock();
299  }
300  } else {
301  asort($a_row["team"]);
302  foreach ($a_row["team"] as $team_member_id => $team_member_name) { // #10749
303  if (count($a_row["team"]) > 1) {
304  $ilCtrl->setParameterByClass("ilExSubmissionTeamGUI", "id", $team_member_id);
305  $url = $ilCtrl->getLinkTargetByClass("ilExSubmissionTeamGUI", "confirmRemoveTeamMember");
306  $ilCtrl->setParameterByClass("ilExSubmissionTeamGUI", "id", "");
307 
308  $this->tpl->setCurrentBlock("team_member_removal_bl");
309  $this->tpl->setVariable("URL_TEAM_MEMBER_REMOVAL", $url);
310 
311  $rem_gl = $this->ui_factory->symbol()->glyph()->remove($url);
312  $this->tpl->setVariable(
313  "TXT_TEAM_MEMBER_REMOVAL",
314  $this->ui_renderer->render($rem_gl)
315  );
316 
317  $this->tpl->parseCurrentBlock();
318  }
319 
320  // #18327
321  if (!$ilAccess->checkAccessOfUser($team_member_id, "read", "", $this->exc->getRefId()) &&
322  is_array($info = $ilAccess->getInfo())) {
323  $this->tpl->setCurrentBlock('team_access_warning');
324  $this->tpl->setVariable('TEAM_PARENT_ACCESS', $info[0]["text"]);
325  $this->tpl->parseCurrentBlock();
326  }
327 
328  $this->tpl->setCurrentBlock("team_member");
329  $this->tpl->setVariable("TXT_MEMBER_NAME", $team_member_name);
330  $this->tpl->parseCurrentBlock();
331  }
332 
333  $this->tpl->setCurrentBlock("team_info");
334  if ($has_no_team_yet) {
335  // #11957
336  $this->tpl->setVariable("TXT_TEAM_INFO", $this->lng->txt("exc_no_team_yet"));
337  } else {
338  $this->tpl->setVariable("TXT_TEAM_INFO", "(" . $a_row["submission_obj"]->getTeam()->getId() . ")");
339  }
340  }
341  } else {
342  $this->tpl->setVariable("VAL_NAME", $a_row["name"]);
343  }
344 
345  // do not grade or mark if no team yet
346  if (!$has_no_team_yet) {
347  // status
348  $this->tpl->setVariable("SEL_" . strtoupper($a_row["status"] ?? ""), ' selected="selected" ');
349  $this->tpl->setVariable("TXT_NOTGRADED", $this->lng->txt("exc_notgraded"));
350  $this->tpl->setVariable("TXT_PASSED", $this->lng->txt("exc_passed"));
351  $this->tpl->setVariable("TXT_FAILED", $this->lng->txt("exc_failed"));
352  } else {
353  $nt_colspan = in_array("mark", $this->getSelectedColumns())
354  ? 2
355  : 1;
356 
357  $this->tpl->setVariable("NO_TEAM_COLSPAN", $nt_colspan);
358  }
359 
360  // selectable columns
361 
362  foreach ($this->getSelectedColumns() as $col) {
363  $include_seconds = false;
364  switch ($col) {
365  case "image":
366  if (!$a_ass->hasTeam()) {
368  if ($usr_obj = ilObjectFactory::getInstanceByObjId($a_user_id, false)) {
369  $this->tpl->setVariable("VAL_IMAGE", $usr_obj->getPersonalPicturePath("xxsmall"));
370  $this->tpl->setVariable("TXT_IMAGE", $this->lng->txt("personal_picture"));
371  }
372  }
373  break;
374 
375  case "team_members":
376  if ($a_ass->hasTeam()) {
377  if (count($a_row["team"]) === 0) {
378  $this->tpl->setVariable("VAL_TEAM_MEMBER", $this->lng->txt("exc_no_team_yet"));
379  } else {
380  foreach ($a_row["team"] as $name) {
381  $this->tpl->setCurrentBlock("team_member_bl");
382  $this->tpl->setVariable("VAL_TEAM_MEMBER", $name);
383  $this->tpl->parseCurrentBlock();
384  }
385  }
386  } else {
387  $this->tpl->setVariable("VAL_TEAM_MEMBER", "&nbsp;");
388  }
389  break;
390 
391  case "calc_deadline":
392  case "idl":
393 
394  if ($a_ass->getDeadlineMode() === ilExAssignment::DEADLINE_ABSOLUTE_INDIVIDUAL && ($a_row[$col] ?? 0) == 0) {
395  if ($a_row["requested_idl"] ?? false) {
396  $this->tpl->setVariable(
397  "VAL_" . strtoupper($col),
398  $this->lng->txt("exc_deadline_requested")
399  );
400  } else {
401  $this->tpl->setVariable(
402  "VAL_" . strtoupper($col),
403  "&nbsp;"
404  );
405  }
406  } else {
407  $this->tpl->setVariable(
408  "VAL_" . strtoupper($col),
409  isset($a_row[$col])
411  : "&nbsp;"
412  );
413  }
414  break;
415 
416  case "mark":
417  if (!$has_no_team_yet) {
418  $this->tpl->setVariable(
419  "VAL_" . strtoupper($col),
421  trim((string) ($a_row[$col] ?? ""))
422  )
423  );
424  }
425  break;
426 
427  case "notice":
428  // see #22076
429  $this->tpl->setVariable(
430  "VAL_" . strtoupper($col),
431  ilLegacyFormElementsUtil::prepareFormOutput(trim((string) ($a_row[$col] ?? "")))
432  );
433  break;
434 
435  case "comment":
436  // for js-updating
437  $comment_id = "excasscomm_" . $a_ass->getId() . "_" . $a_user_id;
438  $this->tpl->setVariable("LCOMMENT_ID", $comment_id . "_snip");
439 
440  // see #22076
441  $this->tpl->setVariable("VAL_" . strtoupper($col), (trim((string) ($a_row[$col] ?? "")) !== "")
442  ? nl2br(trim((string) $a_row[$col]))
443  : "&nbsp;");
444  break;
445 
446  case "feedback_time":
447  case "status_time":
448  case "sent_time":
449  case "submission":
450  if ($col == "submission" && $a_row["submission_obj"]) {
451  $include_seconds = true;
452  $sm = $this->domain->submission($a_row["submission_obj"]->getAssignment()->getId());
453  foreach ($sm->getSubmissionsOfUser($a_row["submission_obj"]->getUserId()) as $sub) {
454  if ($sub->getLate()) {
455  $this->tpl->setVariable("TXT_LATE", $this->lng->txt("exc_late_submission"));
456  break;
457  }
458  }
459  }
460  $this->tpl->setVariable(
461  "VAL_" . strtoupper($col),
462  ($a_row[$col] ?? false)
464  new ilDateTime($a_row[$col], IL_CAL_DATETIME),
465  false,
466  false,
467  $include_seconds
468  )
469  : "&nbsp;"
470  );
471  break;
472 
473  case "login":
474  if (!$a_ass->hasTeam()) {
475  $this->tpl->setVariable("VAL_" . strtoupper($col), $a_row[$col]
476  ? trim((string) $a_row[$col])
477  : "&nbsp;");
478  }
479  break;
480 
481  default:
482  $this->tpl->setVariable("VAL_" . strtoupper($col), $a_row[$col]
483  ? trim((string) $a_row[$col])
484  : "&nbsp;");
485  break;
486  }
487  }
488 
489 
490  // actions
491 
492  $items = array();
493 
494  $file_info = $a_row["submission_obj"]->getDownloadedFilesInfoForTableGUIS();
495 
496  $counter = $file_info["files"]["count"];
497  if ($counter) {
498  if (isset($file_info["files"]["download_url"])) {
499  $items[] = $this->ui_factory->button()->shy(
500  $file_info["files"]["download_txt"] . " (" . $counter . ")",
501  $file_info["files"]["download_url"]
502  );
503  }
504 
505  if (isset($file_info["files"]["download_new_url"])) {
506  $items[] = $this->ui_factory->button()->shy(
507  $file_info["files"]["download_new_txt"],
508  $file_info["files"]["download_new_url"]
509  );
510  }
511  }
512 
513  $ass_type = $this->ass_type ?: ilExAssignmentTypes::getInstance()->getById($a_ass->getType());
514 
515  if ($ass_type->supportsWebDirAccess() && $a_row['submission_obj']->hasSubmittedPrintVersion()) {
516  $url = $ilCtrl->getLinkTarget($this->getParentObject(), "openSubmissionView");
517  $items[] = $this->ui_factory->link()->standard($this->lng->txt("exc_tbl_action_open_submission"), $url)->withOpenInNewViewport(true);
518  if ($a_row['submission_obj']->hasSubmittedPrintVersion()) {
519  $url = $ilCtrl->getLinkTarget($this->getParentObject(), "openSubmissionPrintView");
520  $items[] = $this->ui_factory->link()->standard($this->lng->txt("exc_print_pdf"), $url)->withOpenInNewViewport(true);
521  }
522  }
523  $ind_deadline_mode = ($a_ass->getDeadlineMode() === ilExAssignment::DEADLINE_ABSOLUTE_INDIVIDUAL);
524  if (!$has_no_team_yet &&
525  $a_ass->hasActiveIDl() &&
526  !$a_ass->hasReadOnlyIDl() &&
527  (!is_null($a_row["calc_deadline"] ?? null) || $a_ass->getDeadline() || $ind_deadline_mode)) { // calculated or common deadline given
528  $idl_id = $a_ass->hasTeam()
529  ? "t" . ilExAssignmentTeam::getTeamId($a_ass->getId(), $a_user_id)
530  : $a_user_id;
531 
532  $this->tpl->setVariable("VAL_IDL_ID", $a_ass->getId() . "_" . $idl_id);
533 
534  $assignment_id = $a_ass->getId();
535  $items[] = $this->ui_factory->button()->shy($this->lng->txt("exc_individual_deadline_action"), "#")
536  ->withOnLoadCode(function ($id) use ($idl_id, $assignment_id) {
537  return "$('#$id').on('click', function() {il.ExcIDl.trigger('$idl_id', '$assignment_id'); return false;})";
538  });
539  }
540 
541  // feedback mail
542  if ($this->exc->hasTutorFeedbackMail()) {
543  $items[] = $this->ui_factory->button()->shy(
544  $this->lng->txt("exc_tbl_action_feedback_mail"),
545  $ilCtrl->getLinkTarget($this->parent_obj, "redirectFeedbackMail")
546  );
547  }
548 
549  // feedback files
550  if ($a_ass->canParticipantReceiveFeedback($a_user_id)) {
551  if ($this->exc->hasTutorFeedbackFile()) {
552  $tutor_feedback_manager = $this->ass_domain->tutorFeedbackFile($a_ass->getId());
553  if ($tutor_feedback_manager->hasCollection($a_user_id)) {
554  // IRSS
555  $counter = $tutor_feedback_manager->count($a_user_id);
556  $counter = $counter
557  ? " (" . $counter . ")"
558  : "";
559  $items[] = $this->ui_factory->button()->shy(
560  $this->lng->txt("exc_tbl_action_feedback_file") . $counter,
561  $ilCtrl->getLinkTargetByClass(ilResourceCollectionGUI::class, "")
562  );
563  }
564  }
565 
566  // comment (modal)
567  if ($this->exc->hasTutorFeedbackText()) {
568  $components = $this->feedback_gui->getComponents($a_ass->getId(), $a_user_id);
569  foreach ($components as $type => $c) {
570  if ($type === "modal") {
571  $this->comment_modals[] = $this->ui_renderer->render($c);
572  } elseif ($type === "button") {
573  $items[] = $c;
574  }
575  }
576  }
577  }
578 
579  // peer review
580  if (($peer_review = $a_row["submission_obj"]->getPeerReview()) && $a_ass->afterDeadlineStrict()) { // see #22246
581  $counter = $peer_review->countGivenFeedback(true, $a_user_id);
582  $counter = $counter
583  ? " (" . $counter . ")"
584  : "";
585  $items[] = $this->ui_factory->button()->shy(
586  $this->lng->txt("exc_tbl_action_peer_review_given") . $counter,
587  $ilCtrl->getLinkTargetByClass("ilexpeerreviewgui", "showGivenPeerReview")
588  );
589 
590  $counter = count($peer_review->getPeerReviewsByPeerId($a_user_id, true));
591  $counter = $counter !== 0
592  ? " (" . $counter . ")"
593  : "";
594 
595  $items[] = $this->ui_factory->button()->shy(
596  $this->lng->txt("exc_tbl_action_peer_review_received") . $counter,
597  $ilCtrl->getLinkTargetByClass("ilexpeerreviewgui", "showReceivedPeerReview")
598  );
599  }
600 
601  // team
602  if ($has_no_team_yet) {
603  $items[] = $this->ui_factory->button()->shy(
604  $this->lng->txt("exc_create_team"),
605  $ilCtrl->getLinkTargetByClass("ilExSubmissionTeamGUI", "createSingleMemberTeam")
606  );
607  } elseif ($a_ass->hasTeam()) {
608  $items[] = $this->ui_factory->button()->shy(
609  $this->lng->txt("exc_tbl_action_team_log"),
610  $ilCtrl->getLinkTargetByClass("ilExSubmissionTeamGUI", "showTeamLog")
611  );
612  }
613 
614  $actions = $this->ui_factory->dropdown()->standard($items);
615 
616  $this->tpl->setVariable("ACTIONS", $this->ui_renderer->render($actions));
617  }
618 
619  public function render(): string
620  {
621  return parent::render() .
622  implode("\n", $this->comment_modals);
623  }
624 }
ilExerciseSubmissionFeedbackGUI $feedback_gui
setData(array $a_data)
static formatDate(ilDateTime $date, bool $a_skip_day=false, bool $a_include_wd=false, bool $include_seconds=false, ilObjUser $user=null,)
getType()
Get type this will most probably become an non public function in the future (or become obsolete) ...
Exercise assignment.
const IL_CAL_DATETIME
canParticipantReceiveFeedback(int $part_id)
setFormAction(string $a_form_action, bool $a_multipart=false)
addFilterItem(ilTableFilterItem $a_input_item, bool $a_optional=false)
setResetCommand(string $a_val, string $a_caption="")
afterDeadlineStrict(bool $a_include_personal=true)
setShowTemplates(bool $a_value)
$url
Definition: shib_logout.php:63
static prepareFormOutput($a_str, bool $a_strip=false)
const IL_CAL_UNIX
$c
Definition: deliver.php:9
setFormName(string $a_name="")
$components
Class ilObjExercise.
addFilterItemByMetaType(string $id, int $type=self::FILTER_TEXT, bool $a_optional=false, string $caption="")
Add filter by standard type.
setDefaultOrderField(string $a_defaultorderfield)
This is how the factory for UI elements looks.
Definition: Factory.php:37
__construct(object $a_parent_obj, string $a_parent_cmd, ilObjExercise $a_exc, int $a_item_id, ilExerciseSubmissionFeedbackGUI $feedback_gui)
setRowTemplate(string $a_template, string $a_template_dir="")
Set row template.
setFilterCommand(string $a_val, string $a_caption="")
global $DIC
Definition: shib_login.php:25
setDefaultOrderDirection(string $a_defaultorderdirection)
ILIAS Exercise InternalDomainService $domain
static getTeamId(int $a_assignment_id, int $a_user_id, bool $a_create_on_demand=false)
ILIAS Exercise Assignment DomainService $ass_domain
static getInstanceByObjId(?int $obj_id, bool $stop_on_error=true)
get an instance of an Ilias object by object id
__construct(Container $dic, ilPlugin $plugin)
addColumn(string $a_text, string $a_sort_field="", string $a_width="", bool $a_is_checkbox_action_column=false, string $a_class="", string $a_tooltip="", bool $a_tooltip_with_html=false)
filter(string $filter_id, $class_path, string $cmd, bool $activated=true, bool $expanded=true)
addMultiCommand(string $a_cmd, string $a_text)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...