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
4include_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
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";
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";
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?>
if(! $in) $columns
Definition: Utf8Test.php:46
$_GET["client_id"]
const IL_CAL_UNIX
static lookupObjectiveTitle($a_objective_id, $a_add_description=false)
Class for single dates.
const LP_STATUS_COMPLETED_NUM
const LP_STATUS_IN_PROGRESS_NUM
const LP_STATUS_NOT_ATTEMPTED_NUM
const LP_STATUS_FAILED_NUM
TableGUI class for learning progress.
parseValue($id, $value, $type)
showTimingsWarning($a_ref_id, $a_user_id)
getSelectableUserColumns($a_in_course=false, $a_in_group=false)
parseTitle($a_obj_id, $action, $a_user_id=false)
static checkPermission($a_permission, $a_ref_id, $a_user_id=null)
wrapper for rbac access checks
_getStatusText($a_status, $a_lng=null)
Get status alt text.
Class Mail this class handles base functions for mail handling.
static _lookupObjId($a_id)
static _getIcon($a_obj_id="", $a_size="big", $a_type="", $a_offline=false)
Get icon for repository item.
static _lookupType($a_id, $a_reference=false)
lookup object type
Creates a path for a start and endnode.
static _getInstance()
Get instance of ilPrivacySettings.
getSelectedColumns()
Get selected columns.
setEnableHeader($a_enableheader)
Set Enable Header.
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.
setExportFormats(array $formats)
Set available export formats.
SetFilterValue(ilFormPropertyGUI $a_item, $a_value)
Set current filter value.
setData($a_data)
set table data @access public
setRowTemplate($a_template, $a_template_dir="")
Set row template.
setLimit($a_limit=0, $a_default_limit=0)
set max.
addMultiCommand($a_cmd, $a_text)
Add Command button.
setDefaultOrderField($a_defaultorderfield)
Set Default order field.
setId($a_val)
Set id.
setFormAction($a_form_action, $a_multipart=false)
Set Form action parameter.
addFilterItemByMetaType($id, $type=self::FILTER_TEXT, $a_optional=false, $caption=NULL)
Add filter by standard type.
setDefaultOrderDirection($a_defaultorderdirection)
Set Default order direction.
setShowTemplates($a_value)
Toggle templates.
setMaxCount($a_max_count)
set max.
fillHeaderExcel($worksheet, &$a_row)
Excel Version of Fill Header.
fillRowExcel($worksheet, &$a_row, $a_set)
Excel Version of Fill Row.
fillRowCSV($a_csv, $a_set)
CSV Version of Fill Row.
fillHeaderCSV($a_csv)
CSV Version of Fill Header.
__construct($a_parent_obj, $a_parent_cmd, $ref_id)
Constructor.
getItems(array $a_user_fields, array $a_privary_fields=null)
getSelectableColumns()
Get selectable columns.
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.
static getUserObjectiveMatrix($a_parent_obj_id, $a_users)
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 getSubItemType($a_parent_obj_id)
Get sub-item object type for parent.
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...
static getImagePath($img, $module_path="", $mode="output", $offline=false)
get image path (for images located in a template directory)
global $ilCtrl
Definition: ilias.php:18
global $lng
Definition: privfeed.php:40
$ref_id
Definition: sahs_server.php:39
$path
Definition: index.php:22
global $ilUser
Definition: imgupload.php:15