ILIAS  release_5-1 Revision 5.0.0-5477-g43f3e3fab5f
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 = NULL;
18  protected $sco_ids = NULL;
19  protected $subitem_ids = NULL;
20  protected $in_course; // int
21  protected $in_group; // int
22  protected $privacy_fields; // array
23  protected $privacy_cols = array(); // array
24  protected $has_multi; // bool
25 
29  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  {
41  $this->in_group = ilObject::_lookupObjId($this->in_group);
42  }
43  else
44  {
45  $this->in_course = $tree->checkForParentType($this->ref_id, "crs");
46  if($this->in_course)
47  {
48  $this->in_course = ilObject::_lookupObjId($this->in_course);
49  }
50  }
51 
52  // has to be before constructor to work
53  $this->initFilter();
54 
55  parent::__construct($a_parent_obj, $a_parent_cmd);
56 
57  $this->setLimit(9999);
58  $this->parseTitle($this->obj_id, "trac_matrix");
59 
60  $this->setEnableHeader(true);
61  $this->setFormAction($ilCtrl->getFormActionByClass(get_class($this)));
62  $this->setRowTemplate("tpl.user_object_matrix_row.html", "Services/Tracking");
63  $this->setDefaultOrderField("login");
64  $this->setDefaultOrderDirection("asc");
65  $this->setShowTemplates(true);
66 
67  // see ilObjCourseGUI::addMailToMemberButton()
68  include_once "Services/Mail/classes/class.ilMail.php";
69  $mail = new ilMail($ilUser->getId());
70  if($rbacsystem->checkAccess("internal_mail", $mail->getMailObjectReferenceId()))
71  {
72  $this->addMultiCommand("mailselectedusers", $this->lng->txt("send_mail"));
73  $this->addColumn("", "", 1);
74  $this->has_multi = true;
75  }
76 
77  $this->addColumn($this->lng->txt("login"), "login");
78 
79  $labels = $this->getSelectableColumns();
80  $selected = $this->getSelectedColumns();
81  foreach ($selected as $c)
82  {
83  $title = $labels[$c]["txt"];
84 
85  if(isset($labels[$c]["no_permission"]) && (bool)$labels[$c]["no_permission"])
86  {
87  $title .= " (".$lng->txt("status_no_permission").")";
88  }
89 
90  $tooltip = array();
91  if(isset($labels[$c]["icon"]))
92  {
93  $alt = $lng->txt($labels[$c]["type"]);
94  $icon = '<img src="'.$labels[$c]["icon"].'" alt="'.$alt.'" />';
95  if(sizeof($selected) > 5)
96  {
97  $tooltip[] = $title;
98  $title = $icon;
99  }
100  else
101  {
102  $title = $icon.' '.$title;
103  }
104  if($labels[$c]["path"])
105  {
106  $tooltip[] = $labels[$c]["path"];
107  }
108  }
109 
110  if(isset($labels[$c]["id"]))
111  {
112  $sort_id = $labels[$c]["id"];
113  }
114  else
115  {
116  // list cannot be sorted by udf fields (separate query)
117  $sort_id = (substr($c, 0, 4) == "udf_") ? "" : $c;
118  }
119 
120  $this->addColumn($title, $sort_id, "", false, "", implode(" - ", $tooltip));
121  }
122 
123  $this->setExportFormats(array(self::EXPORT_CSV, self::EXPORT_EXCEL));
124  }
125 
126  function initFilter()
127  {
128  global $lng;
129 
130  $item = $this->addFilterItemByMetaType("name", ilTable2GUI::FILTER_TEXT);
131  $this->filter["name"] = $item->getValue();
132 
133  // #14949 - is called before constructor, so we have to do it ourselves
134  if(isset($_GET[$this->prefix."_tpl"]))
135  {
136  $this->filter["name"] = null;
137  $this->SetFilterValue($item, null);
138  }
139  }
140 
142  {
143  global $ilObjDataCache, $rbacsystem;
144 
145  $user_cols = $this->getSelectableUserColumns($this->in_course, $this->in_group);
146 
147  if($this->obj_ids === NULL)
148  {
149  // we cannot use the selected columns because they are not ready yet
150  // so we use all available columns, should be ok anyways
151  $this->obj_ids = $this->getItems(array_keys($user_cols[0]), $user_cols[1]);
152  }
153  if($this->obj_ids)
154  {
155  $tmp_cols = array();
156  foreach($this->obj_ids as $obj_id)
157  {
158  if($obj_id == $this->obj_id)
159  {
160  $parent = array("txt" => $this->lng->txt("status"),
161  "default" => true);
162  }
163  else
164  {
165  $no_perm = false;
166 
167  $ref_id = $this->ref_ids[$obj_id];
168  include_once './Services/Tracking/classes/class.ilLearningProgressAccess.php';
169  if($ref_id &&
170  !ilLearningProgressAccess::checkPermission('read_learning_progress', $ref_id))
171  {
172  $no_perm = true;
173  $this->privacy_cols[] = $obj_id;
174  }
175 
176  $title = $ilObjDataCache->lookupTitle($obj_id);
177  $type = $ilObjDataCache->lookupType($obj_id);
178  $icon = ilObject::_getIcon("", "tiny", $type);
179  if($type == "sess")
180  {
181  include_once "Modules/Session/classes/class.ilObjSession.php";
182  $sess = new ilObjSession($obj_id, false);
183  $title = $sess->getPresentationTitle();
184  }
185 
186  // #16453
187  $relpath = null;
188  include_once './Services/Tree/classes/class.ilPathGUI.php';
189  $path = new ilPathGUI();
190  $path = $path->getPath($this->ref_id, $ref_id);
191  if($path)
192  {
193  $relpath = $this->lng->txt('path').': '.$path;
194  }
195 
196  $tmp_cols[strtolower($title)."#~#obj_".$obj_id] = array(
197  "txt" => $title,
198  "icon" => $icon,
199  "type" => $type,
200  "default" => true,
201  "no_permission" => $no_perm,
202  "path" => $relpath);
203  }
204  }
205  if(sizeof($this->objective_ids))
206  {
207  foreach($this->objective_ids as $obj_id => $title)
208  {
209  $tmp_cols[strtolower($title)."#~#objtv_".$obj_id] = array("txt" => $title, "default" => true);
210  }
211  }
212  if(sizeof($this->sco_ids))
213  {
214  foreach($this->sco_ids as $obj_id => $title)
215  {
216  $icon = ilUtil::getTypeIconPath("sco", $obj_id, "tiny");
217  $tmp_cols[strtolower($title)."#~#objsco_".$obj_id] = array("txt" => $title, "icon"=>$icon, "default" => true);
218  }
219  }
220  if(sizeof($this->subitem_ids))
221  {
222  foreach($this->subitem_ids as $obj_id => $title)
223  {
224  include_once("./Services/Tracking/classes/class.ilTrQuery.php");
225  $icon = ilUtil::getTypeIconPath(ilTrQuery::getSubItemType($this->obj_id), $obj_id, "tiny");
226  $tmp_cols[strtolower($title)."#~#objsub_".$obj_id] = array("txt" => $title, "icon"=>$icon, "default" => true);
227  }
228  }
229 
230  // alex, 5 Nov 2011: Do not sort SCORM items or "chapters"
231  if(!sizeof($this->sco_ids) && !sizeof($this->subitem_ids))
232  {
233  ksort($tmp_cols);
234  }
235  foreach($tmp_cols as $id => $def)
236  {
237  $id = explode('#~#', $id);
238  $columns[$id[1]] = $def;
239  }
240  unset($tmp_cols);
241 
242  if($parent)
243  {
244  $columns["obj_".$this->obj_id] = $parent;
245  }
246  }
247 
248  unset($user_cols[0]["status"]);
249  unset($user_cols[0]["login"]);
250  foreach($user_cols[0] as $col_id => $col_def)
251  {
252  if(!isset($columns[$col_id]))
253  {
254  // these are all additional fields, no default
255  $col_def["default"] = false;
256  $columns[$col_id] = $col_def;
257  }
258  }
259 
260  return $columns;
261  }
262 
263  function getItems(array $a_user_fields, array $a_privary_fields = null)
264  {
265  // #17081
266  if($this->restore_filter)
267  {
268  $name = $this->restore_filter_values["name"];
269  $this->SetFilterValue($this->filters[0], $name);
270  $this->filter["name"] = $name;
271  }
272 
273  include_once("./Services/Tracking/classes/class.ilTrQuery.php");
274  $collection = ilTrQuery::getObjectIds($this->obj_id, $this->ref_id, true);
275  if($collection["object_ids"])
276  {
277  // we need these for the timing warnings
278  $this->ref_ids = $collection["ref_ids"];
279 
280  // only if object is [part of] course/group
281  $check_agreement = false;
282  if($this->in_course)
283  {
284  // privacy (if course agreement is activated)
285  include_once "Services/PrivacySecurity/classes/class.ilPrivacySettings.php";
286  $privacy = ilPrivacySettings::_getInstance();
287  if($privacy->courseConfirmationRequired())
288  {
289  $check_agreement = $this->in_course;
290  }
291  }
292  else if($this->in_group)
293  {
294  // privacy (if group agreement is activated)
295  include_once "Services/PrivacySecurity/classes/class.ilPrivacySettings.php";
296  $privacy = ilPrivacySettings::_getInstance();
297  if($privacy->groupConfirmationRequired())
298  {
299  $check_agreement = $this->in_group;
300  }
301  }
302 
303  $data = ilTrQuery::getUserObjectMatrix($this->ref_id, $collection["object_ids"], $this->filter["name"], $a_user_fields, $a_privary_fields, $check_agreement);
304  if($collection["objectives_parent_id"] && $data["users"])
305  {
306  // sub-items: learning objectives
307  $objectives = ilTrQuery::getUserObjectiveMatrix($collection["objectives_parent_id"], $data["users"]);
308 
309  $this->objective_ids = array();
310 
311  foreach($objectives as $user_id => $objectives)
312  {
313  if(isset($data["set"][$user_id]))
314  {
315  foreach($objectives as $objective_id => $status)
316  {
317  $obj_id = "objtv_".$objective_id;
318  $data["set"][$user_id][$obj_id] = $status;
319 
320  if(!in_array($obj_id, $this->objective_ids))
321  {
322  $this->objective_ids[$objective_id] = ilCourseObjective::lookupObjectiveTitle($objective_id);
323  }
324  }
325  }
326  }
327  }
328 
329  // sub-items: SCOs
330  if($collection["scorm"] && $data["set"])
331  {
332  $this->sco_ids = array();
333  foreach(array_keys($data["set"]) as $user_id)
334  {
335  foreach($collection["scorm"]["scos"] as $sco)
336  {
337  if(!in_array($sco, $this->sco_ids))
338  {
339  $this->sco_ids[$sco] = $collection["scorm"]["scos_title"][$sco];
340  }
341 
342  // alex, 5 Nov 2011: we got users being in failed and in
343  // completed status, I changed the setting in: first check failed
344  // then check completed since failed should superseed completed
345  // (before completed has been checked before failed)
347  if(in_array($user_id, $collection["scorm"]["failed"][$sco]))
348  {
350  }
351  else if(in_array($user_id, $collection["scorm"]["completed"][$sco]))
352  {
354  }
355  else if(in_array($user_id, $collection["scorm"]["in_progress"][$sco]))
356  {
358  }
359 
360  $obj_id = "objsco_".$sco;
361  $data["set"][$user_id][$obj_id] = $status;
362  }
363  }
364  }
365 
366  // sub-items: generic, e.g. lm chapter
367  if($collection["subitems"] && $data["set"])
368  {
369  foreach(array_keys($data["set"]) as $user_id)
370  {
371  foreach($collection["subitems"]["items"] as $item_id)
372  {
373  $this->subitem_ids[$item_id] = $collection["subitems"]["item_titles"][$item_id];
374 
376  if(in_array($user_id, $collection["subitems"]["completed"][$item_id]))
377  {
379  }
380  else if(is_array($collection["subitems"]["in_progress"]) &&
381  in_array($user_id, $collection["subitems"]["in_progress"][$item_id]))
382  {
384  }
385 
386  $obj_id = "objsub_".$item_id;
387  $data["set"][$user_id][$obj_id] = $status;
388  }
389  }
390  }
391 
392  // percentage export
393  if($data["set"])
394  {
395  $this->perc_map = array();
396  foreach($data["set"] as $row_idx => $row)
397  {
398  foreach($row as $column => $value)
399  {
400  if(substr($column, -5) == "_perc")
401  {
402  $obj_id = explode("_", $column);
403  $obj_id = (int)$obj_id[1];
404 
405  // #18673
406  if(!$this->isPercentageAvailable($obj_id) ||
407  !(int)$value)
408  {
409  unset($data["set"][$row_idx][$column]);
410  }
411  else
412  {
413  $this->perc_map[$obj_id] = true;
414  }
415  }
416  }
417  }
418  }
419 
420  $this->setMaxCount($data["cnt"]);
421  $this->setData($data["set"]);
422 
423  return $collection["object_ids"];
424  }
425  return false;
426  }
427 
428  function fillRow(array $a_set)
429  {
430  global $lng;
431 
432  if($this->has_multi)
433  {
434  $this->tpl->setVariable("USER_ID", $a_set["usr_id"]);
435  }
436 
437  foreach ($this->getSelectedColumns() as $c)
438  {
439  switch($c)
440  {
441  case (substr($c, 0, 4) == "obj_"):
442  $obj_id = substr($c, 4);
443 
444  // object without read-lp-permission
445  if(in_array($obj_id, $this->privacy_cols) ||
446  $a_set["privacy_conflict"])
447  {
448  $this->tpl->setCurrentBlock("objects");
449  $this->tpl->setVariable("VAL_STATUS", "&nbsp;");
450  $this->tpl->parseCurrentBlock();
451  continue;
452  }
453 
454  $status = isset($a_set[$c])
455  ? (int)$a_set[$c]
457  $percentage = isset($a_set[$c."_perc"])
458  ? (int)$a_set[$c."_perc"]
459  : null;
460 
462  {
463  $timing = $this->showTimingsWarning($this->ref_ids[$obj_id], $a_set["usr_id"]);
464  if($timing)
465  {
466  if($timing !== true)
467  {
468  $timing = ": ".ilDatePresentation::formatDate(new ilDate($timing, IL_CAL_UNIX));
469  }
470  else
471  {
472  $timing = "";
473  }
474  $this->tpl->setCurrentBlock('warning_img');
475  $this->tpl->setVariable('WARNING_IMG', ilUtil::getImagePath('time_warn.svg'));
476  $this->tpl->setVariable('WARNING_ALT', $this->lng->txt('trac_time_passed').$timing);
477  $this->tpl->parseCurrentBlock();
478  }
479  }
480 
481  $this->tpl->setCurrentBlock("objects");
482  $this->tpl->setVariable("VAL_STATUS", $this->parseValue("status", $status, ""));
483  $this->tpl->setVariable("VAL_PERCENTAGE", $this->parseValue("percentage", $percentage, ""));
484  $this->tpl->parseCurrentBlock();
485  break;
486 
487 
488  case (substr($c, 0, 6) == "objtv_"):
489  case (substr($c, 0, 7) == "objsco_"):
490  case (substr($c, 0, 7) == "objsub_"):
491  $status = isset($a_set[$c])
492  ? (int)$a_set[$c]
494 
495  $this->tpl->setCurrentBlock("objects");
496  if(!$a_set["privacy_conflict"])
497  {
498  $this->tpl->setVariable("VAL_STATUS", $this->parseValue("status", $status, ""));
499  }
500  else
501  {
502  $this->tpl->setVariable("VAL_STATUS", "&nbsp;");
503  }
504  $this->tpl->parseCurrentBlock();
505  break;
506 
507  default:
508  $this->tpl->setCurrentBlock("user_field");
509  if(!$a_set["privacy_conflict"])
510  {
511  $this->tpl->setVariable("VAL_UF", $this->parseValue($c, $a_set[$c], ""));
512  }
513  else
514  {
515  $this->tpl->setVariable("VAL_UF", "&nbsp;");
516  }
517  $this->tpl->parseCurrentBlock();
518  break;
519  }
520  }
521 
522  // #7694
523  if(!$a_set["active"] || $a_set["privacy_conflict"])
524  {
525  $mess = array();
526  if($a_set["privacy_conflict"])
527  {
528  $mess[] = $lng->txt("status_no_permission");
529  }
530  else if(!$a_set["active"])
531  {
532  $mess[] = $lng->txt("inactive");
533  }
534  $this->tpl->setCurrentBlock('inactive_bl');
535  $this->tpl->setVariable('TXT_INACTIVE', implode(", ", $mess));
536  $this->tpl->parseCurrentBlock();
537  }
538 
539  $login = !$a_set["privacy_conflict"]
540  ? $a_set["login"]
541  : "&nbsp;";
542  $this->tpl->setVariable("VAL_LOGIN", $login);
543  }
544 
545  protected function fillHeaderExcel($worksheet, &$a_row)
546  {
547  global $ilObjDataCache;
548 
549  $worksheet->write($a_row, 0, $this->lng->txt("login"));
550 
551  $labels = $this->getSelectableColumns();
552  $cnt = 1;
553  foreach ($this->getSelectedColumns() as $c)
554  {
555  if(substr($c, 0, 4) == "obj_")
556  {
557  $obj_id = substr($c, 4);
558  $type = $ilObjDataCache->lookupType($obj_id);
559  $worksheet->write($a_row, $cnt, "(".$this->lng->txt($type).") ".$labels[$c]["txt"]);
560 
561  if(is_array($this->perc_map) && $this->perc_map[$obj_id])
562  {
563  $cnt++;
564  $worksheet->write($a_row, $cnt, $this->lng->txt("trac_percentage")." (%)");
565  }
566  }
567  else
568  {
569  $worksheet->write($a_row, $cnt, $labels[$c]["txt"]);
570  }
571  $cnt++;
572  }
573  }
574 
575  protected function fillRowExcel($worksheet, &$a_row, $a_set)
576  {
577  $worksheet->write($a_row, 0, $a_set["login"]);
578 
579  $cnt = 1;
580  foreach ($this->getSelectedColumns() as $c)
581  {
582  switch($c)
583  {
584  case (substr($c, 0, 4) == "obj_"):
585  $obj_id = substr($c, 4);
586  $val = ilLearningProgressBaseGUI::_getStatusText((int)$a_set[$c]);
587  $worksheet->write($a_row, $cnt, $val);
588 
589  if(is_array($this->perc_map) && $this->perc_map[$obj_id])
590  {
591  $cnt++;
592  $perc = (int)$a_set[$c."_perc"];
593  if(!$perc)
594  {
595  $perc = null;
596  }
597  $worksheet->write($a_row, $cnt, $perc);
598  }
599  break;
600 
601  case (substr($c, 0, 6) == "objtv_"):
602  case (substr($c, 0, 7) == "objsco_"):
603  case (substr($c, 0, 7) == "objsub_"):
604  $val = ilLearningProgressBaseGUI::_getStatusText((int)$a_set[$c]);
605  $worksheet->write($a_row, $cnt, $val);
606  break;
607 
608  /* #14142
609  case "last_access":
610  case "spent_seconds":
611  case "status_changed":
612  */
613  default:
614  $val = $this->parseValue($c, $a_set[$c], "user");
615  $worksheet->write($a_row, $cnt, $val);
616  break;
617 
618  }
619  $cnt++;
620  }
621  }
622 
623  protected function fillHeaderCSV($a_csv)
624  {
625  global $ilObjDataCache;
626 
627  $a_csv->addColumn($this->lng->txt("login"));
628 
629  $labels = $this->getSelectableColumns();
630  foreach ($this->getSelectedColumns() as $c)
631  {
632  if(substr($c, 0, 4) == "obj_")
633  {
634  $obj_id = substr($c, 4);
635  $type = $ilObjDataCache->lookupType($obj_id);
636  $a_csv->addColumn("(".$this->lng->txt($type).") ".$labels[$c]["txt"]);
637 
638  if(is_array($this->perc_map) && $this->perc_map[$obj_id])
639  {
640  $a_csv->addColumn($this->lng->txt("trac_percentage")." (%)");
641  }
642  }
643  else
644  {
645  $a_csv->addColumn($labels[$c]["txt"]);
646  }
647  }
648 
649  $a_csv->addRow();
650  }
651 
652  protected function fillRowCSV($a_csv, $a_set)
653  {
654  $a_csv->addColumn($a_set["login"]);
655 
656  foreach ($this->getSelectedColumns() as $c)
657  {
658  switch($c)
659  {
660  case (substr($c, 0, 4) == "obj_"):
661  $obj_id = substr($c, 4);
662  $val = ilLearningProgressBaseGUI::_getStatusText((int)$a_set[$c]);
663  $a_csv->addColumn($val);
664 
665  if(is_array($this->perc_map) && $this->perc_map[$obj_id])
666  {
667  $perc = (int)$a_set[$c."_perc"];
668  if(!$perc)
669  {
670  $perc = null;
671  }
672  $a_csv->addColumn($perc);
673  }
674  break;
675 
676  case (substr($c, 0, 6) == "objtv_"):
677  case (substr($c, 0, 7) == "objsco_"):
678  case (substr($c, 0, 7) == "objsub_"):
679  $val = ilLearningProgressBaseGUI::_getStatusText((int)$a_set[$c]);
680  $a_csv->addColumn($val);
681  break;
682 
683  /* #14142
684  case "last_access":
685  case "spent_seconds":
686  case "status_changed":
687  */
688  default:
689  $val = $this->parseValue($c, $a_set[$c], "user");
690  $a_csv->addColumn($val);
691  break;
692 
693  }
694  }
695 
696  $a_csv->addRow();
697  }
698 }
699 
700 ?>
const LP_STATUS_COMPLETED_NUM
Creates a path for a start and endnode.
getSelectableUserColumns($a_in_course=false, $a_in_group=false)
static _getIcon($a_obj_id="", $a_size="big", $a_type="", $a_offline=false)
Get icon for repository item.
static lookupObjectiveTitle($a_objective_id, $a_add_description=false)
setDefaultOrderField($a_defaultorderfield)
Set Default order field.
setExportFormats(array $formats)
Set available export formats.
addFilterItemByMetaType($id, $type=self::FILTER_TEXT, $a_optional=false, $caption=NULL)
Add filter by standard type.
$_GET["client_id"]
fillHeaderExcel($worksheet, &$a_row)
setShowTemplates($a_value)
Toggle templates.
__construct($a_parent_obj, $a_parent_cmd, $ref_id)
Constructor.
static getSubItemType($a_parent_obj_id)
Get sub-item object type for parent.
const LP_STATUS_IN_PROGRESS_NUM
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.
getItems(array $a_user_fields, array $a_privary_fields=null)
Class for single dates.
TableGUI class for learning progress.
static getImagePath($img, $module_path="", $mode="output", $offline=false)
get image path (for images located in a template directory)
Class Mail this class handles base functions for mail handling.
static _lookupObjId($a_id)
_getStatusText($a_status, $a_lng=null)
Get status alt text.
addMultiCommand($a_cmd, $a_text)
Add Command button.
getSelectedColumns()
Get selected columns.
SetFilterValue(ilFormPropertyGUI $a_item, $a_value)
Set current filter value.
setRowTemplate($a_template, $a_template_dir="")
Set row template.
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.
global $ilUser
Definition: imgupload.php:15
$ref_id
Definition: sahs_server.php:39
global $lng
Definition: privfeed.php:40
showTimingsWarning($a_ref_id, $a_user_id)
$path
Definition: index.php:22
fillRowExcel($worksheet, &$a_row, $a_set)
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.
setEnableHeader($a_enableheader)
Set Enable Header.
static _getInstance()
Get instance of ilPrivacySettings.
setMaxCount($a_max_count)
set max.
if(! $in) $columns
Definition: Utf8Test.php:46
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.
setLimit($a_limit=0, $a_default_limit=0)
const LP_STATUS_FAILED_NUM