ILIAS  release_5-1 Revision 5.0.0-5477-g43f3e3fab5f
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 {
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(
229 $this->getCurrentFilter(true),
230 "read",
231 null,
232 false
233 );
234 if($objects)
235 {
236 $objects = array_keys($objects);
237
238 include_once "Services/Tracking/classes/class.ilTrQuery.php";
239
240 $yearmonth = explode("-", $this->filter["yearmonth"]);
241 if(sizeof($yearmonth) == 1)
242 {
243 foreach(ilTrQuery::getObjectLPStatistics($objects, $yearmonth[0]) as $item)
244 {
245 $obj_id = $item["obj_id"];
246 if(!isset($data[$obj_id]))
247 {
248 $data[$obj_id]["obj_id"] = $obj_id;
249 $data[$obj_id]["title"] = ilObject::_lookupTitle($obj_id);
250 }
251
252 $measure_type = substr($this->filter["measure"], -3);
253 $measure_field = substr($this->filter["measure"], 0, -4);
254 $value = $item[$measure_field."_".$measure_type];
255 $idx = $item["yyyy"]."-".str_pad($item["mm"], 2, "0", STR_PAD_LEFT);
256 $data[$obj_id]["month_".$idx] = $value;
257 }
258
259 if($this->is_chart)
260 {
261 // get data for single days (used in chart display)
262 foreach(array_keys($this->getMonthsYear($yearmonth[0])) as $num)
263 {
264 $num = (int)array_pop(explode("-", $num));
265 foreach(ilTrQuery::getObjectLPStatistics($objects, $yearmonth[0], $num, true) as $item)
266 {
267 $idx = $yearmonth[0].
268 "-".str_pad($num, 2, "0", STR_PAD_LEFT).
269 "-".str_pad($item["dd"], 2, "0", STR_PAD_LEFT);
270 $this->chart_data[$item["obj_id"]][$idx] = $item;
271 }
272 }
273 }
274 }
275 else
276 {
277 // get data aggregated for month
278 foreach(ilTrQuery::getObjectLPStatistics($objects, $yearmonth[0], (int)$yearmonth[1]) as $item)
279 {
280 $obj_id = $item["obj_id"];
281 if(!isset($data[$obj_id]))
282 {
283 $data[$obj_id]["obj_id"] = $obj_id;
284 $data[$obj_id]["title"] = ilObject::_lookupTitle($obj_id);
285 $this->initRow($data[$obj_id]);
286 }
287
288 foreach($all_status as $status)
289 {
290 // status-id to field name
291 if(is_numeric($status))
292 {
293 $field = $this->status_map[$status];
294 }
295 else
296 {
297 $field = $status;
298 }
299
300 // aggregated fields
301 foreach($this->types as $type)
302 {
303 $value = $item[$field."_".$type];
304 $data[$obj_id][$status."_".$type] = $value;
305 }
306 }
307 }
308
309 if($this->is_chart)
310 {
311 // get data for single days (used in chart display)
312 foreach(ilTrQuery::getObjectLPStatistics($objects, $yearmonth[0], (int)$yearmonth[1], true) as $item)
313 {
314 $this->chart_data[$item["obj_id"]][$item["dd"]] = $item;
315 }
316 }
317 }
318
319 // add objects with no usage data
320 foreach($objects as $obj_id)
321 {
322 if(!isset($data[$obj_id]))
323 {
324 $data[$obj_id]["obj_id"] = $obj_id;
325 $data[$obj_id]["title"] = ilObject::_lookupTitle($obj_id);
326 }
327 }
328 }
329
330 $this->setData($data);
331
332 include_once "./Services/Link/classes/class.ilLink.php";
333 }
334
335 protected function getDetailItems($a_obj_id)
336 {
337 $data = array();
338 $all_status = array_merge(array("mem_cnt"), $this->status);
339
340 include_once "Services/Tracking/classes/class.ilTrQuery.php";
341 foreach(ilTrQuery::getObjectLPStatistics(array($a_obj_id), $this->filter["yearmonth"]) as $item)
342 {
343 $month = "month_".$item["yyyy"]."-".str_pad($item["mm"], 2, "0", STR_PAD_LEFT);
344
345 foreach($all_status as $status)
346 {
347 // status-id to field name
348 if($status != "mem_cnt")
349 {
350 $field = $this->status_map[$status];
351 }
352 else
353 {
354 $field = $status;
355 }
356 // aggregated fields
357 foreach($this->types as $type)
358 {
359 $value = $item[$field."_".$type];
360 $idx = $item["yyyy"]."-".str_pad($item["mm"], 2, "0", STR_PAD_LEFT);
361 $data[$status."_".$type]["month_".$idx] = $value;
362 }
363 }
364 }
365
366 // add captions
367 foreach(array_keys($data) as $figure)
368 {
369 $status = substr($figure, 0, -4);
370 $type = substr($figure, -3);
371
372 if($status != "mem_cnt")
373 {
377 $text = $icon." ".$text;
378 }
379 else
380 {
381 $text = $this->lng->txt("members");
382 }
383 if($type != "avg")
384 {
385 $caption = $text." ".$this->lng->txt("trac_object_stat_lp_".$type);
386 }
387 else
388 {
389 $caption = $text." &#216;";
390 }
391 $data[$figure]["figure"] = $caption;
392 }
393
394 $this->setData($data);
395 }
396
397 protected function initRow(&$a_row)
398 {
399 foreach($this->types as $type)
400 {
401 $a_row["mem_cnt_".$type] = null;
402 }
403 foreach($this->status as $status)
404 {
405 foreach($this->types as $type)
406 {
407 $a_row[$status."_".$type] = null;
408 }
409 }
410 }
411
415 protected function fillRow($a_set)
416 {
417 global $ilCtrl;
418
419 if(!$this->is_details)
420 {
421 $type = ilObject::_lookupType($a_set["obj_id"]);
422
423 // ajax details layer link
424 if(strpos($this->filter["yearmonth"], "-") === false)
425 {
426 $ilCtrl->setParameter($this->parent_obj, "item_id", $a_set["obj_id"]);
427 $url = $ilCtrl->getLinkTarget($this->parent_obj, "showLearningProgressDetails");
428 $a_set["title"] .= " (<a href=\"#\" onclick=\"ilObjStat.showLPDetails(event, '".$url."');\">Details</a>)";
429 $ilCtrl->setParameter($this->parent_obj, "item_id", "");
430 }
431
432 $this->tpl->setCurrentBlock("checkbox");
433 $this->tpl->setVariable("OBJ_ID", $a_set["obj_id"]);
434 $this->tpl->setVariable("ICON_SRC", ilObject::_getIcon("", "tiny", $type));
435 $this->tpl->setVariable("ICON_ALT", $this->lng->txt($type));
436 $this->tpl->setVariable("TITLE_TEXT", $a_set["title"]);
437 if($this->preselected && in_array($a_set["obj_id"], $this->preselected))
438 {
439 $this->tpl->setVariable("CHECKBOX_STATE", " checked=\"checked\"");
440 }
441 $this->tpl->parseCurrentBlock();
442 }
443 else
444 {
445 $this->tpl->setCurrentBlock("details");
446 $this->tpl->setVariable("TXT_FIGURE", $a_set["figure"]);
447 $this->tpl->parseCurrentBlock();
448 }
449
450 $this->tpl->setCurrentBlock("item");
451
452 if(strpos($this->filter["yearmonth"], "-") === false)
453 {
454 foreach(array_keys($this->getMonthsYear($this->filter["yearmonth"])) as $num)
455 {
456 $value = $this->anonymizeValue((int)$a_set["month_".$num]);
457 $this->tpl->setVariable("ITEM_VALUE", $value);
458 $this->tpl->parseCurrentBlock();
459 }
460 }
461 else
462 {
463 foreach($this->types as $type)
464 {
465 $this->tpl->setVariable("ITEM_VALUE", $this->anonymizeValue((int)$a_set["mem_cnt_".$type]));
466 $this->tpl->parseCurrentBlock();
467 }
468 foreach($this->status as $status)
469 {
470 foreach($this->types as $type)
471 {
472 $this->tpl->setVariable("ITEM_VALUE", $this->anonymizeValue((int)$a_set[$status."_".$type]));
473 $this->tpl->parseCurrentBlock();
474 }
475 }
476 }
477 }
478
479 function getGraph(array $a_graph_items)
480 {
481 global $lng;
482
483 $a_graph_items = array(array_pop($a_graph_items));
484
485 include_once "Services/Chart/classes/class.ilChart.php";
487 $chart->setsize(700, 500);
488
489 $legend = new ilChartLegend();
490 $chart->setLegend($legend);
491
492 // needed for correct stacking
493 $custom_order = array(
494 ilLPStatus::LP_STATUS_IN_PROGRESS_NUM => array("#f7d408", "#fffa00"),
495 ilLPStatus::LP_STATUS_FAILED_NUM => array("#cf0202", "#f15b5b"),
496 ilLPStatus::LP_STATUS_COMPLETED_NUM => array("#17aa0e", "#6ce148"),
497 ilLPStatus::LP_STATUS_NOT_ATTEMPTED_NUM => array("#a4a4a4", "#c4c4c4")
498 );
499
500 $chart->setColors(array());
501
502 $max_value = 0;
503 foreach($this->chart_data as $object_id => $days)
504 {
505 if(in_array($object_id, $a_graph_items))
506 {
507 $series = array();
508 foreach($custom_order as $status => $colors)
509 {
510 /*
511 if(strpos($this->filter["yearmonth"], "-") === false)
512 {
513 $series[$status] = new ilChartData("lines");
514 $series[$status]->setLineSteps(true);
515 }
516 else
517 {
518 $series[$status] = new ilChartData("bars");
519 $series[$status]->setBarOptions(0.75);
520 $series[$status]->setFill(true, $colors[1]);
521 }
522 $series[$status]->setStackingId($object_id);
523 */
524 $series[$status] = $chart->getDataInstance(ilChartGrid::DATA_LINES);
525
527 $chart_colors[] = $colors[0];
528 }
529 $chart->setColors($chart_colors);
530
531 if(strpos($this->filter["yearmonth"], "-") === false)
532 {
533 $x_axis = $this->lng->txt("month");
534
535 $counter = 0;
536 foreach(array_keys($this->getMonthsYear($this->filter["yearmonth"])) as $month)
537 {
538 for($loop = 1; $loop<32; $loop++)
539 {
540 $item_day = $month."-".str_pad($loop, 2, "0", STR_PAD_LEFT);
541 foreach(array_keys($custom_order) as $status)
542 {
543 if(isset($days[$item_day]))
544 {
545 // as there is only 1 entry per day, avg == sum
546 $value = (int)$days[$item_day][$this->status_map[$status]."_avg"];
547 }
548 else
549 {
550 $value = 0;
551 }
552 $max_value = max($max_value, $value);
553 $value = $this->anonymizeValue($value, true);
554 $series[$status]->addPoint($counter, $value);
555 }
556 $counter++;
557 }
558 }
559 }
560 else
561 {
562 $x_axis = $this->lng->txt("day");
563 for($loop = 1; $loop<32; $loop++)
564 {
565 foreach(array_keys($custom_order) as $status)
566 {
567 if(isset($days[$loop]))
568 {
569 // as there is only 1 entry per day, avg == sum
570 $value = (int)$days[$loop][$this->status_map[$status]."_avg"];
571 }
572 else
573 {
574 $value = 0;
575 }
576 $max_value = max($max_value, $value);
577 $value = $this->anonymizeValue($value, true);
578 $series[$status]->addPoint($loop, $value);
579 }
580 }
581 }
582
583 foreach(array_keys($custom_order) as $status)
584 {
585 $chart->addData($series[$status]);
586 }
587 }
588 }
589
590 $value_ticks = $this->buildValueScale($max_value, true);
591
592 $labels = array();
593 if(strpos($this->filter["yearmonth"], "-") === false)
594 {
595 $counter = 0;
596 foreach($this->getMonthsYear($this->filter["yearmonth"], true) as $caption)
597 {
598 $labels[$counter] = $caption;
599 $counter += 31;
600 }
601 }
602 else
603 {
604 for($loop = 1; $loop<32; $loop++)
605 {
606 $labels[$loop] = $loop.".";
607 }
608 }
609 $chart->setTicks($labels, $value_ticks, true);
610
611 return $chart->getHTML();
612 }
613
615 {
616 global $tpl;
617
618 include_once("./Services/YUI/classes/class.ilYuiUtil.php");
620 include_once("./Services/jQuery/classes/class.iljQueryUtil.php");
622
623 $tpl->addJavascript("./Services/Tracking/js/ilObjStat.js");
624 }
625
626}
627
628?>
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.
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)
searchObjects(array $filter, $permission, array $preset_obj_ids=null, $a_check_lp_activation=true)
Search objects that match current filters.
_getImagePathForStatus($a_status)
Get image path for status.
_getStatusText($a_status, $a_lng=null)
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.
setEnableHeader($a_enableheader)
Set Enable Header.
setDisableFilterHiding($a_val=true)
Set disable filter hiding.
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.
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.
setLimit($a_limit=0, $a_default_limit=0)
set max.
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.
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.
$text
$legend
global $ilCtrl
Definition: ilias.php:18
global $lng
Definition: privfeed.php:40
$url
Definition: shib_logout.php:72
$path
Definition: index.php:22
if(!is_array($argv)) $options