ILIAS  release_5-0 Revision 5.0.0-1144-gc4397b1f870
class.ilLPObjectStatisticsLPTableGUI.php
Go to the documentation of this file.
1<?php
2/* Copyright (c) 1998-2009 ILIAS open source, Extended GPL, see docs/LICENSE */
3
4include_once("./Services/Tracking/classes/class.ilLPTableBaseGUI.php");
5include_once("./Services/Tracking/classes/class.ilLPStatus.php");
6
17{
18 protected $types = array("min", "avg", "max");
23 protected $is_chart = false;
24 protected $is_details = false;
25 protected $chart_data = array();
26
30 function __construct($a_parent_obj, $a_parent_cmd, array $a_preselect = null, $a_load_items = true, $a_is_chart = false, $a_is_details = false)
31 {
32 global $ilCtrl, $lng;
33
34 $this->preselected = $a_preselect;
35 $this->is_chart = (bool)$a_is_chart;
36 $this->is_details = (bool)$a_is_details;
37
38 $this->setId("lpobjstatlptbl");
39
40 parent::__construct($a_parent_obj, $a_parent_cmd);
41
42 if(!$this->is_details)
43 {
44 $this->setShowRowsSelector(true);
45 // $this->setLimit(ilSearchSettings::getInstance()->getMaxHits());
46
47 $this->addColumn("", "", "1%", true);
48 $this->addColumn($lng->txt("trac_title"), "title");
49 $this->addColumn($lng->txt("object_id"), "obj_id");
50 }
51 else
52 {
53 $this->setLimit(20);
54
55 $this->addColumn($lng->txt("trac_figure"));
56 }
57
58 $this->initFilter();
59
60 if(strpos($this->filter["yearmonth"], "-") === false)
61 {
62 foreach($this->getMonthsYear($this->filter["yearmonth"]) as $num => $caption)
63 {
64 $this->addColumn($caption, "month_".$num, "", false, "ilRight");
65 }
66 }
67 else
68 {
69 foreach($this->types as $type)
70 {
71 if($type != "avg")
72 {
73 $caption = " ".$this->lng->txt("trac_object_stat_lp_".$type);
74 }
75 else
76 {
77 $caption = " &#216;";
78 }
79 $this->addColumn($lng->txt("trac_members_short").$caption, "mem_cnt_".$type, "", false, "ilRight");
80 }
81
82 include_once("./Services/Tracking/classes/class.ilLearningProgressBaseGUI.php");
83 foreach($this->status as $status)
84 {
87 $icon = ilUtil::img($path, $text);
88
89 foreach($this->types as $type)
90 {
91 if($type != "avg")
92 {
93 $caption = $icon.$this->lng->txt("trac_object_stat_lp_".$type);
94 }
95 else
96 {
97 $caption = $icon." &#216;";
98 }
99 $this->addColumn($caption, $status."_".$type, "", false, "ilRight");
100 }
101 }
102 }
103
104 if(!$this->is_details)
105 {
106 $this->setTitle($this->lng->txt("trac_object_stat_lp"));
107
108 // $this->setSelectAllCheckbox("item_id");
109 $this->addMultiCommand("showLearningProgressGraph", $lng->txt("trac_show_graph"));
110 $this->setResetCommand("resetLearningProgressFilter");
111 $this->setFilterCommand("applyLearningProgressFilter");
112 }
113
114 $this->setFormAction($ilCtrl->getFormAction($a_parent_obj, $a_parent_cmd));
115 $this->setRowTemplate("tpl.lp_object_statistics_lp_row.html", "Services/Tracking");
116 $this->setEnableHeader(true);
117 $this->setEnableNumInfo(true);
118 $this->setEnableTitle(true);
119 $this->setDefaultOrderField("title");
120 $this->setDefaultOrderDirection("asc");
121
122 $this->status_map = array(ilLPStatus::LP_STATUS_NOT_ATTEMPTED_NUM => "not_attempted",
126
127 if($a_load_items)
128 {
129 if($this->is_details)
130 {
131 $this->getDetailItems($this->preselected[0]);
132 }
133 else
134 {
136 $this->getItems();
137 }
138 }
139 }
140
141 public function numericOrdering($a_field)
142 {
143 if($a_field != "title")
144 {
145 return true;
146 }
147 return false;
148 }
149
153 public function initFilter()
154 {
155 global $lng;
156
157 $this->setDisableFilterHiding(true);
158
159 // object type selection
160 include_once("./Services/Form/classes/class.ilSelectInputGUI.php");
161 /*
162 $si = new ilSelectInputGUI($lng->txt("obj_type"), "type");
163 $options = $this->getPossibleTypes(true);
164 $si->setOptions($options);
165 $this->addFilterItem($si);
166 $si->readFromSession();
167 if(!$si->getValue())
168 {
169 $si->setValue("crs");
170 }
171 $this->filter["type"] = $si->getValue();
172
173 $this->filter_captions[] = $options[$this->filter["type"]];
174 */
175 $this->filter["type"] = "crs";
176
177
178 // title/description
179 include_once("./Services/Form/classes/class.ilTextInputGUI.php");
180 $ti = new ilTextInputGUI($lng->txt("trac_title_description"), "query");
181 $ti->setMaxLength(64);
182 $ti->setSize(20);
183 $this->addFilterItem($ti);
184 $ti->readFromSession();
185 $this->filter["query"] = $ti->getValue();
186
187 // year/month
188 $si = new ilSelectInputGUI($lng->txt("year")." / ".$lng->txt("month"), "yearmonth");
189 $si->setOptions($this->getMonthsFilter());
190 $this->addFilterItem($si);
191 $si->readFromSession();
192 if(!$si->getValue())
193 {
194 $si->setValue(date("Y-m"));
195 }
196 $this->filter["yearmonth"] = $si->getValue();
197
198 if(!strpos($this->filter["yearmonth"], "-"))
199 {
200 $si = new ilSelectInputGUI($lng->txt("trac_figure"), "figure");
201 $options = array(
202 "mem_cnt_max" => $lng->txt("members")." ".$lng->txt("trac_object_stat_lp_max"),
203 "mem_cnt_avg" => $lng->txt("members")." &#216;",
204 // we are using the db column names here (not the lp constants)!
205 "in_progress_max" => ilLearningProgressBaseGUI::_getStatusText(ilLPStatus::LP_STATUS_IN_PROGRESS_NUM)." ".$lng->txt("trac_object_stat_lp_max"),
207 $si->setOptions($options);
208 $this->addFilterItem($si);
209 $si->readFromSession();
210 if(!$si->getValue())
211 {
212 $si->setValue("mem_cnt_max");
213 }
214 $this->filter["measure"] = $si->getValue();
215 }
216
217 if($this->is_details)
218 {
219 $this->filters = array();
220 }
221 }
222
223 function getItems()
224 {
225 $data = array();
226 $all_status = array_merge(array("mem_cnt"), $this->status);
227
228 $objects = $this->searchObjects($this->getCurrentFilter(true), "read");
229 if($objects)
230 {
231 $objects = array_keys($objects);
232
233 include_once "Services/Tracking/classes/class.ilTrQuery.php";
234
235 $yearmonth = explode("-", $this->filter["yearmonth"]);
236 if(sizeof($yearmonth) == 1)
237 {
238 foreach(ilTrQuery::getObjectLPStatistics($objects, $yearmonth[0]) as $item)
239 {
240 $obj_id = $item["obj_id"];
241 if(!isset($data[$obj_id]))
242 {
243 $data[$obj_id]["obj_id"] = $obj_id;
244 $data[$obj_id]["title"] = ilObject::_lookupTitle($obj_id);
245 }
246
247 $measure_type = substr($this->filter["measure"], -3);
248 $measure_field = substr($this->filter["measure"], 0, -4);
249 $value = $item[$measure_field."_".$measure_type];
250 $idx = $item["yyyy"]."-".str_pad($item["mm"], 2, "0", STR_PAD_LEFT);
251 $data[$obj_id]["month_".$idx] = $value;
252 }
253
254 if($this->is_chart)
255 {
256 // get data for single days (used in chart display)
257 foreach(array_keys($this->getMonthsYear($yearmonth[0])) as $num)
258 {
259 $num = (int)array_pop(explode("-", $num));
260 foreach(ilTrQuery::getObjectLPStatistics($objects, $yearmonth[0], $num, true) as $item)
261 {
262 $idx = $yearmonth[0].
263 "-".str_pad($num, 2, "0", STR_PAD_LEFT).
264 "-".str_pad($item["dd"], 2, "0", STR_PAD_LEFT);
265 $this->chart_data[$item["obj_id"]][$idx] = $item;
266 }
267 }
268 }
269 }
270 else
271 {
272 // get data aggregated for month
273 foreach(ilTrQuery::getObjectLPStatistics($objects, $yearmonth[0], (int)$yearmonth[1]) as $item)
274 {
275 $obj_id = $item["obj_id"];
276 if(!isset($data[$obj_id]))
277 {
278 $data[$obj_id]["obj_id"] = $obj_id;
279 $data[$obj_id]["title"] = ilObject::_lookupTitle($obj_id);
280 $this->initRow($data[$obj_id]);
281 }
282
283 foreach($all_status as $status)
284 {
285 // status-id to field name
286 if(is_numeric($status))
287 {
288 $field = $this->status_map[$status];
289 }
290 else
291 {
292 $field = $status;
293 }
294
295 // aggregated fields
296 foreach($this->types as $type)
297 {
298 $value = $item[$field."_".$type];
299 $data[$obj_id][$status."_".$type] = $value;
300 }
301 }
302 }
303
304 if($this->is_chart)
305 {
306 // get data for single days (used in chart display)
307 foreach(ilTrQuery::getObjectLPStatistics($objects, $yearmonth[0], (int)$yearmonth[1], true) as $item)
308 {
309 $this->chart_data[$item["obj_id"]][$item["dd"]] = $item;
310 }
311 }
312 }
313
314 // add objects with no usage data
315 foreach($objects as $obj_id)
316 {
317 if(!isset($data[$obj_id]))
318 {
319 $data[$obj_id]["obj_id"] = $obj_id;
320 $data[$obj_id]["title"] = ilObject::_lookupTitle($obj_id);
321 }
322 }
323 }
324
325 $this->setData($data);
326
327 include_once "./Services/Link/classes/class.ilLink.php";
328 }
329
330 protected function getDetailItems($a_obj_id)
331 {
332 $data = array();
333 $all_status = array_merge(array("mem_cnt"), $this->status);
334
335 include_once "Services/Tracking/classes/class.ilTrQuery.php";
336 foreach(ilTrQuery::getObjectLPStatistics(array($a_obj_id), $this->filter["yearmonth"]) as $item)
337 {
338 $month = "month_".$item["yyyy"]."-".str_pad($item["mm"], 2, "0", STR_PAD_LEFT);
339
340 foreach($all_status as $status)
341 {
342 // status-id to field name
343 if($status != "mem_cnt")
344 {
345 $field = $this->status_map[$status];
346 }
347 else
348 {
349 $field = $status;
350 }
351 // aggregated fields
352 foreach($this->types as $type)
353 {
354 $value = $item[$field."_".$type];
355 $idx = $item["yyyy"]."-".str_pad($item["mm"], 2, "0", STR_PAD_LEFT);
356 $data[$status."_".$type]["month_".$idx] = $value;
357 }
358 }
359 }
360
361 // add captions
362 foreach(array_keys($data) as $figure)
363 {
364 $status = substr($figure, 0, -4);
365 $type = substr($figure, -3);
366
367 if($status != "mem_cnt")
368 {
371 $icon = ilUtil::img($path, $text);
372 $text = $icon." ".$text;
373 }
374 else
375 {
376 $text = $this->lng->txt("members");
377 }
378 if($type != "avg")
379 {
380 $caption = $text." ".$this->lng->txt("trac_object_stat_lp_".$type);
381 }
382 else
383 {
384 $caption = $text." &#216;";
385 }
386 $data[$figure]["figure"] = $caption;
387 }
388
389 $this->setData($data);
390 }
391
392 protected function initRow(&$a_row)
393 {
394 foreach($this->types as $type)
395 {
396 $a_row["mem_cnt_".$type] = null;
397 }
398 foreach($this->status as $status)
399 {
400 foreach($this->types as $type)
401 {
402 $a_row[$status."_".$type] = null;
403 }
404 }
405 }
406
410 protected function fillRow($a_set)
411 {
412 global $ilCtrl;
413
414 if(!$this->is_details)
415 {
416 $type = ilObject::_lookupType($a_set["obj_id"]);
417
418 // ajax details layer link
419 if(strpos($this->filter["yearmonth"], "-") === false)
420 {
421 $ilCtrl->setParameter($this->parent_obj, "item_id", $a_set["obj_id"]);
422 $url = $ilCtrl->getLinkTarget($this->parent_obj, "showLearningProgressDetails");
423 $a_set["title"] .= " (<a href=\"#\" onclick=\"ilObjStat.showLPDetails(event, '".$url."');\">Details</a>)";
424 $ilCtrl->setParameter($this->parent_obj, "item_id", "");
425 }
426
427 $this->tpl->setCurrentBlock("checkbox");
428 $this->tpl->setVariable("OBJ_ID", $a_set["obj_id"]);
429 $this->tpl->setVariable("ICON_SRC", ilObject::_getIcon("", "tiny", $type));
430 $this->tpl->setVariable("ICON_ALT", $this->lng->txt($type));
431 $this->tpl->setVariable("TITLE_TEXT", $a_set["title"]);
432 if($this->preselected && in_array($a_set["obj_id"], $this->preselected))
433 {
434 $this->tpl->setVariable("CHECKBOX_STATE", " checked=\"checked\"");
435 }
436 $this->tpl->parseCurrentBlock();
437 }
438 else
439 {
440 $this->tpl->setCurrentBlock("details");
441 $this->tpl->setVariable("TXT_FIGURE", $a_set["figure"]);
442 $this->tpl->parseCurrentBlock();
443 }
444
445 $this->tpl->setCurrentBlock("item");
446
447 if(strpos($this->filter["yearmonth"], "-") === false)
448 {
449 foreach(array_keys($this->getMonthsYear($this->filter["yearmonth"])) as $num)
450 {
451 $value = $this->anonymizeValue((int)$a_set["month_".$num]);
452 $this->tpl->setVariable("ITEM_VALUE", $value);
453 $this->tpl->parseCurrentBlock();
454 }
455 }
456 else
457 {
458 foreach($this->types as $type)
459 {
460 $this->tpl->setVariable("ITEM_VALUE", $this->anonymizeValue((int)$a_set["mem_cnt_".$type]));
461 $this->tpl->parseCurrentBlock();
462 }
463 foreach($this->status as $status)
464 {
465 foreach($this->types as $type)
466 {
467 $this->tpl->setVariable("ITEM_VALUE", $this->anonymizeValue((int)$a_set[$status."_".$type]));
468 $this->tpl->parseCurrentBlock();
469 }
470 }
471 }
472 }
473
474 function getGraph(array $a_graph_items)
475 {
476 global $lng;
477
478 $a_graph_items = array(array_pop($a_graph_items));
479
480 include_once "Services/Chart/classes/class.ilChart.php";
482 $chart->setsize(700, 500);
483
484 $legend = new ilChartLegend();
485 $chart->setLegend($legend);
486
487 // needed for correct stacking
488 $custom_order = array(
489 ilLPStatus::LP_STATUS_IN_PROGRESS_NUM => array("#f7d408", "#fffa00"),
490 ilLPStatus::LP_STATUS_FAILED_NUM => array("#cf0202", "#f15b5b"),
491 ilLPStatus::LP_STATUS_COMPLETED_NUM => array("#17aa0e", "#6ce148"),
492 ilLPStatus::LP_STATUS_NOT_ATTEMPTED_NUM => array("#a4a4a4", "#c4c4c4")
493 );
494
495 $chart->setColors(array());
496
497 $max_value = 0;
498 foreach($this->chart_data as $object_id => $days)
499 {
500 if(in_array($object_id, $a_graph_items))
501 {
502 $series = array();
503 foreach($custom_order as $status => $colors)
504 {
505 /*
506 if(strpos($this->filter["yearmonth"], "-") === false)
507 {
508 $series[$status] = new ilChartData("lines");
509 $series[$status]->setLineSteps(true);
510 }
511 else
512 {
513 $series[$status] = new ilChartData("bars");
514 $series[$status]->setBarOptions(0.75);
515 $series[$status]->setFill(true, $colors[1]);
516 }
517 $series[$status]->setStackingId($object_id);
518 */
519 $series[$status] = $chart->getDataInstance(ilChartGrid::DATA_LINES);
520
522 $chart_colors[] = $colors[0];
523 }
524 $chart->setColors($chart_colors);
525
526 if(strpos($this->filter["yearmonth"], "-") === false)
527 {
528 $x_axis = $this->lng->txt("month");
529
530 $counter = 0;
531 foreach(array_keys($this->getMonthsYear($this->filter["yearmonth"])) as $month)
532 {
533 for($loop = 1; $loop<32; $loop++)
534 {
535 $item_day = $month."-".str_pad($loop, 2, "0", STR_PAD_LEFT);
536 foreach(array_keys($custom_order) as $status)
537 {
538 if(isset($days[$item_day]))
539 {
540 // as there is only 1 entry per day, avg == sum
541 $value = (int)$days[$item_day][$this->status_map[$status]."_avg"];
542 }
543 else
544 {
545 $value = 0;
546 }
547 $max_value = max($max_value, $value);
548 $value = $this->anonymizeValue($value, true);
549 $series[$status]->addPoint($counter, $value);
550 }
551 $counter++;
552 }
553 }
554 }
555 else
556 {
557 $x_axis = $this->lng->txt("day");
558 for($loop = 1; $loop<32; $loop++)
559 {
560 foreach(array_keys($custom_order) as $status)
561 {
562 if(isset($days[$loop]))
563 {
564 // as there is only 1 entry per day, avg == sum
565 $value = (int)$days[$loop][$this->status_map[$status]."_avg"];
566 }
567 else
568 {
569 $value = 0;
570 }
571 $max_value = max($max_value, $value);
572 $value = $this->anonymizeValue($value, true);
573 $series[$status]->addPoint($loop, $value);
574 }
575 }
576 }
577
578 foreach(array_keys($custom_order) as $status)
579 {
580 $chart->addData($series[$status]);
581 }
582 }
583 }
584
585 $value_ticks = $this->buildValueScale($max_value, true);
586
587 $labels = array();
588 if(strpos($this->filter["yearmonth"], "-") === false)
589 {
590 $counter = 0;
591 foreach($this->getMonthsYear($this->filter["yearmonth"], true) as $caption)
592 {
593 $labels[$counter] = $caption;
594 $counter += 31;
595 }
596 }
597 else
598 {
599 for($loop = 1; $loop<32; $loop++)
600 {
601 $labels[$loop] = $loop.".";
602 }
603 }
604 $chart->setTicks($labels, $value_ticks, true);
605
606 return $chart->getHTML();
607 }
608
610 {
611 global $tpl;
612
613 include_once("./Services/YUI/classes/class.ilYuiUtil.php");
615 include_once("./Services/jQuery/classes/class.iljQueryUtil.php");
617
618 $tpl->addJavascript("./Services/Tracking/js/ilObjStat.js");
619 }
620
621}
622
623?>
global $tpl
Definition: ilias.php:8
static getInstanceByType($a_type, $a_id)
Get type instance.
const TYPE_GRID
TableGUI class for learning progress.
__construct($a_parent_obj, $a_parent_cmd, array $a_preselect=null, $a_load_items=true, $a_is_chart=false, $a_is_details=false)
Constructor.
numericOrdering($a_field)
Should this field be sorted numeric?
const LP_STATUS_COMPLETED_NUM
const LP_STATUS_IN_PROGRESS_NUM
const LP_STATUS_NOT_ATTEMPTED_NUM
const LP_STATUS_FAILED_NUM
TableGUI class for learning progress.
searchObjects(array $filter, $permission, array $preset_obj_ids=null)
Search objects that match current filters.
getCurrentFilter($as_query=false)
getMonthsYear($a_year=null, $a_short=false)
buildValueScale($a_max_value, $a_anonymize=false, $a_format_seconds=false)
anonymizeValue($a_value, $a_force_number=false)
getMonthsFilter($a_short=false)
_getImagePathForStatus($a_status)
Get image path for status.
_getStatusText($a_status)
Get status alt text.
static _lookupTitle($a_id)
lookup object title
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
This class represents a selection list property in a property form.
addColumn($a_text, $a_sort_field="", $a_width="", $a_is_checkbox_action_column=false, $a_class="", $a_tooltip="")
Add a column to the header.
setEnableHeader($a_enableheader)
Set Enable Header.
setDisableFilterHiding($a_val=true)
Set disable filter hiding.
setShowRowsSelector($a_value)
Toggle rows-per-page selector.
setTitle($a_title, $a_icon=0, $a_icon_alt=0)
Set title and title icon.
setData($a_data)
set table data @access public
setResetCommand($a_val, $a_caption=null)
Set reset filter command.
setEnableTitle($a_enabletitle)
Set Enable Title.
setEnableNumInfo($a_val)
Set enable num info.
setRowTemplate($a_template, $a_template_dir="")
Set row template.
addMultiCommand($a_cmd, $a_text)
Add Command button.
addFilterItem($a_input_item, $a_optional=false)
Add filter item.
setDefaultOrderField($a_defaultorderfield)
Set Default order field.
setId($a_val)
Set id.
setFormAction($a_form_action, $a_multipart=false)
Set Form action parameter.
setDefaultOrderDirection($a_defaultorderdirection)
Set Default order direction.
setFilterCommand($a_val, $a_caption=null)
Set filter command.
setLimit($a_limit=0, $a_default_limit=0)
set max.
This class represents a text property in a property form.
static getObjectLPStatistics(array $a_obj_ids, $a_year, $a_month=null, $a_group_by_day=false)
static img($a_src, $a_alt="", $a_width="", $a_height="", $a_border=0, $a_id="", $a_class="")
Build img tag.
static initPanel($a_resize=false)
Init yui panel.
static initjQuery($a_tpl=null)
Init jQuery.
global $ilCtrl
Definition: ilias.php:18
global $lng
Definition: privfeed.php:40
$path
Definition: index.php:22
if(!is_array($argv)) $options