ILIAS  release_5-2 Revision v5.2.25-18-g3f80b828510
class.ilTrSummaryTableGUI.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 
16 {
20  function __construct($a_parent_obj, $a_parent_cmd, $a_ref_id, $a_print_mode = false)
21  {
22  global $ilCtrl, $objDefinition;
23 
24  $this->setId("trsmy");
25 
26  $this->ref_id = $a_ref_id;
27  $this->obj_id = ilObject::_lookupObjId($a_ref_id);
28  $this->is_root = ($a_ref_id == ROOT_FOLDER_ID);
29 
30  if(!$this->is_root)
31  {
32  // #17084 - are we multi-object or not?
33  // we cannot parse type filter (too complicated)
34  $type = ilObject::_lookupType($this->obj_id);
35  if(!$objDefinition->isContainer($type))
36  {
37  $this->type = $type;
38  include_once './Services/Object/classes/class.ilObjectLP.php';
39  $this->olp = ilObjectLP::getInstance($this->obj_id);
40  }
41  }
42 
43  parent::__construct($a_parent_obj, $a_parent_cmd);
44 
45  if($a_print_mode)
46  {
47  $this->setPrintMode(true);
48  }
49 
50  $this->parseTitle($this->obj_id, "trac_summary");
51  $this->setLimit(9999);
52  $this->setShowTemplates(true);
53  $this->setExportFormats(array(self::EXPORT_CSV, self::EXPORT_EXCEL));
54 
55  $this->addColumn($this->lng->txt("title"), "title");
56  $this->setDefaultOrderField("title");
57 
58  $labels = $this->getSelectableColumns();
59  foreach ($this->getSelectedColumns() as $c)
60  {
61  $this->addColumn($labels[$c]["txt"], $c);
62  }
63 
64  if($this->is_root)
65  {
66  $this->addColumn($this->lng->txt("path"));
67  $this->addColumn($this->lng->txt("action"));
68  }
69 
70 
71  // $this->setExternalSorting(true);
72  $this->setEnableHeader(true);
73  $this->setFormAction($ilCtrl->getFormActionByClass(get_class($this)));
74  $this->setRowTemplate("tpl.trac_summary_row.html", "Services/Tracking");
75  $this->initFilter();
76 
77  $this->getItems($a_parent_obj->getObjId(), $a_ref_id);
78  }
79 
81  {
82  global $lng, $ilSetting;
83 
84  $lng_map = array("user_total" => "users", "first_access_min" => "trac_first_access",
85  "last_access_max" => "trac_last_access", "mark" => "trac_mark", "status" => "trac_status",
86  'status_changed_max' => 'trac_status_changed',
87  "spent_seconds_avg" => "trac_spent_seconds", "percentage_avg" => "trac_percentage",
88  "read_count_sum" => "trac_read_count", "read_count_avg" => "trac_read_count",
89  "read_count_spent_seconds_avg" => "trac_read_count_spent_seconds"
90  );
91 
92 
93  $all = array("user_total");
94  $default = array();
95 
96  // show only if extended data was activated in lp settings
97  include_once 'Services/Tracking/classes/class.ilObjUserTracking.php';
98  $tracking = new ilObjUserTracking();
99  if($tracking->hasExtendedData(ilObjUserTracking::EXTENDED_DATA_READ_COUNT))
100  {
101  $all[] = "read_count_sum";
102  $all[] = "read_count_avg";
103  $default[] = "read_count_sum";
104  }
105  if($tracking->hasExtendedData(ilObjUserTracking::EXTENDED_DATA_SPENT_SECONDS))
106  {
107  if($this->is_root || !$this->type || ilObjectLP::supportsSpentSeconds($this->type))
108  {
109  $all[] = "spent_seconds_avg";
110  $default[] = "spent_seconds_avg";
111  }
112  }
113  if($tracking->hasExtendedData(ilObjUserTracking::EXTENDED_DATA_READ_COUNT) &&
114  $tracking->hasExtendedData(ilObjUserTracking::EXTENDED_DATA_SPENT_SECONDS))
115  {
116  if($this->is_root || !$this->type || ilObjectLP::supportsSpentSeconds($this->type))
117  {
118  $all[] = "read_count_spent_seconds_avg";
119  // $default[] = "read_count_spent_seconds_avg";
120  }
121  }
122 
123 
124  if($this->is_root || !$this->type || $this->isPercentageAvailable($this->obj_id))
125  {
126  $all[] = "percentage_avg";
127  }
128 
129  if($this->is_root || !$this->olp || $this->olp->isActive())
130  {
131  $all[] = "status";
132  $all[] = 'status_changed_max';
133  }
134 
135  if($this->is_root || !$this->type || ilObjectLP::supportsMark($this->type))
136  {
137  $all[] = "mark";
138  }
139 
140  $privacy = array("gender", "city", "country", "sel_country");
141  foreach($privacy as $field)
142  {
143  if($ilSetting->get("usr_settings_course_export_".$field))
144  {
145  $all[] = $field;
146  }
147  }
148 
149  $all[] = "language";
150 
151  $default[] = "percentage_avg";
152  $default[] = "status";
153  $default[] = "mark";
154 
155  if($tracking->hasExtendedData(ilObjUserTracking::EXTENDED_DATA_LAST_ACCESS))
156  {
157  $all[] = "first_access_min";
158  $all[] = "last_access_max";
159  }
160 
161  $all[] = "create_date_min";
162  $all[] = "create_date_max";
163 
164  $columns = array();
165  foreach($all as $column)
166  {
167  $l = $column;
168 
169  $prefix = false;
170  if(substr($l, -3) == "avg")
171  {
172  $prefix = "&#216; ";
173  }
174  else if(substr($l, -3) == "sum" || $l == "user_total")
175  {
176  $prefix = "&#8721; ";
177  }
178 
179  if(isset($lng_map[$l]))
180  {
181  $l = $lng_map[$l];
182  }
183 
184  $txt = $prefix.$lng->txt($l);
185 
186  if(in_array($column, array("read_count_avg", "spent_seconds_avg", "percentage_avg")))
187  {
188  $txt .= " / ".$lng->txt("user");
189  }
190 
192  "txt" => $txt,
193  "default" => (in_array($column, $default) ? true :false)
194  );
195  }
196  return $columns;
197  }
198 
202  function initFilter()
203  {
204  global $lng, $ilSetting;
205 
206  if($this->is_root)
207  {
208  return parent::initBaseFilter(true, false);
209  }
210 
211  // show only if extended data was activated in lp settings
212  include_once 'Services/Tracking/classes/class.ilObjUserTracking.php';
213  $tracking = new ilObjUserTracking();
214 
215  $item = $this->addFilterItemByMetaType("user_total", ilTable2GUI::FILTER_NUMBER_RANGE, true,
216  "&#8721; ".$lng->txt("users"));
217  $this->filter["user_total"] = $item->getValue();
218 
219  if($tracking->hasExtendedData(ilObjUserTracking::EXTENDED_DATA_READ_COUNT))
220  {
221  $item = $this->addFilterItemByMetaType("read_count", ilTable2GUI::FILTER_NUMBER_RANGE, true,
222  "&#8721; ".$lng->txt("trac_read_count"));
223  $this->filter["read_count"] = $item->getValue();
224  }
225 
226  if($tracking->hasExtendedData(ilObjUserTracking::EXTENDED_DATA_SPENT_SECONDS))
227  {
228  if($this->is_root || !$this->type || ilObjectLP::supportsSpentSeconds($this->type))
229  {
230  $item = $this->addFilterItemByMetaType("spent_seconds", ilTable2GUI::FILTER_DURATION_RANGE,
231  true, "&#216; ".$lng->txt("trac_spent_seconds")." / ".$lng->txt("user"));
232  $this->filter["spent_seconds"]["from"] = $item->getCombinationItem("from")->getValueInSeconds();
233  $this->filter["spent_seconds"]["to"] = $item->getCombinationItem("to")->getValueInSeconds();
234  }
235  }
236 
237  if($this->is_root || !$this->type || $this->isPercentageAvailable($this->obj_id))
238  {
239  $item = $this->addFilterItemByMetaType("percentage", ilTable2GUI::FILTER_NUMBER_RANGE, true,
240  "&#216; ".$lng->txt("trac_percentage")." / ".$lng->txt("user"));
241  $this->filter["percentage"] = $item->getValue();
242  }
243 
244  if($this->is_root || !$this->olp || $this->olp->isActive())
245  {
246  include_once "Services/Tracking/classes/class.ilLPStatus.php";
247  $item = $this->addFilterItemByMetaType("status", ilTable2GUI::FILTER_SELECT, true);
248  $item->setOptions(array("" => $lng->txt("trac_all"),
253  $this->filter["status"] = $item->getValue();
254  if($this->filter["status"])
255  {
256  $this->filter["status"]--;
257  }
258 
259  $item = $this->addFilterItemByMetaType("trac_status_changed", ilTable2GUI::FILTER_DATE_RANGE, true);
260  $this->filter["status_changed"] = $item->getDate();
261  }
262 
263  if($this->is_root || !$this->type || ilObjectLP::supportsMark($this->type))
264  {
265  $item = $this->addFilterItemByMetaType("mark", ilTable2GUI::FILTER_TEXT, true,
266  $lng->txt("trac_mark"));
267  $this->filter["mark"] = $item->getValue();
268  }
269 
270  if($ilSetting->get("usr_settings_course_export_gender"))
271  {
272  $item = $this->addFilterItemByMetaType("gender", ilTable2GUI::FILTER_SELECT, true);
273  $item->setOptions(array("" => $lng->txt("trac_all"), "m" => $lng->txt("gender_m"),
274  "f" => $lng->txt("gender_f")));
275  $this->filter["gender"] = $item->getValue();
276  }
277 
278  if($ilSetting->get("usr_settings_course_export_city"))
279  {
280  $item = $this->addFilterItemByMetaType("city", ilTable2GUI::FILTER_TEXT, true);
281  $this->filter["city"] = $item->getValue();
282  }
283 
284  if($ilSetting->get("usr_settings_course_export_country"))
285  {
286  $item = $this->addFilterItemByMetaType("country", ilTable2GUI::FILTER_TEXT, true);
287  $this->filter["country"] = $item->getValue();
288  }
289 
290  if($ilSetting->get("usr_settings_course_export_sel_country"))
291  {
292  $item = $this->addFilterItemByMetaType("sel_country", ilTable2GUI::FILTER_SELECT, true);
293  $item->setOptions(array("" => $lng->txt("trac_all"))+$this->getSelCountryCodes());
294  $this->filter["sel_country"] = $item->getValue();
295  }
296 
297  $item = $this->addFilterItemByMetaType("language", ilTable2GUI::FILTER_LANGUAGE, true);
298  $this->filter["language"] = $item->getValue();
299 
300  if($tracking->hasExtendedData(ilObjUserTracking::EXTENDED_DATA_LAST_ACCESS))
301  {
302  $item = $this->addFilterItemByMetaType("trac_first_access", ilTable2GUI::FILTER_DATETIME_RANGE, true);
303  $this->filter["first_access"] = $item->getDate();
304 
305  $item = $this->addFilterItemByMetaType("trac_last_access", ilTable2GUI::FILTER_DATETIME_RANGE, true);
306  $this->filter["last_access"] = $item->getDate();
307  }
308 
309  $item = $this->addFilterItemByMetaType("registration_filter", ilTable2GUI::FILTER_DATE_RANGE, true);
310  $this->filter["registration"] = $item->getDate();
311  }
312 
314  {
315  global $lng;
316 
317  include_once("./Services/Utilities/classes/class.ilCountry.php");
318  $options = array();
319  foreach (ilCountry::getCountryCodes() as $c)
320  {
321  $options[$c] = $lng->txt("meta_c_".$c);
322  }
323  asort($options);
324  return $options;
325  }
326 
333  function getItems($a_object_id, $a_ref_id)
334  {
335  global $lng, $rbacsystem;
336 
337  include_once("./Services/Tracking/classes/class.ilTrQuery.php");
338 
339  // show only selected subobjects for lp mode
340  $preselected_obj_ids = $filter = NULL;
341 
343  if(
344  $olp->getCurrentMode() == ilLPObjSettings::LP_MODE_COLLECTION_MANUAL ||
345  $olp->getCurrentMode() == ilLPObjSettings::LP_MODE_COLLECTION ||
346  $olp->getCurrentMode() == ilLPObjSettings::LP_MODE_MANUAL_BY_TUTOR
347  )
348  {
349  $collection = $olp->getCollectionInstance();
350  $preselected_obj_ids[$a_object_id][] = $a_ref_id;
351  foreach($collection->getItems() as $item => $item_info)
352  {
353  $tmp_lp = ilObjectLP::getInstance(ilObject::_lookupObjId($item_info));
354  if($tmp_lp->isActive())
355  {
356  $preselected_obj_ids[ilObject::_lookupObjId($item_info)][] = $item_info;
357  }
358  }
359  $filter = $this->getCurrentFilter();
360  }
361  elseif($this->is_root)
362  {
363  // using search to get all relevant objects
364  // #8498/#8499: restrict to objects with at least "read_learning_progress" access
365  $preselected_obj_ids = $this->searchObjects($this->getCurrentFilter(true), "read_learning_progress");
366  }
367  else
368  {
369  // using summary filters
370  $filter = $this->getCurrentFilter();
371  }
372 
373 
374 
376  $a_object_id,
377  $a_ref_id,
381  ilUtil::stripSlashes($this->getLimit()),
382  $filter,
383  $this->getSelectedColumns(),
384  $preselected_obj_ids
385  );
386 
387  // build status to image map
388  include_once("./Services/Tracking/classes/class.ilLearningProgressBaseGUI.php");
389  include_once("./Services/Tracking/classes/class.ilLPStatus.php");
394  $status_map = array();
395  foreach($valid_status as $status)
396  {
399  $status_map[$status] = ilUtil::img($path, $text);
400  }
401 
402  // language map
403  $lng->loadLanguageModule("meta");
404  $languages = array();
405  foreach ($lng->getInstalledLanguages() as $lang_key)
406  {
407  $languages[$lang_key] = $lng->txt("meta_l_".$lang_key);
408  }
409 
410  $rows = array();
411  foreach($data["set"] as $idx => $result)
412  {
413  // sessions have no title
414  if($result["title"] == "" && $result["type"] == "sess")
415  {
416  include_once "Modules/Session/classes/class.ilObjSession.php";
417  $sess = new ilObjSession($result["obj_id"], false);
418  $data["set"][$idx]["title"] = $sess->getFirstAppointment()->appointmentToString();
419  }
420 
421  $data["set"][$idx]["offline"] = ilLearningProgressBaseGUI::isObjectOffline($result["obj_id"], $result["type"]);
422 
423  // #13807
424  if($result["ref_ids"])
425  {
426  $valid = false;
427  foreach($result["ref_ids"] as $check_ref_id)
428  {
429  include_once './Services/Tracking/classes/class.ilLearningProgressAccess.php';
430  if(ilLearningProgressAccess::checkPermission('read_learning_progress', $check_ref_id))
431  {
432  $valid = true;
433  break;
434  }
435  }
436  if(!$valid)
437  {
438  foreach(array_keys($data["set"][$idx]) as $col_id)
439  {
440  if(!in_array($col_id, array("type", "title", "obj_id", "ref_id", "offline")))
441  {
442  $data["set"][$idx][$col_id] = null;
443  }
444  }
445  $data["set"][$idx]["privacy_conflict"] = true;
446  continue;
447  }
448  }
449 
450  // percentages
451  $users_no = $result["user_total"];
452  $data["set"][$idx]["country"] = $this->getItemsPercentages($result["country"], $users_no);
453  $data["set"][$idx]["gender"] = $this->getItemsPercentages($result["gender"], $users_no, array("m"=>$lng->txt("gender_m"), "f"=>$lng->txt("gender_f")));
454  $data["set"][$idx]["city"] = $this->getItemsPercentages($result["city"], $users_no);
455  $data["set"][$idx]["sel_country"] = $this->getItemsPercentages($result["sel_country"], $users_no, $this->getSelCountryCodes());
456  $data["set"][$idx]["mark"] = $this->getItemsPercentages($result["mark"], $users_no);
457  $data["set"][$idx]["language"] = $this->getItemsPercentages($result["language"], $users_no, $languages);
458 
459  // if we encounter any invalid status codes, e.g. null, map them to not attempted instead
460  foreach($result["status"] as $status_code => $status_counter)
461  {
462  // null is cast to ""
463  if($status_code === "" || !in_array($status_code, $valid_status))
464  {
465  $result["status"][ilLPStatus::LP_STATUS_NOT_ATTEMPTED_NUM] += $status_counter;
466  unset($result["status"][$status_code]);
467  }
468  }
469  $data["set"][$idx]["status"] = $this->getItemsPercentagesStatus($result["status"], $users_no, $status_map);
470 
471  if(!$this->isPercentageAvailable($result["obj_id"]))
472  {
473  $data["set"][$idx]["percentage_avg"] = NULL;
474  }
475  }
476 
477  $this->setMaxCount($data["cnt"]);
478  $this->setData($data["set"]);
479  }
480 
490  protected function getItemsPercentages(array $data = NULL, $overall, array $value_map = NULL, $limit = 3)
491  {
492  global $lng;
493 
494  if(!$overall)
495  {
496  return false;
497  }
498 
499  $result = array();
500 
501  if($data)
502  {
503  // if we have only 1 item more than the limit, "others" makes no sense
504  if(sizeof($data) == $limit+1)
505  {
506  $limit++;
507  }
508 
509  $counter = $others_counter = $others_sum = 0;
510  foreach($data as $id => $count)
511  {
512  $counter++;
513  if($counter <= $limit)
514  {
515  $caption = $id;
516 
517  if($value_map && isset($value_map[$id]))
518  {
519  $caption = $value_map[$id];
520  }
521 
522  if($caption == "")
523  {
524  $caption = $lng->txt("none");
525  }
526 
527  $perc = round($count/$overall*100);
528  $result[] = array(
529  "caption" => $caption,
530  "absolute" => $count, // ." ".($count > 1 ? $lng->txt("users") : $lng->txt("user")),
531  "percentage" => $perc
532  );
533  }
534  else
535  {
536  $others_sum += $count;
537  $others_counter++;
538  }
539  }
540 
541  if($others_counter)
542  {
543  $perc = round($others_sum/$overall*100);
544  $result[] = array(
545  "caption" => $otherss_counter." ".$lng->txt("trac_others"),
546  "absolute" => $others_sum, // ." ".($others_sum > 1 ? $lng->txt("users") : $lng->txt("user")),
547  "percentage" => $perc
548  );
549  }
550  }
551 
552  return $result;
553  }
554 
563  protected function getItemsPercentagesStatus(array $data = NULL, $overall, array $value_map = NULL)
564  {
565  global $lng;
566 
567  $result = array();
568  foreach($value_map as $id => $caption)
569  {
570  $count = 0;
571  if(isset($data[$id]))
572  {
573  $count = $data[$id];
574  }
575  $perc = round($count/$overall*100);
576 
577  $result[] = array(
578  "caption" => $caption,
579  "absolute" => $count,
580  "percentage" => $perc
581  );
582  }
583 
584  return $result;
585  }
586 
587  protected function parseValue($id, $value, $type)
588  {
589  global $lng;
590 
591  // get rid of aggregation
592  $pos = strrpos($id, "_");
593  if($pos !== false)
594  {
595  $function = strtoupper(substr($id, $pos+1));
596  if(in_array($function, array("MIN", "MAX", "SUM", "AVG", "COUNT")))
597  {
598  $id = substr($id, 0, $pos);
599  }
600  }
601 
602  if(trim($value) == "")
603  {
604  if($id == "title")
605  {
606  return "--".$lng->txt("none")."--";
607  }
608  return "";
609  }
610  switch($id)
611  {
612  case 'status_changed':
613  case "first_access":
614  case "create_date":
616  break;
617 
618  case "last_access":
620  break;
621 
622  case "spent_seconds":
623  case "read_count_spent_seconds":
625  {
626  $value = "-";
627  }
628  else
629  {
630  $value = ilDatePresentation::secondsToString($value, ($value < 3600 ? true : false)); // #14858
631  }
632  break;
633 
634  case "percentage":
635  if(false /* $this->isPercentageAvailable() */)
636  {
637  $value = "-";
638  }
639  else
640  {
641  $value = $value."%";
642  }
643  break;
644 
645  case "mark":
646  if(!ilObjectLP::supportsMark($type))
647  {
648  $value = "-";
649  }
650  break;
651  }
652 
653  return $value;
654  }
655 
659  protected function fillRow($a_set)
660  {
661  global $lng, $ilCtrl;
662 
663  $this->tpl->setVariable("ICON", ilObject::_getIcon("", "tiny", $a_set["type"]));
664  $this->tpl->setVariable("ICON_ALT", $lng->txt($a_set["type"]));
665  $this->tpl->setVariable("TITLE", $a_set["title"]);
666 
667  if($a_set["offline"] || $a_set["privacy_conflict"])
668  {
669  $mess = array();
670  if($a_set["offline"])
671  {
672  $mess[] = $lng->txt("offline");
673  }
674  if($a_set["privacy_conflict"])
675  {
676  $mess[] = $lng->txt("status_no_permission");
677  }
678  $this->tpl->setCurrentBlock("status_bl");
679  $this->tpl->setVariable("TEXT_STATUS", implode(", ", $mess));
680  $this->tpl->parseCurrentBlock();
681  }
682 
683  foreach ($this->getSelectedColumns() as $c)
684  {
685  switch($c)
686  {
687  case "country":
688  case "gender":
689  case "city":
690  case "language":
691  case "status":
692  case "mark":
693  case "sel_country":
694  $this->renderPercentages($c, $a_set[$c]);
695  break;
696 
697  case "percentage_avg":
698  if((int)$a_set[$c] === 0 || !$this->isPercentageAvailable($a_set["obj_id"]))
699  {
700  $this->tpl->setVariable(strtoupper($c), "");
701  break;
702  }
703 
704  default:
705  $value = $this->parseValue($c, $a_set[$c], $a_set["type"]);
706  $this->tpl->setVariable(strtoupper($c), $value);
707  break;
708  }
709  }
710 
711  if($this->is_root)
712  {
713  $path = $this->buildPath($a_set["ref_ids"], false, true);
714  if($path)
715  {
716  $this->tpl->setCurrentBlock("item_path");
717  foreach($path as $ref_id => $path_item)
718  {
719  $this->tpl->setVariable("PATH_ITEM", $path_item);
720 
721  if(!$this->anonymized)
722  {
723  $ilCtrl->setParameterByClass($ilCtrl->getCmdClass(), 'details_id', $ref_id);
724  $this->tpl->setVariable("URL_DETAILS", $ilCtrl->getLinkTargetByClass($ilCtrl->getCmdClass(), 'details'));
725  $ilCtrl->setParameterByClass($ilCtrl->getCmdClass(), 'details_id', '');
726  $this->tpl->setVariable("TXT_DETAILS", $lng->txt('trac_participants'));
727  }
728  else
729  {
730  $this->tpl->setVariable("URL_DETAILS", ilLink::_getLink($ref_id, $a_set["type"]));
731  $this->tpl->setVariable("TXT_DETAILS", $lng->txt('view'));
732  }
733 
734  $this->tpl->parseCurrentBlock();
735  }
736  }
737 
738  $this->tpl->setCurrentBlock("item_command");
739  $ilCtrl->setParameterByClass(get_class($this),'hide', $a_set["obj_id"]);
740  $this->tpl->setVariable("HREF_COMMAND", $ilCtrl->getLinkTargetByClass(get_class($this),'hide'));
741  $this->tpl->setVariable("TXT_COMMAND", $this->lng->txt('trac_hide'));
742  $this->tpl->parseCurrentBlock();
743 
744  $this->tpl->touchBlock("path_action");
745  }
746  else if($a_set["ref_ids"]) // #18446
747  {
748  // #16453
749  include_once './Services/Tree/classes/class.ilPathGUI.php';
750  $path = new ilPathGUI();
751  $path = $path->getPath($this->ref_id, array_pop($a_set["ref_ids"]));
752  if($path)
753  {
754  $this->tpl->setVariable('COLL_PATH', $this->lng->txt('path').': '.$path);
755  }
756  }
757  }
758 
759  protected function renderPercentages($id, $data)
760  {
761  if($data)
762  {
763  foreach($data as $item)
764  {
765  $this->tpl->setCurrentBlock($id."_row");
766  $this->tpl->setVariable("CAPTION", $item["caption"]);
767  $this->tpl->setVariable("ABSOLUTE", $item["absolute"]);
768  $this->tpl->setVariable("PERCENTAGE", $item["percentage"]);
769  $this->tpl->parseCurrentBlock();
770  }
771  }
772  else
773  {
774  $this->tpl->touchBlock($id);;
775  }
776  }
777 
778  protected function isArrayColumn($a_name)
779  {
780  if(in_array($a_name, array("country", "gender", "city", "language", "status", "mark", 'sel_country')))
781  {
782  return true;
783  }
784  return false;
785  }
786 
787  public function numericOrdering($a_field)
788  {
789  $pos = strrpos($a_field, "_");
790  if($pos !== false)
791  {
792  $function = strtoupper(substr($a_field, $pos+1));
793  if(in_array($function, array("MIN", "MAX", "SUM", "AVG", "COUNT", "TOTAL")))
794  {
795  return true;
796  }
797  }
798  return false;
799  }
800 
801  protected function fillHeaderExcel(ilExcel $a_excel, &$a_row)
802  {
803  $a_excel->setCell($a_row, 0, $this->lng->txt("title"));
804 
805  $labels = $this->getSelectableColumns();
806  $cnt = 1;
807  foreach ($this->getSelectedColumns() as $c)
808  {
809  $label = $labels[$c]["txt"];
810  $label = str_replace("&#216;", $this->lng->txt("trac_average"), $label);
811  $label = str_replace("&#8721;", $this->lng->txt("trac_sum"), $label);
812 
813  if(!$this->isArrayColumn($c))
814  {
815  $a_excel->setCell($a_row, $cnt, $label);
816  $cnt++;
817  }
818  else
819  {
820  if($c != "status")
821  {
822  $a_excel->setCell($a_row, $cnt, $label." #1");
823  $a_excel->setCell($a_row, ++$cnt, $label." #1");
824  $a_excel->setCell($a_row, ++$cnt, $label." #1 %");
825  $a_excel->setCell($a_row, ++$cnt, $label." #2");
826  $a_excel->setCell($a_row, ++$cnt, $label." #2");
827  $a_excel->setCell($a_row, ++$cnt, $label." #2 %");
828  $a_excel->setCell($a_row, ++$cnt, $label." #3");
829  $a_excel->setCell($a_row, ++$cnt, $label." #3");
830  $a_excel->setCell($a_row, ++$cnt, $label." #3 %");
831  $a_excel->setCell($a_row, ++$cnt, $label." ".$this->lng->txt("trac_others"));
832  $a_excel->setCell($a_row, ++$cnt, $label." ".$this->lng->txt("trac_others"));
833  $a_excel->setCell($a_row, ++$cnt, $label." ".$this->lng->txt("trac_others")." %");
834  }
835  else
836  {
837  // build status to image map
838  include_once("./Services/Tracking/classes/class.ilLearningProgressBaseGUI.php");
839  include_once("./Services/Tracking/classes/class.ilLPStatus.php");
844  $cnt--;
845  foreach($valid_status as $status)
846  {
848  $a_excel->setCell($a_row, ++$cnt, $text);
849  $a_excel->setCell($a_row, ++$cnt, $text." %");
850  }
851  }
852  $cnt++;
853  }
854  }
855 
856  $a_excel->setBold("A".$a_row.":".$a_excel->getColumnCoord($cnt).$a_row);
857  }
858 
859  protected function fillRowExcel(ilExcel $a_excel, &$a_row, $a_set)
860  {
861  $a_excel->setCell($a_row, 0, $a_set["title"]);
862 
863  $cnt = 1;
864  foreach ($this->getSelectedColumns() as $c)
865  {
866  if(!$this->isArrayColumn($c))
867  {
868  $val = $this->parseValue($c, $a_set[$c], $a_set["type"]);
869  $a_excel->setCell($a_row, $cnt, $val);
870  $cnt++;
871  }
872  else
873  {
874  foreach((array) $a_set[$c] as $idx => $value)
875  {
876  if($c == "status")
877  {
878  $a_excel->setCell($a_row, $cnt, (int)$value["absolute"]);
879  $a_excel->setCell($a_row, ++$cnt, $value["percentage"]."%");
880  }
881  else
882  {
883  $a_excel->setCell($a_row, $cnt, $value["caption"]);
884  $a_excel->setCell($a_row, ++$cnt, (int)$value["absolute"]);
885  $a_excel->setCell($a_row, ++$cnt, $value["percentage"]."%");
886  }
887  $cnt++;
888  }
889  if(sizeof($a_set[$c]) < 4 && $c != "status")
890  {
891  for($loop = 4; $loop > sizeof($a_set[$c]); $loop--)
892  {
893  $a_excel->setCell($a_row, $cnt, "");
894  $a_excel->setCell($a_row, ++$cnt, "");
895  $a_excel->setCell($a_row, ++$cnt, "");
896  $cnt++;
897  }
898  }
899  }
900  }
901  }
902 
903  protected function fillHeaderCSV($a_csv)
904  {
905  $a_csv->addColumn($this->lng->txt("title"));
906 
907  $labels = $this->getSelectableColumns();
908  foreach ($this->getSelectedColumns() as $c)
909  {
910  $label = $labels[$c]["txt"];
911  $label = str_replace("&#216;", $this->lng->txt("trac_average"), $label);
912  $label = str_replace("&#8721;", $this->lng->txt("trac_sum"), $label);
913 
914  if(!$this->isArrayColumn($c))
915  {
916  $a_csv->addColumn($label);
917  }
918  else
919  {
920  if($c != "status")
921  {
922  $a_csv->addColumn($label." #1");
923  $a_csv->addColumn($label." #1");
924  $a_csv->addColumn($label." #1 %");
925  $a_csv->addColumn($label." #2");
926  $a_csv->addColumn($label." #2");
927  $a_csv->addColumn($label." #2 %");
928  $a_csv->addColumn($label." #3");
929  $a_csv->addColumn($label." #3");
930  $a_csv->addColumn($label." #3 %");
931  $a_csv->addColumn($label." ".$this->lng->txt("trac_others"));
932  $a_csv->addColumn($label." ".$this->lng->txt("trac_others"));
933  $a_csv->addColumn($label." ".$this->lng->txt("trac_others")." %");
934  }
935  else
936  {
937  // build status to image map
938  include_once("./Services/Tracking/classes/class.ilLearningProgressBaseGUI.php");
939  include_once("./Services/Tracking/classes/class.ilLPStatus.php");
944  foreach($valid_status as $status)
945  {
947  $a_csv->addColumn($text);
948  $a_csv->addColumn($text." %");
949  }
950  }
951  }
952  }
953 
954  $a_csv->addRow();
955  }
956 
957  protected function fillRowCSV($a_csv, $a_set)
958  {
959  $a_csv->addColumn($a_set["title"]);
960 
961  foreach ($this->getSelectedColumns() as $c)
962  {
963  if(!$this->isArrayColumn($c))
964  {
965  $val = $this->parseValue($c, $a_set[$c], $a_set["type"]);
966  $a_csv->addColumn($val);
967  }
968  else
969  {
970  foreach((array) $a_set[$c] as $idx => $value)
971  {
972  if($c != "status")
973  {
974  $a_csv->addColumn($value["caption"]);
975  }
976  $a_csv->addColumn((int)$value["absolute"]);
977  $a_csv->addColumn($value["percentage"]);
978  }
979  if(sizeof($a_set[$c]) < 4 && $c != "status")
980  {
981  for($loop = 4; $loop > sizeof($a_set[$c]); $loop--)
982  {
983  $a_csv->addColumn("");
984  $a_csv->addColumn("");
985  $a_csv->addColumn("");
986  }
987  }
988  }
989  }
990 
991  $a_csv->addRow();
992  }
993 }
994 ?>
const LP_STATUS_COMPLETED_NUM
Creates a path for a start and endnode.
buildPath($ref_ids)
Build path with deep-link.
static _getIcon($a_obj_id="", $a_size="big", $a_type="", $a_offline=false)
Get icon for repository item.
$path
Definition: aliased.php:25
setDefaultOrderField($a_defaultorderfield)
Set Default order field.
setExportFormats(array $formats)
Set available export formats.
const IL_CAL_DATETIME
$result
addFilterItemByMetaType($id, $type=self::FILTER_TEXT, $a_optional=false, $caption=NULL)
Add filter by standard type.
static _getImagePathForStatus($a_status)
Get image path for status.
getItemsPercentages(array $data=NULL, $overall, array $value_map=NULL, $limit=3)
Render data as needed for summary list (based on grouped values)
setPrintMode($a_value=false)
Toogle print mode.
setShowTemplates($a_value)
Toggle templates.
const LP_STATUS_NOT_ATTEMPTED
static _getStatusText($a_status, $a_lng=null)
Get status alt text.
$valid
searchObjects(array $filter, $permission, array $preset_obj_ids=null, $a_check_lp_activation=true)
Search objects that match current filters.
const LP_STATUS_IN_PROGRESS_NUM
fillRowExcel(ilExcel $a_excel, &$a_row, $a_set)
parseTitle($a_obj_id, $action, $a_user_id=false)
const IL_CAL_UNIX
getItems($a_object_id, $a_ref_id)
Build summary item rows for given object and filter(s.
getOrderDirection()
Get order direction.
static checkPermission($a_permission, $a_ref_id, $a_user_id=null)
wrapper for rbac access checks
const FILTER_NUMBER_RANGE
setId($a_val)
Set id.
const LP_STATUS_IN_PROGRESS
global $ilCtrl
Definition: ilias.php:18
fillHeaderExcel(ilExcel $a_excel, &$a_row)
$counter
const LP_STATUS_FAILED
const FILTER_DATETIME_RANGE
$column
Definition: 39dropdown.php:62
static secondsToString($seconds, $force_with_seconds=false, $a_lng=null)
converts seconds to string: Long: 7 days 4 hour(s) ...
getColumnCoord($a_col)
Get column "name" from number.
TableGUI class for learning progress.
if(!is_array($argv)) $options
setBold($a_coords)
Set cell(s) to bold.
getOffset()
Get offset.
static isObjectOffline($a_obj_id, $a_type=null)
const FILTER_DURATION_RANGE
static _lookupObjId($a_id)
parseValue($id, $value, $type)
static formatDate(ilDateTime $date)
Format a date public.
static getObjectsSummaryForObject($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, $a_preselected_obj_ids=NULL)
Get all aggregated tracking data for parent object.
Date and time handling
getSelectedColumns()
Get selected columns.
static stripSlashes($a_str, $a_strip_html=true, $a_allow="")
strip slashes if magic qoutes is enabled
$txt
Definition: error.php:12
__construct($a_parent_obj, $a_parent_cmd, $a_ref_id, $a_print_mode=false)
Constructor.
fillRow($a_set)
Fill table row.
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 supportsMark($a_obj_type)
setCell($a_row, $a_col, $a_value)
Set cell value.
const LP_STATUS_NOT_ATTEMPTED_NUM
setFormAction($a_form_action, $a_multipart=false)
Set Form action parameter.
static supportsSpentSeconds($a_obj_type)
static img($a_src, $a_alt="", $a_width="", $a_height="", $a_border=0, $a_id="", $a_class="")
Build img tag.
global $l
Definition: afr.php:30
$ref_id
Definition: sahs_server.php:39
getItemsPercentagesStatus(array $data=NULL, $overall, array $value_map=NULL)
Render status data as needed for summary list (based on grouped values)
global $ilSetting
Definition: privfeed.php:17
global $lng
Definition: privfeed.php:17
$text
setEnableHeader($a_enableheader)
Set Enable Header.
static getCountryCodes()
Get country codes (DIN EN 3166-1)
getLimit()
Get limit.
$languages
Definition: cssgen2.php:34
setMaxCount($a_max_count)
set max.
getCurrentFilter($as_query=false)
const LP_STATUS_COMPLETED
static getInstance($a_obj_id)
if(! $in) $columns
Definition: Utf8Test.php:45
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