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