ILIAS  release_4-3 Revision
 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");
21  protected $is_chart = false;
22  protected $is_details = false;
23  protected $chart_data = array();
24 
28  function __construct($a_parent_obj, $a_parent_cmd, array $a_preselect = null, $a_load_items = true, $a_is_chart = false, $a_is_details = false)
29  {
30  global $ilCtrl, $lng;
31 
32  $this->preselected = $a_preselect;
33  $this->is_chart = (bool)$a_is_chart;
34  $this->is_details = (bool)$a_is_details;
35 
36  $this->setId("lpobjstatlptbl");
37 
38  parent::__construct($a_parent_obj, $a_parent_cmd);
39 
40  if(!$this->is_details)
41  {
42  $this->setShowRowsSelector(true);
43  // $this->setLimit(ilSearchSettings::getInstance()->getMaxHits());
44 
45  $this->addColumn("", "", "1%", true);
46  $this->addColumn($lng->txt("trac_title"), "title");
47  $this->addColumn($lng->txt("object_id"), "obj_id");
48  }
49  else
50  {
51  $this->setLimit(20);
52 
53  $this->addColumn($lng->txt("trac_figure"));
54  }
55 
56  $this->initFilter();
57 
58  if(strpos($this->filter["yearmonth"], "-") === false)
59  {
60  foreach($this->getMonthsYear($this->filter["yearmonth"]) as $num => $caption)
61  {
62  $this->addColumn($caption, "month_".$num, "", false, "ilRight");
63  }
64  }
65  else
66  {
67  foreach($this->types as $type)
68  {
69  if($type != "avg")
70  {
71  $caption = " ".$this->lng->txt("trac_object_stat_lp_".$type);
72  }
73  else
74  {
75  $caption = " &#216;";
76  }
77  $this->addColumn($lng->txt("trac_members_short").$caption, "mem_cnt_".$type, "", false, "ilRight");
78  }
79 
80  include_once("./Services/Tracking/classes/class.ilLearningProgressBaseGUI.php");
81  foreach($this->status as $status)
82  {
85  $icon = ilUtil::img($path, $text);
86 
87  foreach($this->types as $type)
88  {
89  if($type != "avg")
90  {
91  $caption = $icon.$this->lng->txt("trac_object_stat_lp_".$type);
92  }
93  else
94  {
95  $caption = $icon." &#216;";
96  }
97  $this->addColumn($caption, $status."_".$type, "", false, "ilRight");
98  }
99  }
100  }
101 
102  if(!$this->is_details)
103  {
104  $this->setTitle($this->lng->txt("trac_object_stat_lp"));
105 
106  // $this->setSelectAllCheckbox("item_id");
107  $this->addMultiCommand("showLearningProgressGraph", $lng->txt("trac_show_graph"));
108  $this->setResetCommand("resetLearningProgressFilter");
109  $this->setFilterCommand("applyLearningProgressFilter");
110  }
111 
112  $this->setFormAction($ilCtrl->getFormAction($a_parent_obj, $a_parent_cmd));
113  $this->setRowTemplate("tpl.lp_object_statistics_lp_row.html", "Services/Tracking");
114  $this->setEnableHeader(true);
115  $this->setEnableNumInfo(true);
116  $this->setEnableTitle(true);
117  $this->setDefaultOrderField("title");
118  $this->setDefaultOrderDirection("asc");
119 
120  include_once("./Services/Tracking/classes/class.ilLPObjSettings.php");
121 
122  $this->status_map = array(LP_STATUS_NOT_ATTEMPTED_NUM => "not_attempted",
123  LP_STATUS_IN_PROGRESS_NUM => "in_progress",
124  LP_STATUS_COMPLETED_NUM => "completed",
125  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(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 = new ilChart("objstlp", 700, 500);
482 
483  $legend = new ilChartLegend();
484  $chart->setLegend($legend);
485 
486  // needed for correct stacking
487  $custom_order = array(
488  LP_STATUS_IN_PROGRESS_NUM => array("#f7d408", "#fffa00"),
489  LP_STATUS_FAILED_NUM => array("#cf0202", "#f15b5b"),
490  LP_STATUS_COMPLETED_NUM => array("#17aa0e", "#6ce148"),
491  LP_STATUS_NOT_ATTEMPTED_NUM => array("#a4a4a4", "#c4c4c4")
492  );
493 
494  $chart->setColors(array());
495 
496  $max_value = 0;
497  foreach($this->chart_data as $object_id => $days)
498  {
499  if(in_array($object_id, $a_graph_items))
500  {
501  $series = array();
502  foreach($custom_order as $status => $colors)
503  {
504  /*
505  if(strpos($this->filter["yearmonth"], "-") === false)
506  {
507  $series[$status] = new ilChartData("lines");
508  $series[$status]->setLineSteps(true);
509  }
510  else
511  {
512  $series[$status] = new ilChartData("bars");
513  $series[$status]->setBarOptions(0.75);
514  $series[$status]->setFill(true, $colors[1]);
515  }
516  $series[$status]->setStackingId($object_id);
517  */
518  $series[$status] = new ilChartData("lines");
519 
521  $chart_colors[] = $colors[0];
522  }
523  $chart->setColors($chart_colors);
524 
525  if(strpos($this->filter["yearmonth"], "-") === false)
526  {
527  $x_axis = $this->lng->txt("month");
528 
529  $counter = 0;
530  foreach(array_keys($this->getMonthsYear($this->filter["yearmonth"])) as $month)
531  {
532  for($loop = 1; $loop<32; $loop++)
533  {
534  $item_day = $month."-".str_pad($loop, 2, "0", STR_PAD_LEFT);
535  foreach(array_keys($custom_order) as $status)
536  {
537  if(isset($days[$item_day]))
538  {
539  // as there is only 1 entry per day, avg == sum
540  $value = (int)$days[$item_day][$this->status_map[$status]."_avg"];
541  }
542  else
543  {
544  $value = 0;
545  }
546  $max_value = max($max_value, $value);
547  $value = $this->anonymizeValue($value, true);
548  $series[$status]->addPoint($counter, $value);
549  }
550  $counter++;
551  }
552  }
553  }
554  else
555  {
556  $x_axis = $this->lng->txt("day");
557  for($loop = 1; $loop<32; $loop++)
558  {
559  foreach(array_keys($custom_order) as $status)
560  {
561  if(isset($days[$loop]))
562  {
563  // as there is only 1 entry per day, avg == sum
564  $value = (int)$days[$loop][$this->status_map[$status]."_avg"];
565  }
566  else
567  {
568  $value = 0;
569  }
570  $max_value = max($max_value, $value);
571  $value = $this->anonymizeValue($value, true);
572  $series[$status]->addPoint($loop, $value);
573  }
574  }
575  }
576 
577  foreach(array_keys($custom_order) as $status)
578  {
579  $chart->addData($series[$status]);
580  }
581  }
582  }
583 
584  $value_ticks = $this->buildValueScale($max_value, true);
585 
586  $labels = array();
587  if(strpos($this->filter["yearmonth"], "-") === false)
588  {
589  $counter = 0;
590  foreach($this->getMonthsYear($this->filter["yearmonth"], true) as $caption)
591  {
592  $labels[$counter] = $caption;
593  $counter += 31;
594  }
595  }
596  else
597  {
598  for($loop = 1; $loop<32; $loop++)
599  {
600  $labels[$loop] = $loop.".";
601  }
602  }
603  $chart->setTicks($labels, $value_ticks, true);
604 
605  return $chart->getHTML();
606  }
607 
608  protected function initLearningProgressDetailsLayer()
609  {
610  global $tpl;
611 
612  include_once("./Services/YUI/classes/class.ilYuiUtil.php");
614  include_once("./Services/jQuery/classes/class.iljQueryUtil.php");
616 
617  $tpl->addJavascript("./Services/Tracking/js/ilObjStat.js");
618  }
619 
620 }
621 
622 ?>