ILIAS  release_5-3 Revision v5.3.23-19-g915713cf615
All Data Structures Namespaces Files Functions Variables Typedefs Modules Pages
class.ilTrMatrixTableGUI.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (c) 1998-2010 ILIAS open source, Extended GPL, see docs/LICENSE */
3 
4 include_once("./Services/Tracking/classes/class.ilLPTableBaseGUI.php");
5 
15 {
16  protected $obj_ids = null;
17  protected $objective_ids = [];
18  protected $sco_ids = [];
19  protected $subitem_ids = [];
20  protected $in_course; // int
21  protected $in_group; // int
22  protected $privacy_fields = [];
23  protected $privacy_cols = [];
24  protected $has_multi; // bool
25 
29  public function __construct($a_parent_obj, $a_parent_cmd, $ref_id)
30  {
31  global $ilCtrl, $lng, $tree, $ilUser, $rbacsystem;
32 
33  $this->setId("trsmtx_" . $ref_id);
34  $this->ref_id = $ref_id;
35  $this->obj_id = ilObject::_lookupObjId($ref_id);
36  $this->type = ilObject::_lookupType($this->obj_id); // #17188
37 
38  $this->in_group = $tree->checkForParentType($this->ref_id, "grp");
39  if ($this->in_group) {
40  $this->in_group = ilObject::_lookupObjId($this->in_group);
41  } else {
42  $this->in_course = $tree->checkForParentType($this->ref_id, "crs");
43  if ($this->in_course) {
44  $this->in_course = ilObject::_lookupObjId($this->in_course);
45  }
46  }
47 
48  // has to be before constructor to work
49  $this->initFilter();
50 
51  parent::__construct($a_parent_obj, $a_parent_cmd);
52 
53  $this->parseTitle($this->obj_id, "trac_matrix");
54 
55  $this->setEnableHeader(true);
56  $this->setFormAction($ilCtrl->getFormActionByClass(get_class($this)));
57  $this->setRowTemplate("tpl.user_object_matrix_row.html", "Services/Tracking");
58  $this->setDefaultOrderField("login");
59  $this->setDefaultOrderDirection("asc");
60  $this->setShowTemplates(true);
61 
62  // see ilObjCourseGUI::addMailToMemberButton()
63  include_once "Services/Mail/classes/class.ilMail.php";
64  $mail = new ilMail($ilUser->getId());
65  if ($rbacsystem->checkAccess("internal_mail", $mail->getMailObjectReferenceId())) {
66  $this->addMultiCommand("mailselectedusers", $this->lng->txt("send_mail"));
67  }
68 
69  $this->lng->loadLanguageModule('user');
70  $this->addMultiCommand(
71  'addToClipboard',
72  $this->lng->txt('clipboard_add_btn')
73  );
74  $this->addColumn("", "", 1);
75  $this->has_multi = true;
76 
77  $this->addColumn($this->lng->txt("login"), "login");
78 
79  $labels = $this->getSelectableColumns();
80  $selected = $this->getSelectedColumns();
81  foreach ($selected as $c) {
82  $title = $labels[$c]["txt"];
83 
84  if (isset($labels[$c]["no_permission"]) && (bool) $labels[$c]["no_permission"]) {
85  $title .= " (" . $lng->txt("status_no_permission") . ")";
86  }
87 
88  $tooltip = array();
89  if (isset($labels[$c]["icon"])) {
90  $alt = $lng->txt($labels[$c]["type"]);
91  $icon = '<img src="' . $labels[$c]["icon"] . '" alt="' . $alt . '" />';
92  if (sizeof($selected) > 5) {
93  $tooltip[] = $title;
94  $title = $icon;
95  } else {
96  $title = $icon . ' ' . $title;
97  }
98  if ($labels[$c]["path"]) {
99  $tooltip[] = $labels[$c]["path"];
100  }
101  }
102 
103  if (isset($labels[$c]["id"])) {
104  $sort_id = $labels[$c]["id"];
105  } else {
106  // list cannot be sorted by udf fields (separate query)
107  $sort_id = (substr($c, 0, 4) == "udf_") ? "" : $c;
108  }
109 
110  $this->addColumn($title, $sort_id, "", false, "", implode(" - ", $tooltip));
111  }
112 
113  $this->setExportFormats(array(self::EXPORT_CSV, self::EXPORT_EXCEL));
114  }
115 
116  public function initFilter()
117  {
118  global $lng;
119 
120  $item = $this->addFilterItemByMetaType("name", ilTable2GUI::FILTER_TEXT);
121  $this->filter["name"] = $item->getValue();
122 
123  // #14949 - is called before constructor, so we have to do it ourselves
124  if (isset($_GET[$this->prefix . "_tpl"])) {
125  $this->filter["name"] = null;
126  $this->SetFilterValue($item, null);
127  }
128  }
129 
130  public function getSelectableColumns()
131  {
132  global $ilObjDataCache, $rbacsystem;
133 
134  $user_cols = $this->getSelectableUserColumns($this->in_course, $this->in_group);
135 
136  if ($this->obj_ids === null) {
137  // we cannot use the selected columns because they are not ready yet
138  // so we use all available columns, should be ok anyways
139  $this->obj_ids = $this->getItems(array_keys($user_cols[0]), $user_cols[1]);
140  }
141  if (is_array($this->obj_ids)) {
142  $tmp_cols = array();
143  foreach ($this->obj_ids as $obj_id) {
144  if ($obj_id == $this->obj_id) {
145  $parent = array("txt" => $this->lng->txt("status"),
146  "default" => true);
147  } else {
148  $no_perm = false;
149 
150  $ref_id = $this->ref_ids[$obj_id];
151  include_once './Services/Tracking/classes/class.ilLearningProgressAccess.php';
152  if ($ref_id &&
153  !ilLearningProgressAccess::checkPermission('read_learning_progress', $ref_id)) {
154  $no_perm = true;
155  $this->privacy_cols[] = $obj_id;
156  }
157 
158  $title = $ilObjDataCache->lookupTitle($obj_id);
159  $type = $ilObjDataCache->lookupType($obj_id);
160  $icon = ilObject::_getIcon("", "tiny", $type);
161  if ($type == "sess") {
162  include_once "Modules/Session/classes/class.ilObjSession.php";
163  $sess = new ilObjSession($obj_id, false);
164  $title = $sess->getPresentationTitle();
165  }
166 
167  // #16453
168  $relpath = null;
169  include_once './Services/Tree/classes/class.ilPathGUI.php';
170  $path = new ilPathGUI();
171  $path = $path->getPath($this->ref_id, $ref_id);
172  if ($path) {
173  $relpath = $this->lng->txt('path') . ': ' . $path;
174  }
175 
176  $tmp_cols[strtolower($title) . "#~#obj_" . $obj_id] = array(
177  "txt" => $title,
178  "icon" => $icon,
179  "type" => $type,
180  "default" => true,
181  "no_permission" => $no_perm,
182  "path" => $relpath);
183  }
184  }
185  if (sizeof($this->objective_ids)) {
186  foreach ($this->objective_ids as $obj_id => $title) {
187  $tmp_cols[strtolower($title) . "#~#objtv_" . $obj_id] = array("txt" => $title, "default" => true);
188  }
189  }
190  if (sizeof($this->sco_ids)) {
191  foreach ($this->sco_ids as $obj_id => $title) {
192  $icon = ilUtil::getTypeIconPath("sco", $obj_id, "tiny");
193  $tmp_cols[strtolower($title) . "#~#objsco_" . $obj_id] = array("txt" => $title, "icon"=>$icon, "default" => true);
194  }
195  }
196  if (sizeof($this->subitem_ids)) {
197  foreach ($this->subitem_ids as $obj_id => $title) {
198  include_once("./Services/Tracking/classes/class.ilTrQuery.php");
199  $icon = ilUtil::getTypeIconPath(ilTrQuery::getSubItemType($this->obj_id), $obj_id, "tiny");
200  $tmp_cols[strtolower($title) . "#~#objsub_" . $obj_id] = array("txt" => $title, "icon"=>$icon, "default" => true);
201  }
202  }
203 
204  // alex, 5 Nov 2011: Do not sort SCORM items or "chapters"
205  if (!sizeof($this->sco_ids) && !sizeof($this->subitem_ids)) {
206  ksort($tmp_cols);
207  }
208  foreach ($tmp_cols as $id => $def) {
209  $id = explode('#~#', $id);
210  $columns[$id[1]] = $def;
211  }
212  unset($tmp_cols);
213 
214  if ($parent) {
215  $columns["obj_" . $this->obj_id] = $parent;
216  }
217  }
218 
219  unset($user_cols[0]["status"]);
220  unset($user_cols[0]["login"]);
221  foreach ($user_cols[0] as $col_id => $col_def) {
222  if (!isset($columns[$col_id])) {
223  // these are all additional fields, no default
224  $col_def["default"] = false;
225  $columns[$col_id] = $col_def;
226  }
227  }
228 
229  return $columns;
230  }
231 
232  public function getItems(array $a_user_fields, array $a_privary_fields = null)
233  {
234  // #17081
235  if ($this->restore_filter) {
236  $name = $this->restore_filter_values["name"];
237  $this->SetFilterValue($this->filters[0], $name);
238  $this->filter["name"] = $name;
239  }
240 
241  include_once("./Services/Tracking/classes/class.ilTrQuery.php");
242  $collection = ilTrQuery::getObjectIds($this->obj_id, $this->ref_id, true);
243  if ($collection["object_ids"]) {
244  // we need these for the timing warnings
245  $this->ref_ids = $collection["ref_ids"];
246 
247  // only if object is [part of] course/group
248  $check_agreement = false;
249  if ($this->in_course) {
250  // privacy (if course agreement is activated)
251  include_once "Services/PrivacySecurity/classes/class.ilPrivacySettings.php";
252  $privacy = ilPrivacySettings::_getInstance();
253  if ($privacy->courseConfirmationRequired()) {
254  $check_agreement = $this->in_course;
255  }
256  } elseif ($this->in_group) {
257  // privacy (if group agreement is activated)
258  include_once "Services/PrivacySecurity/classes/class.ilPrivacySettings.php";
259  $privacy = ilPrivacySettings::_getInstance();
260  if ($privacy->groupConfirmationRequired()) {
261  $check_agreement = $this->in_group;
262  }
263  }
264 
265  $data = ilTrQuery::getUserObjectMatrix($this->ref_id, $collection["object_ids"], $this->filter["name"], $a_user_fields, $a_privary_fields, $check_agreement);
266  if ($collection["objectives_parent_id"] && $data["users"]) {
267  // sub-items: learning objectives
268  $objectives = ilTrQuery::getUserObjectiveMatrix($collection["objectives_parent_id"], $data["users"]);
269 
270  $this->objective_ids = array();
271 
272  foreach ($objectives as $user_id => $objectives) {
273  if (isset($data["set"][$user_id])) {
274  foreach ($objectives as $objective_id => $status) {
275  $obj_id = "objtv_" . $objective_id;
276  $data["set"][$user_id][$obj_id] = $status;
277 
278  if (!in_array($obj_id, $this->objective_ids)) {
279  $this->objective_ids[$objective_id] = ilCourseObjective::lookupObjectiveTitle($objective_id);
280  }
281  }
282  }
283  }
284  }
285 
286  // sub-items: SCOs
287  if ($collection["scorm"] && $data["set"]) {
288  $this->sco_ids = array();
289  foreach (array_keys($data["set"]) as $user_id) {
290  foreach ($collection["scorm"]["scos"] as $sco) {
291  if (!in_array($sco, $this->sco_ids)) {
292  $this->sco_ids[$sco] = $collection["scorm"]["scos_title"][$sco];
293  }
294 
295  // alex, 5 Nov 2011: we got users being in failed and in
296  // completed status, I changed the setting in: first check failed
297  // then check completed since failed should superseed completed
298  // (before completed has been checked before failed)
300  if (in_array($user_id, $collection["scorm"]["failed"][$sco])) {
302  } elseif (in_array($user_id, $collection["scorm"]["completed"][$sco])) {
304  } elseif (in_array($user_id, $collection["scorm"]["in_progress"][$sco])) {
306  }
307 
308  $obj_id = "objsco_" . $sco;
309  $data["set"][$user_id][$obj_id] = $status;
310  }
311  }
312  }
313 
314  // sub-items: generic, e.g. lm chapter
315  if ($collection["subitems"] && $data["set"]) {
316  foreach (array_keys($data["set"]) as $user_id) {
317  foreach ($collection["subitems"]["items"] as $item_id) {
318  $this->subitem_ids[$item_id] = $collection["subitems"]["item_titles"][$item_id];
319 
321  if (in_array($user_id, $collection["subitems"]["completed"][$item_id])) {
323  } elseif (is_array($collection["subitems"]["in_progress"]) &&
324  in_array($user_id, $collection["subitems"]["in_progress"][$item_id])) {
326  }
327 
328  $obj_id = "objsub_" . $item_id;
329  $data["set"][$user_id][$obj_id] = $status;
330  }
331  }
332  }
333 
334  // percentage export
335  if ($data["set"]) {
336  $this->perc_map = array();
337  foreach ($data["set"] as $row_idx => $row) {
338  foreach ($row as $column => $value) {
339  if (substr($column, -5) == "_perc") {
340  $obj_id = explode("_", $column);
341  $obj_id = (int) $obj_id[1];
342 
343  // #18673
344  if (!$this->isPercentageAvailable($obj_id) ||
345  !(int) $value) {
346  unset($data["set"][$row_idx][$column]);
347  } else {
348  $this->perc_map[$obj_id] = true;
349  }
350  }
351  }
352  }
353  }
354 
355  $this->setMaxCount($data["cnt"]);
356  $this->setData($data["set"]);
357 
358  return $collection["object_ids"];
359  }
360  return false;
361  }
362 
363  public function fillRow($a_set)
364  {
365  global $lng;
366 
367  if ($this->has_multi) {
368  $this->tpl->setVariable("USER_ID", $a_set["usr_id"]);
369  }
370 
371  foreach ($this->getSelectedColumns() as $c) {
372  switch ($c) {
373  case (substr($c, 0, 4) == "obj_"):
374  $obj_id = substr($c, 4);
375 
376  // object without read-lp-permission
377  if (in_array($obj_id, $this->privacy_cols) ||
378  $a_set["privacy_conflict"]) {
379  $this->tpl->setCurrentBlock("objects");
380  $this->tpl->setVariable("VAL_STATUS", "&nbsp;");
381  $this->tpl->parseCurrentBlock();
382  continue;
383  }
384 
385  $status = isset($a_set[$c])
386  ? (int) $a_set[$c]
388  $percentage = isset($a_set[$c . "_perc"])
389  ? (int) $a_set[$c . "_perc"]
390  : null;
391 
392  if ($status != ilLPStatus::LP_STATUS_COMPLETED_NUM) {
393  $timing = $this->showTimingsWarning($this->ref_ids[$obj_id], $a_set["usr_id"]);
394  if ($timing) {
395  if ($timing !== true) {
396  $timing = ": " . ilDatePresentation::formatDate(new ilDate($timing, IL_CAL_UNIX));
397  } else {
398  $timing = "";
399  }
400  $this->tpl->setCurrentBlock('warning_img');
401  $this->tpl->setVariable('WARNING_IMG', ilUtil::getImagePath('time_warn.svg'));
402  $this->tpl->setVariable('WARNING_ALT', $this->lng->txt('trac_time_passed') . $timing);
403  $this->tpl->parseCurrentBlock();
404  }
405  }
406 
407  $this->tpl->setCurrentBlock("objects");
408  $this->tpl->setVariable("VAL_STATUS", $this->parseValue("status", $status, ""));
409  $this->tpl->setVariable("VAL_PERCENTAGE", $this->parseValue("percentage", $percentage, ""));
410  $this->tpl->parseCurrentBlock();
411  break;
412 
413 
414  case (substr($c, 0, 6) == "objtv_"):
415  case (substr($c, 0, 7) == "objsco_"):
416  case (substr($c, 0, 7) == "objsub_"):
417  $status = isset($a_set[$c])
418  ? (int) $a_set[$c]
420 
421  $this->tpl->setCurrentBlock("objects");
422  if (!$a_set["privacy_conflict"]) {
423  $this->tpl->setVariable("VAL_STATUS", $this->parseValue("status", $status, ""));
424  } else {
425  $this->tpl->setVariable("VAL_STATUS", "&nbsp;");
426  }
427  $this->tpl->parseCurrentBlock();
428  break;
429 
430  default:
431  $this->tpl->setCurrentBlock("user_field");
432  if (!$a_set["privacy_conflict"]) {
433  $this->tpl->setVariable("VAL_UF", $this->parseValue($c, $a_set[$c], ""));
434  } else {
435  $this->tpl->setVariable("VAL_UF", "&nbsp;");
436  }
437  $this->tpl->parseCurrentBlock();
438  break;
439  }
440  }
441 
442  // #7694
443  if (!$a_set["active"] || $a_set["privacy_conflict"]) {
444  $mess = array();
445  if ($a_set["privacy_conflict"]) {
446  $mess[] = $lng->txt("status_no_permission");
447  } elseif (!$a_set["active"]) {
448  $mess[] = $lng->txt("inactive");
449  }
450  $this->tpl->setCurrentBlock('inactive_bl');
451  $this->tpl->setVariable('TXT_INACTIVE', implode(", ", $mess));
452  $this->tpl->parseCurrentBlock();
453  }
454 
455  $login = !$a_set["privacy_conflict"]
456  ? $a_set["login"]
457  : "&nbsp;";
458  $this->tpl->setVariable("VAL_LOGIN", $login);
459  }
460 
461  protected function fillHeaderExcel(ilExcel $a_excel, &$a_row)
462  {
463  global $ilObjDataCache;
464 
465  $a_excel->setCell($a_row, 0, $this->lng->txt("login"));
466 
467  $labels = $this->getSelectableColumns();
468  $cnt = 1;
469  foreach ($this->getSelectedColumns() as $c) {
470  if (substr($c, 0, 4) == "obj_") {
471  $obj_id = substr($c, 4);
472  $type = $ilObjDataCache->lookupType($obj_id);
473  $a_excel->setCell($a_row, $cnt, "(" . $this->lng->txt($type) . ") " . $labels[$c]["txt"]);
474 
475  if (is_array($this->perc_map) && $this->perc_map[$obj_id]) {
476  $cnt++;
477  $a_excel->setCell($a_row, $cnt, $this->lng->txt("trac_percentage") . " (%)");
478  }
479  } else {
480  $a_excel->setCell($a_row, $cnt, $labels[$c]["txt"]);
481  }
482  $cnt++;
483  }
484 
485  $a_excel->setBold("A" . $a_row . ":" . $a_excel->getColumnCoord($cnt) . $a_row);
486  }
487 
488  protected function fillRowExcel(ilExcel $a_excel, &$a_row, $a_set)
489  {
490  $a_excel->setCell($a_row, 0, $a_set["login"]);
491 
492  $cnt = 1;
493  foreach ($this->getSelectedColumns() as $c) {
494  switch ($c) {
495  case (substr($c, 0, 4) == "obj_"):
496  $obj_id = substr($c, 4);
497  $val = ilLearningProgressBaseGUI::_getStatusText((int) $a_set[$c]);
498  $a_excel->setCell($a_row, $cnt, $val);
499 
500  if (is_array($this->perc_map) && $this->perc_map[$obj_id]) {
501  $cnt++;
502  $perc = (int) $a_set[$c . "_perc"];
503  $perc = !$perc
504  ? null
505  : $perc . "%";
506  $a_excel->setCell($a_row, $cnt, $perc);
507  }
508  break;
509 
510  case (substr($c, 0, 6) == "objtv_"):
511  case (substr($c, 0, 7) == "objsco_"):
512  case (substr($c, 0, 7) == "objsub_"):
513  $val = ilLearningProgressBaseGUI::_getStatusText((int) $a_set[$c]);
514  $a_excel->setCell($a_row, $cnt, $val);
515  break;
516 
517  /* #14142
518  case "last_access":
519  case "spent_seconds":
520  case "status_changed":
521  */
522  default:
523  $val = $this->parseValue($c, $a_set[$c], "user");
524  $a_excel->setCell($a_row, $cnt, $val);
525  break;
526 
527  }
528  $cnt++;
529  }
530  }
531 
532  protected function fillHeaderCSV($a_csv)
533  {
534  global $ilObjDataCache;
535 
536  $a_csv->addColumn($this->lng->txt("login"));
537 
538  $labels = $this->getSelectableColumns();
539  foreach ($this->getSelectedColumns() as $c) {
540  if (substr($c, 0, 4) == "obj_") {
541  $obj_id = substr($c, 4);
542  $type = $ilObjDataCache->lookupType($obj_id);
543  $a_csv->addColumn("(" . $this->lng->txt($type) . ") " . $labels[$c]["txt"]);
544 
545  if (is_array($this->perc_map) && $this->perc_map[$obj_id]) {
546  $a_csv->addColumn($this->lng->txt("trac_percentage") . " (%)");
547  }
548  } else {
549  $a_csv->addColumn($labels[$c]["txt"]);
550  }
551  }
552 
553  $a_csv->addRow();
554  }
555 
556  protected function fillRowCSV($a_csv, $a_set)
557  {
558  $a_csv->addColumn($a_set["login"]);
559 
560  foreach ($this->getSelectedColumns() as $c) {
561  switch ($c) {
562  case (substr($c, 0, 4) == "obj_"):
563  $obj_id = substr($c, 4);
564  $val = ilLearningProgressBaseGUI::_getStatusText((int) $a_set[$c]);
565  $a_csv->addColumn($val);
566 
567  if (is_array($this->perc_map) && $this->perc_map[$obj_id]) {
568  $perc = (int) $a_set[$c . "_perc"];
569  if (!$perc) {
570  $perc = null;
571  }
572  $a_csv->addColumn($perc);
573  }
574  break;
575 
576  case (substr($c, 0, 6) == "objtv_"):
577  case (substr($c, 0, 7) == "objsco_"):
578  case (substr($c, 0, 7) == "objsub_"):
579  $val = ilLearningProgressBaseGUI::_getStatusText((int) $a_set[$c]);
580  $a_csv->addColumn($val);
581  break;
582 
583  /* #14142
584  case "last_access":
585  case "spent_seconds":
586  case "status_changed":
587  */
588  default:
589  $val = $this->parseValue($c, $a_set[$c], "user");
590  $a_csv->addColumn($val);
591  break;
592 
593  }
594  }
595 
596  $a_csv->addRow();
597  }
598 }
const LP_STATUS_COMPLETED_NUM
static _getIcon( $a_obj_id="", $a_size="big", $a_type="", $a_offline=false)
Get icon for repository item.
fillRowExcel(ilExcel $a_excel, &$a_row, $a_set)
Creates a path for a start and endnode.
getSelectableUserColumns($a_in_course=false, $a_in_group=false)
static lookupObjectiveTitle($a_objective_id, $a_add_description=false)
setDefaultOrderField($a_defaultorderfield)
Set Default order field.
setExportFormats(array $formats)
Set available export formats.
fillHeaderExcel(ilExcel $a_excel, &$a_row)
$type
$_GET["client_id"]
setShowTemplates($a_value)
Toggle templates.
__construct($a_parent_obj, $a_parent_cmd, $ref_id)
Constructor.
static _getStatusText($a_status, $a_lng=null)
Get status alt text.
static formatDate(ilDateTime $date, $a_skip_day=false, $a_include_wd=false)
Format a date public.
static getSubItemType($a_parent_obj_id)
Get sub-item object type for parent.
const LP_STATUS_IN_PROGRESS_NUM
if(!array_key_exists('StateId', $_REQUEST)) $id
addFilterItemByMetaType($id, $type=self::FILTER_TEXT, $a_optional=false, $caption=null)
Add filter by standard type.
parseTitle($a_obj_id, $action, $a_user_id=false)
const IL_CAL_UNIX
parseValue($id, $value, $type)
static checkPermission($a_permission, $a_ref_id, $a_user_id=null)
wrapper for rbac access checks
static getTypeIconPath($a_type, $a_obj_id, $a_size='small')
Get type icon path path Return image path for icon_xxx.pngs Or (if enabled) path to custom icon Depre...
setId($a_val)
Set id.
global $ilCtrl
Definition: ilias.php:18
setDefaultOrderDirection($a_defaultorderdirection)
Set Default order direction.
if($format !==null) $name
Definition: metadata.php:146
getItems(array $a_user_fields, array $a_privary_fields=null)
$column
Definition: 39dropdown.php:62
Class for single dates.
getColumnCoord($a_col)
Get column "name" from number.
TableGUI class for learning progress.
setBold($a_coords)
Set cell(s) to bold.
static getImagePath($img, $module_path="", $mode="output", $offline=false)
get image path (for images located in a template directory)
This class handles base functions for mail handling.
static _lookupObjId($a_id)
addMultiCommand($a_cmd, $a_text)
Add Command button.
$ilUser
Definition: imgupload.php:18
getSelectedColumns()
Get selected columns.
setCell($a_row, $a_col, $a_value, $a_datatype=null)
Set cell value.
SetFilterValue(ilFormPropertyGUI $a_item, $a_value)
Set current filter value.
setRowTemplate($a_template, $a_template_dir="")
Set row template.
Create styles array
The data for the language used.
static _lookupType($a_id, $a_reference=false)
lookup object type
static getObjectIds($a_parent_obj_id, $a_parent_ref_id=false, $use_collection=true, $a_refresh_status=true, $a_user_ids=null)
Get (sub)objects for given object, also handles learning objectives (course only) ...
static getUserObjectiveMatrix($a_parent_obj_id, $a_users)
const LP_STATUS_NOT_ATTEMPTED_NUM
setFormAction($a_form_action, $a_multipart=false)
Set Form action parameter.
showTimingsWarning($a_ref_id, $a_user_id)
addColumn( $a_text, $a_sort_field="", $a_width="", $a_is_checkbox_action_column=false, $a_class="", $a_tooltip="", $a_tooltip_with_html=false)
Add a column to the header.
$def
Definition: croninfo.php:21
setEnableHeader($a_enableheader)
Set Enable Header.
static _getInstance()
Get instance of ilPrivacySettings.
static getUserObjectMatrix( $a_parent_ref_id, $a_obj_ids, $a_user_filter=null, array $a_additional_fields=null, array $a_privacy_fields=null, $a_check_agreement=null)
Get status matrix for users on objects.
setMaxCount($a_max_count)
set max.
if(! $in) $columns
Definition: Utf8Test.php:45
const LP_STATUS_FAILED_NUM