ILIAS  release_7 Revision v7.30-3-g800a261c036
class.ilTrUserObjectsPropsTableGUI.php
Go to the documentation of this file.
1 <?php
18 include_once("./Services/Tracking/classes/class.ilLPTableBaseGUI.php");
19 
30 {
34  public function __construct($a_parent_obj, $a_parent_cmd, $a_user_id, $a_obj_id, $a_ref_id, $a_print_view = false)
35  {
36  global $DIC;
37 
38  $ilCtrl = $DIC['ilCtrl'];
39  $lng = $DIC['lng'];
40  $ilAccess = $DIC['ilAccess'];
41  $lng = $DIC['lng'];
42  $rbacsystem = $DIC['rbacsystem'];
43 
44  $this->setId("truop");
45  $this->user_id = $a_user_id;
46  $this->obj_id = $a_obj_id;
47  $this->ref_id = $a_ref_id;
48 
49  parent::__construct($a_parent_obj, $a_parent_cmd);
50  $this->setLimit(9999);
51 
52  $this->parseTitle($this->obj_id, "details", $this->user_id);
53 
54  if ($a_print_view) {
55  $this->setPrintMode(true);
56  }
57 
58  $this->addColumn($this->lng->txt("title"), "title");
59 
60  foreach ($this->getSelectedColumns() as $c) {
61  $l = $c;
62  if (in_array($l, array("last_access", "first_access", "read_count", "spent_seconds", "mark", "status", "percentage"))) {
63  $l = "trac_" . $l;
64  }
65  if ($l == "u_comment") {
66  $l = "trac_comment";
67  }
68  $this->addColumn($this->lng->txt($l), $c);
69  }
70 
71  if (!$this->getPrintMode()) {
72  $this->addColumn($this->lng->txt("actions"), "");
73  }
74 
75  $this->setExternalSorting(true);
76  $this->setExternalSegmentation(true);
77  $this->setEnableHeader(true);
78  $this->setFormAction($ilCtrl->getFormActionByClass(get_class($this)));
79  $this->setRowTemplate("tpl.user_objects_props_row.html", "Services/Tracking");
80  $this->setEnableTitle(true);
81  $this->setDefaultOrderField("title");
82  $this->setDefaultOrderDirection("asc");
83  $this->setShowTemplates(true);
84 
85  $this->setExportFormats(array(self::EXPORT_CSV, self::EXPORT_EXCEL));
86 
87  $this->initFilter();
88 
89  $this->getItems();
90  }
91 
98  public function getSelectableColumns()
99  {
100  global $DIC;
101 
102  $lng = $DIC['lng'];
103 
104  // default fields
105  $cols = array();
106 
107  include_once 'Services/Tracking/classes/class.ilObjUserTracking.php';
108  $tracking = new ilObjUserTracking();
109  if ($tracking->hasExtendedData(ilObjUserTracking::EXTENDED_DATA_LAST_ACCESS)) {
110  $cols["first_access"] = array(
111  "txt" => $lng->txt("trac_first_access"),
112  "default" => true);
113  $cols["last_access"] = array(
114  "txt" => $lng->txt("trac_last_access"),
115  "default" => true);
116  }
117  if ($tracking->hasExtendedData(ilObjUserTracking::EXTENDED_DATA_READ_COUNT)) {
118  $cols["read_count"] = array(
119  "txt" => $lng->txt("trac_read_count"),
120  "default" => true);
121  }
122  if ($tracking->hasExtendedData(ilObjUserTracking::EXTENDED_DATA_SPENT_SECONDS)) {
123  $cols["spent_seconds"] = array(
124  "txt" => $lng->txt("trac_spent_seconds"),
125  "default" => true);
126  }
127 
128  // #15334 - parent object does not matter, sub-objects may have percentage
129  $cols["percentage"] = array(
130  "txt" => $lng->txt("trac_percentage"),
131  "default" => true);
132 
133  $cols["status"] = array(
134  "txt" => $lng->txt("trac_status"),
135  "default" => true);
136  $cols["mark"] = array(
137  "txt" => $lng->txt("trac_mark"),
138  "default" => true);
139  $cols["u_comment"] = array(
140  "txt" => $lng->txt("trac_comment"),
141  "default" => false);
142 
143  return $cols;
144  }
145 
149  public function getItems()
150  {
151  global $DIC;
152 
153  $rbacsystem = $DIC['rbacsystem'];
154 
155  $this->determineOffsetAndOrder();
156 
157  $additional_fields = $this->getSelectedColumns();
158 
159  include_once("./Services/Tracking/classes/class.ilTrQuery.php");
160 
162  $this->user_id,
163  $this->obj_id,
164  $this->ref_id,
168  ilUtil::stripSlashes($this->getLimit()),
169  $this->filter,
170  $additional_fields,
171  $this->filter["view_mode"]
172  );
173 
174  if (count($tr_data["set"]) == 0 && $this->getOffset() > 0) {
175  $this->resetOffset();
177  $this->user_id,
178  $this->obj_id,
179  $this->ref_id,
183  ilUtil::stripSlashes($this->getLimit()),
184  $this->filter,
185  $additional_fields,
186  $this->filter["view_mode"]
187  );
188  }
189 
190  // #13807
191  foreach ($tr_data["set"] as $idx => $row) {
192  include_once './Services/Tracking/classes/class.ilLearningProgressAccess.php';
193  if ($row["ref_id"] &&
194  !ilLearningProgressAccess::checkPermission('read_learning_progress', $row['ref_id'])) {
195  foreach (array_keys($row) as $col_id) {
196  if (!in_array($col_id, array("type", "obj_id", "ref_id", "title", "sort_title"))) {
197  $tr_data["set"][$idx][$col_id] = null;
198  }
199  }
200  $tr_data["set"][$idx]["privacy_conflict"] = true;
201  }
202  }
203 
204  $this->setMaxCount($tr_data["cnt"]);
205 
206  if ($this->getOrderField() == "title") {
207  // sort alphabetically, move parent object to 1st position
208  $set = array();
209  $parent = false;
210  foreach ($tr_data["set"] as $idx => $row) {
211  if ($row['obj_id'] == $this->obj_id) {
212  $parent = $row;
213  } elseif (isset($row["sort_title"])) {
214  $set[strtolower($row["sort_title"]) . "__" . $idx] = $row;
215  } else {
216  $set[strtolower($row["title"]) . "__" . $idx] = $row;
217  }
218  }
219  unset($tr_data["set"]);
220  if ($this->getOrderDirection() == "asc") {
221  ksort($set);
222  } else {
223  krsort($set);
224  }
225  $set = array_values($set);
226  if ($parent) {
227  array_unshift($set, $parent);
228  }
229 
230  $this->setData($set);
231  } else {
232  $this->setData($tr_data["set"]);
233  }
234  }
235 
239  public function initFilter()
240  {
241  global $DIC;
242 
243  $lng = $DIC['lng'];
244 
245  // for scorm and objectives this filter does not make sense / is not implemented
246  include_once './Services/Object/classes/class.ilObjectLP.php';
247  $olp = ilObjectLP::getInstance($this->obj_id);
248  $collection = $olp->getCollectionInstance();
249  if ($collection instanceof ilLPCollectionOfRepositoryObjects) {
250  include_once("./Services/Form/classes/class.ilSubEnabledFormPropertyGUI.php");
251  include_once("./Services/Table/interfaces/interface.ilTableFilterItem.php");
252 
253  // show collection only/all
254  include_once("./Services/Form/classes/class.ilRadioGroupInputGUI.php");
255  include_once("./Services/Form/classes/class.ilRadioOption.php");
256  $ti = new ilRadioGroupInputGUI($lng->txt("trac_view_mode"), "view_mode");
257  $ti->addOption(new ilRadioOption($lng->txt("trac_view_mode_all"), ""));
258  $ti->addOption(new ilRadioOption($lng->txt("trac_view_mode_collection"), "coll"));
259  $this->addFilterItem($ti);
260  $ti->readFromSession();
261  $this->filter["view_mode"] = $ti->getValue();
262  }
263  }
264 
268  protected function fillRow($data)
269  {
270  global $DIC;
272 
273  $ilCtrl = $DIC['ilCtrl'];
274  $lng = $DIC['lng'];
275  $rbacsystem = $DIC['rbacsystem'];
276 
277  if (!$this->isPercentageAvailable($data["obj_id"])) {
278  $data["percentage"] = null;
279  }
280 
281  foreach ($this->getSelectedColumns() as $c) {
282  if (!$data["privacy_conflict"]) {
283  $val = (trim($data[$c]) == "")
284  ? " "
285  : $data[$c];
286 
287  if ($data[$c] != "" || $c == "status") {
288  switch ($c) {
289  case "first_access":
291  break;
292 
293  case "last_access":
295  break;
296 
297  case "status":
298  $val = $icons->renderIconForStatus((int) $data[$c]);
299 
300  if ($data["ref_id"] &&
301  $data["type"] != "lobj" &&
302  $data["type"] != "sco" &&
303  $data["type"] != "st" &&
304  $data["type"] != "mob") {
305  $timing = $this->showTimingsWarning($data["ref_id"], $this->user_id);
306  if ($timing) {
307  if ($timing !== true) {
308  $timing = ": " . ilDatePresentation::formatDate(new ilDate($timing, IL_CAL_UNIX));
309  } else {
310  $timing = "";
311  }
312  $this->tpl->setCurrentBlock('warning_img');
313  $this->tpl->setVariable('WARNING_IMG', ilUtil::getImagePath('time_warn.svg'));
314  $this->tpl->setVariable('WARNING_ALT', $this->lng->txt('trac_time_passed') . $timing);
315  $this->tpl->parseCurrentBlock();
316  }
317  }
318  break;
319 
320  case "spent_seconds":
321  if (!ilObjectLP::supportsSpentSeconds($data["type"])) {
322  $val = "-";
323  } else {
324  $val = ilDatePresentation::secondsToString($data[$c], ($data[$c] < 3600 ? true : false)); // #14858
325  }
326  break;
327 
328  case "percentage":
329  $val = $data[$c] . "%";
330  break;
331 
332  }
333  }
334  if ($c == "mark" &&
335  !ilObjectLP::supportsMark($this->type)) {
336  $val = "-";
337  }
338  if ($c == "spent_seconds" &&
339  !ilObjectLP::supportsSpentSeconds($this->type)) {
340  $val = "-";
341  }
342  if ($c == "percentage" &&
343  !$this->isPercentageAvailable($data["obj_id"])) {
344  $val = "-";
345  }
346  } else {
347  $val = "&nbsp;";
348  }
349 
350  $this->tpl->setCurrentBlock("user_field");
351  $this->tpl->setVariable("VAL_UF", $val);
352  $this->tpl->parseCurrentBlock();
353  }
354 
355  if ($data["privacy_conflict"]) {
356  $this->tpl->setCurrentBlock("permission_bl");
357  $this->tpl->setVariable("TXT_NO_PERMISSION", $lng->txt("status_no_permission"));
358  $this->tpl->parseCurrentBlock();
359  }
360 
361  if ($data["title"] == "") {
362  $data["title"] = "--" . $lng->txt("none") . "--";
363  }
364  $this->tpl->setVariable("ICON", ilObject::_getIcon("", "tiny", $data["type"]));
365  $this->tpl->setVariable("ICON_ALT", $lng->txt($data["type"]));
366 
367  if (in_array($data['type'], array('fold', 'grp')) && $data['obj_id'] != $this->obj_id) {
368  if ($data['type'] == 'fold') {
369  $object_gui = 'ilobjfoldergui';
370  } else {
371  $object_gui = 'ilobjgroupgui';
372  }
373  $this->tpl->setCurrentBlock('title_linked');
374 
375  // link structure gets too complicated
376  if ($_GET["baseClass"] != "ilDashboardGUI" && $_GET["baseClass"] != "ilAdministrationGUI") {
377  $old = $ilCtrl->getParameterArrayByClass('illplistofobjectsgui');
378  $ilCtrl->setParameterByClass('illplistofobjectsgui', 'ref_id', $data["ref_id"]);
379  $ilCtrl->setParameterByClass('illplistofobjectsgui', 'details_id', $data["ref_id"]);
380  $ilCtrl->setParameterByClass('illplistofobjectsgui', 'user_id', $this->user_id);
381  $url = $ilCtrl->getLinkTargetByClass(array('ilrepositorygui', $object_gui, 'illearningprogressgui', 'illplistofobjectsgui'), 'userdetails');
382  $ilCtrl->setParameterByClass('illplistofobjectsgui', 'ref_id', $old["ref_id"]);
383  $ilCtrl->setParameterByClass('illplistofobjectsgui', 'details_id', $old["details_id"]);
384  $ilCtrl->setParameterByClass('illplistofobjectsgui', 'user_id', $old["user_id"]);
385  } else {
386  $url = "#";
387  }
388 
389  $this->tpl->setVariable("URL_TITLE", $url);
390  $this->tpl->setVariable("VAL_TITLE", $data["title"]);
391  $this->tpl->parseCurrentBlock();
392  } else {
393  $this->tpl->setCurrentBlock('title_plain');
394  $this->tpl->setVariable("VAL_TITLE", $data["title"]);
395  $this->tpl->parseCurrentBlock();
396  }
397 
398  // #16453 / #17163
399  if ($data['ref_id']) {
400  include_once './Services/Tree/classes/class.ilPathGUI.php';
401  $path = new ilPathGUI();
402  $path = $path->getPath($this->ref_id, $data['ref_id']);
403  if ($path) {
404  $this->tpl->setVariable('COLL_PATH', $this->lng->txt('path') . ': ' . $path);
405  }
406  }
407 
408  // #13807 / #17069
409  include_once './Services/Tracking/classes/class.ilLearningProgressAccess.php';
410  if ($data["ref_id"] &&
411  ilLearningProgressAccess::checkPermission('edit_learning_progress', $data['ref_id'])) {
412  if (!in_array($data["type"], array("sco", "lobj")) && !$this->getPrintMode()) {
413  $this->tpl->setCurrentBlock("item_command");
414  $ilCtrl->setParameterByClass("illplistofobjectsgui", "userdetails_id", $data["ref_id"]);
415  $this->tpl->setVariable("HREF_COMMAND", $ilCtrl->getLinkTargetByClass("illplistofobjectsgui", 'edituser'));
416  $this->tpl->setVariable("TXT_COMMAND", $lng->txt('edit'));
417  $ilCtrl->setParameterByClass("illplistofobjectsgui", "userdetails_id", "");
418  $this->tpl->parseCurrentBlock();
419  }
420  }
421  }
422 
423  protected function fillHeaderExcel(ilExcel $a_excel, &$a_row)
424  {
425  $a_excel->setCell($a_row, 0, $this->lng->txt("type"));
426  $a_excel->setCell($a_row, 1, $this->lng->txt("title"));
427 
428  $labels = $this->getSelectableColumns();
429  $cnt = 2;
430  foreach ($this->getSelectedColumns() as $c) {
431  $a_excel->setCell($a_row, $cnt++, $labels[$c]["txt"]);
432  }
433 
434  $a_excel->setBold("A" . $a_row . ":" . $a_excel->getColumnCoord($cnt - 1) . $a_row);
435  }
436 
437  protected function fillRowExcel(ilExcel $a_excel, &$a_row, $a_set)
438  {
439  $a_excel->setCell($a_row, 0, $this->lng->txt($a_set["type"]));
440  $a_excel->setCell($a_row, 1, $a_set["title"]);
441 
442  $cnt = 2;
443  foreach ($this->getSelectedColumns() as $c) {
444  if ($c != 'status') {
445  $val = $this->parseValue($c, $a_set[$c], $this->type);
446  } else {
447  $val = ilLearningProgressBaseGUI::_getStatusText((int) $a_set[$c]);
448  }
449  $a_excel->setCell($a_row, $cnt++, $val);
450  }
451  }
452 
453  protected function fillHeaderCSV($a_csv)
454  {
455  $a_csv->addColumn($this->lng->txt("type"));
456  $a_csv->addColumn($this->lng->txt("title"));
457 
458  $labels = $this->getSelectableColumns();
459  foreach ($this->getSelectedColumns() as $c) {
460  $a_csv->addColumn($labels[$c]["txt"]);
461  }
462 
463  $a_csv->addRow();
464  }
465 
466  protected function fillRowCSV($a_csv, $a_set)
467  {
468  $a_csv->addColumn($this->lng->txt($a_set["type"]));
469  $a_csv->addColumn($a_set["title"]);
470 
471  foreach ($this->getSelectedColumns() as $c) {
472  if ($c != 'status') {
473  $val = $this->parseValue($c, $a_set[$c], $this->type);
474  } else {
475  $val = ilLearningProgressBaseGUI::_getStatusText((int) $a_set[$c]);
476  }
477  $a_csv->addColumn($val);
478  }
479 
480  $a_csv->addRow();
481  }
482 }
static _getIcon( $a_obj_id="", $a_size="big", $a_type="", $a_offline=false)
Get icon for repository item.
Creates a path for a start and endnode.
This class represents an option in a radio group.
setExternalSorting($a_val)
Set external sorting.
setDefaultOrderField($a_defaultorderfield)
Set Default order field.
setExportFormats(array $formats)
Set available export formats.
const IL_CAL_DATETIME
$c
Definition: cli.php:37
setPrintMode($a_value=false)
Toogle print mode.
$_GET["client_id"]
setShowTemplates($a_value)
Toggle templates.
static _getStatusText($a_status, $a_lng=null)
Get status alt text.
setExternalSegmentation($a_val)
Set external segmentation.
resetOffset($a_in_determination=false)
Reset offset.
static getInstance(int $variant=ilLPStatusIcons::ICON_VARIANT_DEFAULT, ?\ILIAS\UI\Renderer $renderer=null, ?\ILIAS\UI\Factory $factory=null)
fillRowExcel(ilExcel $a_excel, &$a_row, $a_set)
__construct($a_parent_obj, $a_parent_cmd, $a_user_id, $a_obj_id, $a_ref_id, $a_print_view=false)
Constructor.
addFilterItem($a_input_item, $a_optional=false)
Add filter item.
parseTitle($a_obj_id, $action, $a_user_id=false)
const IL_CAL_UNIX
parseValue($id, $value, $type)
getOrderDirection()
Get order direction.
static checkPermission($a_permission, $a_ref_id, $a_user_id=null)
wrapper for rbac access checks
static formatDate(ilDateTime $date, $a_skip_day=false, $a_include_wd=false, $include_seconds=false)
Format a date public.
setId($a_val)
Set id.
setDefaultOrderDirection($a_defaultorderdirection)
Set Default order direction.
This class represents a property in a property form.
addOption($a_option)
Add Option.
static secondsToString($seconds, $force_with_seconds=false, $a_lng=null)
converts seconds to string: Long: 7 days 4 hour(s) ...
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.
getOffset()
Get offset.
static getImagePath($img, $module_path="", $mode="output", $offline=false)
get image path (for images located in a template directory)
global $DIC
Definition: goto.php:24
getSelectedColumns()
Get selected columns.
setCell($a_row, $a_col, $a_value, $a_datatype=null)
Set cell value.
static stripSlashes($a_str, $a_strip_html=true, $a_allow="")
strip slashes if magic qoutes is enabled
setRowTemplate($a_template, $a_template_dir="")
Set row template.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static supportsMark($a_obj_type)
determineOffsetAndOrder($a_omit_offset=false)
Determine offset and order.
setFormAction($a_form_action, $a_multipart=false)
Set Form action parameter.
static supportsSpentSeconds($a_obj_type)
static getObjectsDataForUser( $a_user_id, $a_parent_obj_id, $a_parent_ref_id, $a_order_field="", $a_order_dir="", $a_offset=0, $a_limit=9999, array $a_filters=null, array $a_additional_fields=null, $use_collection=true)
Get all object-based tracking data for user and parent object.
__construct(Container $dic, ilPlugin $plugin)
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.
getPrintMode()
Get print mode.
setEnableHeader($a_enableheader)
Set Enable Header.
$url
getLimit()
Get limit.
filter()
Definition: filter.php:2
setMaxCount($a_max_count)
set max.
setEnableTitle($a_enabletitle)
Set Enable Title.
static getInstance($a_obj_id)
$cols
Definition: xhr_table.php:11
setLimit($a_limit=0, $a_default_limit=0)