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
4include_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
191 $columns[$column] = array(
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,
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");
390 $valid_status = array(ilLPStatus::LP_STATUS_NOT_ATTEMPTED_NUM,
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");
840 $valid_status = array(ilLPStatus::LP_STATUS_NOT_ATTEMPTED_NUM,
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");
940 $valid_status = array(ilLPStatus::LP_STATUS_NOT_ATTEMPTED_NUM,
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?>
$column
Definition: 39dropdown.php:62
$result
if(! $in) $columns
Definition: Utf8Test.php:45
global $l
Definition: afr.php:30
$path
Definition: aliased.php:25
An exception for terminatinating execution or to throw for unit testing.
const IL_CAL_UNIX
const IL_CAL_DATETIME
static getCountryCodes()
Get country codes (DIN EN 3166-1)
static secondsToString($seconds, $force_with_seconds=false, $a_lng=null)
converts seconds to string: Long: 7 days 4 hour(s) ...
static formatDate(ilDateTime $date)
Format a date @access public.
@classDescription Date and time handling
setCell($a_row, $a_col, $a_value)
Set cell value.
setBold($a_coords)
Set cell(s) to bold.
getColumnCoord($a_col)
Get column "name" from number.
const LP_STATUS_COMPLETED_NUM
const LP_STATUS_COMPLETED
const LP_STATUS_FAILED
const LP_STATUS_IN_PROGRESS_NUM
const LP_STATUS_NOT_ATTEMPTED_NUM
const LP_STATUS_FAILED_NUM
const LP_STATUS_NOT_ATTEMPTED
const LP_STATUS_IN_PROGRESS
TableGUI class for learning progress.
getCurrentFilter($as_query=false)
parseTitle($a_obj_id, $action, $a_user_id=false)
buildPath($ref_ids)
Build path with deep-link.
searchObjects(array $filter, $permission, array $preset_obj_ids=null, $a_check_lp_activation=true)
Search objects that match current filters.
static checkPermission($a_permission, $a_ref_id, $a_user_id=null)
wrapper for rbac access checks
static _getStatusText($a_status, $a_lng=null)
Get status alt text.
static _getImagePathForStatus($a_status)
Get image path for status.
static isObjectOffline($a_obj_id, $a_type=null)
static supportsMark($a_obj_type)
static supportsSpentSeconds($a_obj_type)
static getInstance($a_obj_id)
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.
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.
setPrintMode($a_value=false)
Toogle print mode.
setData($a_data)
set table data @access public
getLimit()
Get limit.
setRowTemplate($a_template, $a_template_dir="")
Set row template.
setLimit($a_limit=0, $a_default_limit=0)
set max.
setDefaultOrderField($a_defaultorderfield)
Set Default order field.
getOffset()
Get offset.
const FILTER_DURATION_RANGE
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.
const FILTER_NUMBER_RANGE
setShowTemplates($a_value)
Toggle templates.
const FILTER_DATETIME_RANGE
getOrderDirection()
Get order direction.
setMaxCount($a_max_count)
set max.
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.
numericOrdering($a_field)
Should this field be sorted numeric?
getItemsPercentagesStatus(array $data=NULL, $overall, array $value_map=NULL)
Render status data as needed for summary list (based on grouped values)
fillRowExcel(ilExcel $a_excel, &$a_row, $a_set)
Excel Version of Fill Row.
getItemsPercentages(array $data=NULL, $overall, array $value_map=NULL, $limit=3)
Render data as needed for summary list (based on grouped values)
getSelectableColumns()
Get selectable columns.
getItems($a_object_id, $a_ref_id)
Build summary item rows for given object and filter(s.
fillHeaderExcel(ilExcel $a_excel, &$a_row)
Excel Version of Fill Header.
fillHeaderCSV($a_csv)
CSV Version of Fill Header.
fillRowCSV($a_csv, $a_set)
CSV Version of Fill Row.
__construct($a_parent_obj, $a_parent_cmd, $a_ref_id, $a_print_mode=false)
Constructor.
parseValue($id, $value, $type)
fillRow($a_set)
Fill table row.
static img($a_src, $a_alt="", $a_width="", $a_height="", $a_border=0, $a_id="", $a_class="")
Build img tag.
static stripSlashes($a_str, $a_strip_html=true, $a_allow="")
strip slashes if magic qoutes is enabled
$counter
$languages
Definition: cssgen2.php:34
$valid
$txt
Definition: error.php:12
$text
global $ilCtrl
Definition: ilias.php:18
global $lng
Definition: privfeed.php:17
global $ilSetting
Definition: privfeed.php:17
$ref_id
Definition: sahs_server.php:39
if(!is_array($argv)) $options