ILIAS  Release_5_0_x_branch Revision 61816
 All Data Structures Namespaces Files Functions Variables Groups Pages
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 
4 include_once("./Services/Tracking/classes/class.ilLPTableBaseGUI.php");
5 include_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",
123  ilLPStatus::LP_STATUS_IN_PROGRESS_NUM => "in_progress",
124  ilLPStatus::LP_STATUS_COMPLETED_NUM => "completed",
125  ilLPStatus::LP_STATUS_FAILED_NUM => "failed");
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  {
370  $text = ilLearningProgressBaseGUI::_getStatusText((int)$status);
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";
481  $chart = ilChart::getInstanceByType(ilChart::TYPE_GRID, "objstlp");
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 
609  protected function initLearningProgressDetailsLayer()
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 ?>