ILIAS  release_5-3 Revision v5.3.23-19-g915713cf615
class.ilSessionStatisticsGUI.php
Go to the documentation of this file.
1<?php
2
3/* Copyright (c) 1998-2010 ILIAS open source, Extended GPL, see docs/LICENSE */
4
5include_once "Services/Authentication/classes/class.ilSessionStatistics.php";
6
16{
17 const MODE_TODAY = 1;
18 const MODE_LAST_DAY = 2;
19 const MODE_LAST_WEEK = 3;
20 const MODE_LAST_MONTH = 4;
21 const MODE_DAY = 5;
22 const MODE_WEEK = 6;
23 const MODE_MONTH = 7;
24 const MODE_YEAR = 8;
25
26 const SCALE_DAY = 1;
27 const SCALE_WEEK = 2;
28 const SCALE_MONTH = 3;
29 const SCALE_YEAR = 4;
31
32 public function executeCommand()
33 {
34 global $ilCtrl;
35
36 $this->setSubTabs();
37
38 switch ($ilCtrl->getNextClass()) {
39 default:
40 $cmd = $ilCtrl->getCmd("current");
41 $this->$cmd();
42 }
43
44 return true;
45 }
46
47 protected function setSubTabs()
48 {
49 global $ilTabs, $ilCtrl, $lng;
50
51 $ilTabs->addSubTab(
52 "current",
53 $lng->txt("trac_current_system_load"),
54 $ilCtrl->getLinkTarget($this, "current")
55 );
56 $ilTabs->addSubTab(
57 "short",
58 $lng->txt("trac_short_system_load"),
59 $ilCtrl->getLinkTarget($this, "short")
60 );
61 $ilTabs->addSubTab(
62 "long",
63 $lng->txt("trac_long_system_load"),
64 $ilCtrl->getLinkTarget($this, "long")
65 );
66 $ilTabs->addSubTab(
67 "periodic",
68 $lng->txt("trac_periodic_system_load"),
69 $ilCtrl->getLinkTarget($this, "periodic")
70 );
71 }
72
73 protected function current($a_export = false)
74 {
75 global $tpl, $ilToolbar, $ilCtrl, $ilTabs, $lng;
76
77 $ilTabs->activateSubTab("current");
78
79 // current mode
80 if (!$_REQUEST["smd"]) {
81 $_REQUEST["smd"] = self::MODE_TODAY;
82 }
83 $mode = (int) $_REQUEST["smd"];
84
85 // current measure
86 if (!$_REQUEST["smm"]) {
87 $_REQUEST["smm"] = "avg";
88 }
89 $measure = (string) $_REQUEST["smm"];
90
91
92 switch ($mode) {
94 $time_from = strtotime("today");
95 $time_to = strtotime("tomorrow")-1;
96 $scale = self::SCALE_DAY;
97 break;
98
100 $time_to = time();
101 $time_from = $time_to-60*60*24;
102 $scale = self::SCALE_DAY;
103 break;
104
106 $time_to = time();
107 $time_from = $time_to-60*60*24*7;
108 $scale = self::SCALE_WEEK;
109 break;
110
112 $time_to = time();
113 $time_from = $time_to-60*60*24*30;
114 $scale = self::SCALE_MONTH;
115 break;
116 }
117
118 $mode_options = array(
119 self::MODE_TODAY => $lng->txt("trac_session_statistics_mode_today"),
120 self::MODE_LAST_DAY => $lng->txt("trac_session_statistics_mode_last_day"),
121 self::MODE_LAST_WEEK => $lng->txt("trac_session_statistics_mode_last_week"),
122 self::MODE_LAST_MONTH => $lng->txt("trac_session_statistics_mode_last_month"));
123
124 $title = $lng->txt("trac_current_system_load") . " - " . $mode_options[$mode];
125 $data = $this->buildData($time_from, $time_to, $title);
126
127 if (!$a_export) {
128 // toolbar
129 include_once "Services/Form/classes/class.ilPropertyFormGUI.php";
130 $ilToolbar->setFormAction($ilCtrl->getFormAction($this, "current"));
131
132 $mode_selector = new ilSelectInputGUI("&nbsp;" . $lng->txt("trac_scale"), "smd");
133 $mode_selector->setOptions($mode_options);
134 $mode_selector->setValue($mode);
135 $ilToolbar->addInputItem($mode_selector, true);
136
137 $measure_options = array(
138 "avg" => $lng->txt("trac_session_active_avg"),
139 "min" => $lng->txt("trac_session_active_min"),
140 "max" => $lng->txt("trac_session_active_max"));
141
142 $measure_selector = new ilSelectInputGUI("&nbsp;" . $lng->txt("trac_measure"), "smm");
143 $measure_selector->setOptions($measure_options);
144 $measure_selector->setValue($measure);
145 $ilToolbar->addInputItem($measure_selector, true);
146
147 $ilToolbar->addFormButton($lng->txt("ok"), "current");
148
149 if (sizeof($data["active"])) {
150 $ilToolbar->addSeparator();
151 $ilToolbar->addFormButton($lng->txt("export"), "currentExport");
152 }
153
154 $tpl->setContent($this->render($data, $scale, $measure));
155
156 $tpl->setLeftContent($this->renderCurrentBasics());
157 } else {
158 $this->exportCSV($data, $scale);
159 }
160 }
161
162 protected function currentExport()
163 {
164 $this->current(true);
165 }
166
167 protected function importDate($a_incoming, $a_default = null)
168 {
169 if (!$a_default) {
170 $a_default = time();
171 }
172
173 include_once "Services/Calendar/classes/class.ilCalendarUtil.php";
174 $parsed = ilCalendarUtil::parseIncomingDate($a_incoming);
175 return $parsed
176 ? $parsed->get(IL_CAL_UNIX)
177 : $a_default;
178 }
179
180 protected function short($a_export = false)
181 {
182 global $tpl, $ilToolbar, $ilCtrl, $ilTabs, $lng;
183
184 $ilTabs->activateSubTab("short");
185
186 // current start
187 $time_to = $this->importDate($_REQUEST["sst"]);
188
189 // current mode
190 if (!$_REQUEST["smd"]) {
191 $_REQUEST["smd"] = self::MODE_DAY;
192 }
193 $mode = (int) $_REQUEST["smd"];
194
195 // current measure
196 if (!$_REQUEST["smm"]) {
197 $_REQUEST["smm"] = "avg";
198 }
199 $measure = (string) $_REQUEST["smm"];
200
201 switch ($mode) {
202 case self::MODE_DAY:
203 $time_from = $time_to-60*60*24;
204 $scale = self::SCALE_DAY;
205 break;
206
207 case self::MODE_WEEK:
208 $time_from = $time_to-60*60*24*7;
209 $scale = self::SCALE_WEEK;
210 break;
211 }
212
213 $mode_options = array(
214 self::MODE_DAY => $lng->txt("trac_session_statistics_mode_day"),
215 self::MODE_WEEK => $lng->txt("trac_session_statistics_mode_week")
216 );
217
218 $title = $lng->txt("trac_short_system_load") . " - " . $mode_options[$mode];
219 $data = $this->buildData($time_from, $time_to, $title);
220
221 if (!$a_export) {
222 // toolbar
223 include_once "Services/Form/classes/class.ilPropertyFormGUI.php";
224 $ilToolbar->setFormAction($ilCtrl->getFormAction($this, "short"));
225
226 $start_selector = new ilDateTimeInputGUI($lng->txt("trac_end_at"), "sst");
227 $start_selector->setDate(new ilDate($time_to, IL_CAL_UNIX));
228 $ilToolbar->addInputItem($start_selector, true);
229
230 $mode_selector = new ilSelectInputGUI("&nbsp;" . $lng->txt("trac_scale"), "smd");
231 $mode_selector->setOptions($mode_options);
232 $mode_selector->setValue($mode);
233 $ilToolbar->addInputItem($mode_selector, true);
234
235 $measure_options = array(
236 "avg" => $lng->txt("trac_session_active_avg"),
237 "min" => $lng->txt("trac_session_active_min"),
238 "max" => $lng->txt("trac_session_active_max"));
239
240 $measure_selector = new ilSelectInputGUI("&nbsp;" . $lng->txt("trac_measure"), "smm");
241 $measure_selector->setOptions($measure_options);
242 $measure_selector->setValue($measure);
243 $ilToolbar->addInputItem($measure_selector, true);
244
245 $ilToolbar->addFormButton($lng->txt("ok"), "short");
246
247 if (sizeof($data["active"])) {
248 $ilToolbar->addSeparator();
249 $ilToolbar->addFormButton($lng->txt("export"), "shortExport");
250 }
251
252 $tpl->setContent($this->render($data, $scale, $measure));
253 } else {
254 $this->exportCSV($data, $scale);
255 }
256 }
257
258 protected function shortExport()
259 {
260 $this->short(true);
261 }
262
263 protected function long($a_export = false)
264 {
265 global $tpl, $ilToolbar, $ilCtrl, $ilTabs, $lng;
266
267 $ilTabs->activateSubTab("long");
268
269 // current start
270 $time_to = $this->importDate($_REQUEST["sst"]);
271
272 // current mode
273 if (!$_REQUEST["smd"]) {
274 $_REQUEST["smd"] = self::MODE_WEEK;
275 }
276 $mode = (int) $_REQUEST["smd"];
277
278 switch ($mode) {
279 case self::MODE_WEEK:
280 $time_from = $time_to-60*60*24*7;
281 $scale = self::SCALE_WEEK;
282 break;
283
284 case self::MODE_MONTH:
285 $time_from = $time_to-60*60*24*30;
286 $scale = self::SCALE_MONTH;
287 break;
288
289 case self::MODE_YEAR:
290 $time_from = $time_to-60*60*24*365;
291 $scale = self::SCALE_YEAR;
292 break;
293 }
294
295 $mode_options = array(
296 self::MODE_WEEK => $lng->txt("trac_session_statistics_mode_week"),
297 self::MODE_MONTH => $lng->txt("trac_session_statistics_mode_month"),
298 self::MODE_YEAR => $lng->txt("trac_session_statistics_mode_year")
299 );
300
301 $title = $lng->txt("trac_long_system_load") . " - " . $mode_options[$mode];
302 $data = $this->buildData($time_from, $time_to, $title);
303
304 if (!$a_export) {
305 // toolbar
306 include_once "Services/Form/classes/class.ilPropertyFormGUI.php";
307 $ilToolbar->setFormAction($ilCtrl->getFormAction($this, "long"));
308
309 $start_selector = new ilDateTimeInputGUI($lng->txt("trac_end_at"), "sst");
310 $start_selector->setDate(new ilDate($time_to, IL_CAL_UNIX));
311 $ilToolbar->addInputItem($start_selector, true);
312
313 $mode_selector = new ilSelectInputGUI("&nbsp;" . $lng->txt("trac_scale"), "smd");
314 $mode_selector->setOptions($mode_options);
315 $mode_selector->setValue($mode);
316 $ilToolbar->addInputItem($mode_selector, true);
317
318 $ilToolbar->addFormButton($lng->txt("ok"), "long");
319
320 if (sizeof($data["active"])) {
321 $ilToolbar->addSeparator();
322 $ilToolbar->addFormButton($lng->txt("export"), "longExport");
323 }
324
325 $tpl->setContent($this->render($data, $scale));
326 } else {
327 $this->exportCSV($data, $scale);
328 }
329 }
330
331 protected function longExport()
332 {
333 $this->long(true);
334 }
335
336 protected function periodic($a_export = false)
337 {
338 global $tpl, $ilToolbar, $ilCtrl, $ilTabs, $lng;
339
340 $ilTabs->activateSubTab("periodic");
341
342 // current start
343 $time_to = $this->importDate($_REQUEST["sst"]);
344
345 // current end
346 $time_from = $this->importDate($_REQUEST["sto"], strtotime("-7 days"));
347
348 // mixed up dates?
349 if ($time_to < $time_from) {
350 $tmp = $time_to;
351 $time_to = $time_from;
352 $time_from = $tmp;
353 }
354
355 $title = $lng->txt("trac_periodic_system_load");
356 $data = $this->buildData($time_from, $time_to, $title);
357
358 if (!$a_export) {
359 // toolbar
360 include_once "Services/Form/classes/class.ilPropertyFormGUI.php";
361 $ilToolbar->setFormAction($ilCtrl->getFormAction($this, "periodic"));
362
363 $end_selector = new ilDateTimeInputGUI($lng->txt("trac_begin_at"), "sto");
364 $end_selector->setDate(new ilDate($time_from, IL_CAL_UNIX));
365 $ilToolbar->addInputItem($end_selector, true);
366
367 $start_selector = new ilDateTimeInputGUI($lng->txt("trac_end_at"), "sst");
368 $start_selector->setDate(new ilDate($time_to, IL_CAL_UNIX));
369 $ilToolbar->addInputItem($start_selector, true);
370
371 $ilToolbar->addFormButton($lng->txt("ok"), "periodic");
372
373 if (sizeof($data["active"])) {
374 $ilToolbar->addSeparator();
375 $ilToolbar->addFormButton($lng->txt("export"), "periodicExport");
376 }
377
378 $tpl->setContent($this->render($data, self::SCALE_PERIODIC_WEEK));
379 } else {
380 $this->exportCSV($data, self::SCALE_PERIODIC_WEEK);
381 }
382 }
383
384 protected function periodicExport()
385 {
386 $this->periodic(true);
387 }
388
389 protected function renderCurrentBasics()
390 {
391 global $ilSetting, $lng, $ilCtrl, $ilAccess;
392
393 // basic data - not time related
394
395 include_once "Services/Authentication/classes/class.ilSessionControl.php";
397
398 $control_active = ($ilSetting->get('session_handling_type', 0) == 1);
399 if ($control_active) {
400 $control_max_sessions = (int) $ilSetting->get('session_max_count', ilSessionControl::DEFAULT_MAX_COUNT);
401 $control_min_idle = (int) $ilSetting->get('session_min_idle', ilSessionControl::DEFAULT_MIN_IDLE);
402 $control_max_idle = (int) $ilSetting->get('session_max_idle', ilSessionControl::DEFAULT_MAX_IDLE);
403 $control_max_idle_first = (int) $ilSetting->get('session_max_idle_after_first_request', ilSessionControl::DEFAULT_MAX_IDLE_AFTER_FIRST_REQUEST);
404 }
405
408
409
410 // build left column
411
412 $left = new ilTemplate("tpl.session_statistics_left.html", true, true, "Services/Authentication");
413
414 $left->setVariable("CAPTION_CURRENT", $lng->txt("users_online"));
415 $left->setVariable("VALUE_CURRENT", $active);
416
417 $left->setVariable("CAPTION_LAST_AGGR", $lng->txt("trac_last_aggregation"));
418 $left->setVariable("VALUE_LAST_AGGR", ilDatePresentation::formatDate($last_aggr));
419
420 $left->setVariable("CAPTION_LAST_MAX", $lng->txt("trac_last_maxed_out_sessions"));
421 $left->setVariable("VALUE_LAST_MAX", ilDatePresentation::formatDate($last_maxed_out));
422
423 $left->setVariable("CAPTION_SESSION_CONTROL", $lng->txt("sess_load_dependent_session_handling"));
424 if (!$control_active) {
425 $left->setVariable("VALUE_SESSION_CONTROL", $lng->txt("no"));
426 } else {
427 $left->setVariable("VALUE_SESSION_CONTROL", $lng->txt("yes"));
428
429 $left->setCurrentBlock("control_details");
430
431 $left->setVariable("CAPTION_SESSION_CONTROL_LIMIT", $lng->txt("session_max_count"));
432 $left->setVariable("VALUE_SESSION_CONTROL_LIMIT", $control_max_sessions);
433
434 $left->setVariable("CAPTION_SESSION_CONTROL_IDLE_MIN", $lng->txt("session_min_idle"));
435 $left->setVariable("VALUE_SESSION_CONTROL_IDLE_MIN", $control_min_idle);
436
437 $left->setVariable("CAPTION_SESSION_CONTROL_IDLE_MAX", $lng->txt("session_max_idle"));
438 $left->setVariable("VALUE_SESSION_CONTROL_IDLE_MAX", $control_max_idle);
439
440 $left->setVariable("CAPTION_SESSION_CONTROL_IDLE_FIRST", $lng->txt("session_max_idle_after_first_request"));
441 $left->setVariable("VALUE_SESSION_CONTROL_IDLE_FIRST", $control_max_idle_first);
442
443 $left->parseCurrentBlock();
444 }
445
446 // sync button
447 if ($ilAccess->checkAccess("write", "", (int) $_REQUEST["ref_id"])) {
448 $left->setVariable("URL_SYNC", $ilCtrl->getFormAction($this, "adminSync"));
449 $left->setVariable("CMD_SYNC", "adminSync");
450 $left->setVariable("TXT_SYNC", $lng->txt("trac_sync_session_stats"));
451 }
452
453 return $left->get();
454 }
455
456 protected function buildData($a_time_from, $a_time_to, $a_title)
457 {
458 global $lng;
459
460 // basic data - time related
461
462 $maxed_out_duration = round(ilSessionStatistics::getMaxedOutDuration($a_time_from, $a_time_to)/60);
463 $counters = ilSessionStatistics::getNumberOfSessionsByType($a_time_from, $a_time_to);
464 $opened = (int) $counters["opened"];
465 $closed_limit = (int) $counters["closed_limit"];
466 unset($counters["opened"]);
467 unset($counters["closed_limit"]);
468
469
470 // build center column
471
472 $data = array();
473
475 $data["title"] = $a_title . " (" .
477 new ilDateTime($a_time_from, IL_CAL_UNIX),
478 new ilDateTime($a_time_to, IL_CAL_UNIX)
479 ) . ")";
480
481 $data["maxed_out_time"] = array($lng->txt("trac_maxed_out_time"), $maxed_out_duration);
482 $data["maxed_out_counter"] = array($lng->txt("trac_maxed_out_counter"), $closed_limit);
483 $data["opened"] = array($lng->txt("trac_sessions_opened"), $opened);
484 $data["closed"] = array($lng->txt("trac_sessions_closed"), array_sum($counters));
485 foreach ($counters as $type => $counter) {
486 $data["closed_details"][] = array($lng->txt("trac_" . $type), (int) $counter);
487 }
488
489 $data["active"] = ilSessionStatistics::getActiveSessions($a_time_from, $a_time_to);
490
491 return $data;
492 }
493
494 protected function render($a_data, $a_scale, $a_measure = null)
495 {
496 global $lng;
497
498 $center = new ilTemplate("tpl.session_statistics_center.html", true, true, "Services/Authentication");
499
500 foreach ($a_data as $idx => $item) {
501 switch ($idx) {
502 case "active":
503 case "title":
504 // nothing to do
505 break;
506
507 case "closed_details":
508 $center->setCurrentBlock("closed_details");
509 foreach ($item as $detail) {
510 $center->setVariable("CAPTION_CLOSED_DETAILS", $detail[0]);
511 $center->setVariable("VALUE_CLOSED_DETAILS", $detail[1]);
512 $center->parseCurrentBlock();
513 }
514 break;
515
516 default:
517 $tpl_var = strtoupper($idx);
518 $center->setVariable("CAPTION_" . $tpl_var, $item[0]);
519 $center->setVariable("VALUE_" . $tpl_var, $item[1]);
520 break;
521 }
522 }
523
524 if ($a_data["active"]) {
525 $center->setVariable("CHART", $this->getChart($a_data["active"], $a_data["title"], $a_scale, $a_measure));
526 } else {
527 ilUtil::sendInfo($lng->txt("trac_session_statistics_no_data"));
528 }
529
530 return $center->get();
531 }
532
542 protected function getChart($a_data, $a_title, $a_scale = self::SCALE_DAY, $a_measure = null)
543 {
544 global $lng;
545
546 include_once "Services/Chart/classes/class.ilChart.php";
548 $chart->setsize(700, 500);
549 $chart->setYAxisToInteger(true);
550
551 $legend = new ilChartLegend();
552 $chart->setLegend($legend);
553
554 if (!$a_measure) {
555 $a_measure = array("min", "avg", "max");
556 } elseif (!is_array($a_measure)) {
557 $a_measure = array($a_measure);
558 }
559
560 $colors_map = array("min" => "#00cc00",
561 "avg" => "#0000cc",
562 "max" => "#cc00cc");
563
564 $colors = $act_line = array();
565 foreach ($a_measure as $measure) {
566 $act_line[$measure] = $chart->getDataInstance(ilChartGrid::DATA_LINES);
567 $act_line[$measure]->setLineSteps(true);
568 $act_line[$measure]->setLabel($lng->txt("trac_session_active_" . $measure));
569 $colors[] = $colors_map[$measure];
570 }
571
572 if ($a_scale != self::SCALE_PERIODIC_WEEK) {
573 $max_line = $chart->getDataInstance(ilChartGrid::DATA_LINES);
574 $max_line->setLabel($lng->txt("session_max_count"));
575 $colors[] = "#cc0000";
576 }
577
578 $chart->setColors($colors);
579
580 $chart_data = $this->adaptDataToScale($a_scale, $a_data, 700);
581 unset($a_data);
582
583 $scale = ceil(sizeof($chart_data)/5);
584 $labels = array();
585 foreach ($chart_data as $idx => $item) {
586 $date = $item["slot_begin"];
587
588 if ($a_scale == self::SCALE_PERIODIC_WEEK || !($idx % ceil($scale))) {
589 switch ($a_scale) {
590 case self::SCALE_DAY:
591 $labels[$date] = date("H:i", $date);
592 break;
593
594 case self::SCALE_WEEK:
595 $labels[$date] = date("d.m. H", $date) . "h";
596 break;
597
599 $labels[$date] = date("d.m.", $date);
600 break;
601
602 case self::SCALE_YEAR:
603 $labels[$date] = date("Y-m", $date);
604 break;
605
607 $day = substr($date, 0, 1);
608 $hour = substr($date, 1, 2);
609 $min = substr($date, 3, 2);
610
611 // build ascending scale from day values
612 $day_value = ($day-1)*60*60*24;
613 $date = $day_value+$hour*60*60+$min*60;
614
615 // 6-hour interval labels
616 if ($hour != $old_hour && $hour && $hour%6 == 0) {
617 $labels[$date] = $hour;
618 $old_hour = $hour;
619 }
620 // day label
621 if ($day != $old_day) {
622 $labels[$date] = ilCalendarUtil::_numericDayToString($day, false);
623 $old_day = $day;
624 }
625 break;
626 }
627 }
628
629 foreach ($a_measure as $measure) {
630 $value = (int) $item["active_" . $measure];
631 $act_line[$measure]->addPoint($date, $value);
632 }
633
634 if ($a_scale != self::SCALE_PERIODIC_WEEK) {
635 $max_line->addPoint($date, (int) $item["max_sessions"]);
636 }
637 }
638
639 foreach ($act_line as $line) {
640 $chart->addData($line);
641 }
642 if ($a_scale != self::SCALE_PERIODIC_WEEK) {
643 $chart->addData($max_line);
644 }
645
646 $chart->setTicks($labels, null, true);
647
648 return $chart->getHTML();
649 }
650
651 protected function adaptDataToScale($a_scale, array $a_data)
652 {
653 // can we use original data?
654 switch ($a_scale) {
655 case self::SCALE_DAY:
656 // 96 values => ok
657 // fallthrough
658
659 case self::SCALE_WEEK:
660 // 672 values => ok
661 return $a_data;
662 }
663
664 $tmp = array();
665 foreach ($a_data as $item) {
666 $date_parts = getdate($item["slot_begin"]);
667
668 // aggregate slots for scale
669 switch ($a_scale) {
671 // aggregate to hours => 720 values
672 $slot = mktime($date_parts["hours"], 0, 0, $date_parts["mon"], $date_parts["mday"], $date_parts["year"]);
673 break;
674
675 case self::SCALE_YEAR:
676 // aggregate to days => 365 values
677 $slot = mktime(0, 0, 1, $date_parts["mon"], $date_parts["mday"], $date_parts["year"]);
678 break;
679
681 // aggregate to weekdays => 672 values
682 $day = $date_parts["wday"];
683 if (!$day) {
684 $day = 7;
685 }
686 $slot = $day . date("His", $item["slot_begin"]);
687 break;
688 }
689
690 // process minx/max, prepare avg
691 foreach ($item as $id => $value) {
692 switch (substr($id, -3)) {
693 case "min":
694 if (!$tmp[$slot][$id] || $value < $tmp[$slot][$id]) {
695 $tmp[$slot][$id] = $value;
696 }
697 break;
698
699 case "max":
700 if (!$tmp[$slot][$id] || $value > $tmp[$slot][$id]) {
701 $tmp[$slot][$id] = $value;
702 }
703 break;
704
705 case "avg":
706 $tmp[$slot][$id][] = $value;
707 break;
708 }
709 }
710 }
711
712 foreach ($tmp as $slot => $attr) {
713 $tmp[$slot]["active_avg"] = (int) round(array_sum($attr["active_avg"])/sizeof($attr["active_avg"]));
714 $tmp[$slot]["slot_begin"] = $slot;
715 }
716 ksort($tmp);
717 return array_values($tmp);
718 }
719
720 protected function adminSync()
721 {
722 global $ilCtrl, $lng;
723
724 // see ilSession::_writeData()
725 $now = time();
728
729 ilUtil::sendSuccess($lng->txt("trac_sync_session_stats_success"), true);
730 $ilCtrl->redirect($this);
731 }
732
733 protected function exportCSV(array $a_data, $a_scale)
734 {
735 global $lng, $ilClientIniFile, $ilUser;
736
738 include_once './Services/Link/classes/class.ilLink.php';
739
740 include_once "./Services/Utilities/classes/class.ilCSVWriter.php";
741 $csv = new ilCSVWriter();
742 $csv->setSeparator(";");
743
744 $now = time();
745
746 // meta
747 $meta = array(
748 $lng->txt("trac_name_of_installation") => $ilClientIniFile->readVariable('client', 'name'),
749 $lng->txt("trac_report_date") => ilDatePresentation::formatDate(new ilDateTime($now, IL_CAL_UNIX)),
750 $lng->txt("trac_report_owner") => $ilUser->getFullName(),
751 );
752 foreach ($a_data as $idx => $item) {
753 switch ($idx) {
754 case "title":
755 $meta[$lng->txt("title")] = $item;
756 break;
757
758 case "active":
759 // nothing to do
760 break;
761
762 case "closed_details":
763 foreach ($item as $detail) {
764 $meta[$a_data["closed"][0] . " - " . $detail[0]] = $detail[1];
765 }
766 break;
767
768 default:
769 $meta[$item[0]] = $item[1];
770 break;
771 }
772 }
773 foreach ($meta as $caption => $value) {
774 $csv->addColumn(strip_tags($caption));
775 $csv->addColumn(strip_tags($value));
776 $csv->addRow();
777 }
778 $csv->addRow();
779
780 // aggregate data
781 $aggr_data = $this->adaptDataToScale($a_scale, $a_data["active"], 700);
782 unset($a_data);
783
784 // header
785 $first = $aggr_data;
786 $first = array_keys(array_shift($first));
787 foreach ($first as $column) {
788 // split weekday and time slot again
789 if ($a_scale == self::SCALE_PERIODIC_WEEK && $column == "slot_begin") {
790 $csv->addColumn("weekday");
791 $csv->addColumn("time");
792 } else {
793 $csv->addColumn(strip_tags($column));
794 }
795 }
796 $csv->addRow();
797
798 // data
799 foreach ($aggr_data as $row) {
800 foreach ($row as $column => $value) {
801 if (is_array($value)) {
802 $value = implode(', ', $value);
803 }
804 switch ($column) {
805 case "slot_begin":
806 // split weekday and time slot again
807 if ($a_scale == self::SCALE_PERIODIC_WEEK) {
808 $csv->addColumn(ilCalendarUtil::_numericDayToString(substr($value, 0, 1)));
809 $value = substr($value, 1, 2) . ":" . substr($value, 3, 2);
810 break;
811 }
812 // fallthrough
813
814 // no break
815 case "slot_end":
816 $value = date("d.m.Y H:i", $value);
817 break;
818 }
819 $csv->addColumn(strip_tags($value));
820 }
821 $csv->addRow();
822 }
823
824 // send
825 $filename .= "session_statistics_" . date("Ymd", $now) . ".csv";
826 header("Content-type: text/comma-separated-values");
827 header("Content-Disposition: attachment; filename=\"" . $filename . "\"");
828 header("Expires: 0");
829 header("Cache-Control: must-revalidate, post-check=0,pre-check=0");
830 header("Pragma: public");
831 echo $csv->getCSVString();
832 exit();
833 }
834}
date( 'd-M-Y', $objPHPExcel->getProperties() ->getCreated())
$column
Definition: 39dropdown.php:62
$tpl
Definition: ilias.php:10
An exception for terminatinating execution or to throw for unit testing.
const IL_CAL_UNIX
Helper class to generate CSV files.
static parseIncomingDate($a_value, $a_add_time=null)
Try to parse incoming value to date object.
static _numericDayToString($a_day, $a_long=true)
get
static getInstanceByType($a_type, $a_id)
Get type instance.
const TYPE_GRID
static formatDate(ilDateTime $date, $a_skip_day=false, $a_include_wd=false)
Format a date @access public.
static setUseRelativeDates($a_status)
set use relative dates
static formatPeriod(ilDateTime $start, ilDateTime $end, $a_skip_starting_day=false)
Format a period of two date Shows: 14.
This class represents a date/time property in a property form.
@classDescription Date and time handling
Class for single dates.
This class represents a selection list property in a property form.
static getExistingSessionCount(array $a_types)
returns number of valid sessions relating to given session types
const DEFAULT_MAX_COUNT
default value for settings that have not been defined in setup or administration yet
Class ilSessionStatisticsGUI.
importDate($a_incoming, $a_default=null)
getChart($a_data, $a_title, $a_scale=self::SCALE_DAY, $a_measure=null)
Build chart for active sessions.
buildData($a_time_from, $a_time_to, $a_title)
render($a_data, $a_scale, $a_measure=null)
exportCSV(array $a_data, $a_scale)
adaptDataToScale($a_scale, array $a_data)
static getActiveSessions($a_from, $a_to)
Get active sessions aggregated data.
static getLastAggregation()
Get timestamp of last aggregation.
static getMaxedOutDuration($a_from, $a_to)
Get maxed out duration in given timeframe.
static getLastMaxedOut()
Get latest slot during which sessions were maxed out.
static getNumberOfSessionsByType($a_from, $a_to)
Get session counters by type (opened, closed)
static aggretateRaw($a_now)
Aggregate raw session data (older than given time)
static _destroyExpiredSessions()
Destroy expired sessions.
special template class to simplify handling of ITX/PEAR
static sendSuccess($a_info="", $a_keep=false)
Send Success Message to Screen.
static sendInfo($a_info="", $a_keep=false)
Send Info Message to Screen.
$counter
if(!array_key_exists('StateId', $_REQUEST)) $id
global $ilCtrl
Definition: ilias.php:18
global $lng
Definition: privfeed.php:17
global $ilSetting
Definition: privfeed.php:17
$type
$ilUser
Definition: imgupload.php:18