ILIAS  release_5-2 Revision v5.2.25-18-g3f80b828510
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);
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);
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);
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(
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 
614  protected function initLearningProgressDetailsLayer()
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 ?>
const LP_STATUS_COMPLETED_NUM
anonymizeValue($a_value, $a_force_number=false)
static getObjectLPStatistics(array $a_obj_ids, $a_year, $a_month=null, $a_group_by_day=false)
static _getIcon($a_obj_id="", $a_size="big", $a_type="", $a_offline=false)
Get icon for repository item.
$path
Definition: aliased.php:25
setDefaultOrderField($a_defaultorderfield)
Set Default order field.
This class represents a selection list property in a property form.
static _getImagePathForStatus($a_status)
Get image path for status.
Chart legend.
setEnableNumInfo($a_val)
Set enable num info.
static _getStatusText($a_status, $a_lng=null)
Get status alt text.
getMonthsYear($a_year=null, $a_short=false)
searchObjects(array $filter, $permission, array $preset_obj_ids=null, $a_check_lp_activation=true)
Search objects that match current filters.
const LP_STATUS_IN_PROGRESS_NUM
addFilterItem($a_input_item, $a_optional=false)
Add filter item.
static _lookupTitle($a_id)
lookup object title
$url
Definition: shib_logout.php:72
setId($a_val)
Set id.
global $tpl
Definition: ilias.php:8
global $ilCtrl
Definition: ilias.php:18
setDefaultOrderDirection($a_defaultorderdirection)
Set Default order direction.
setTitle($a_title, $a_icon=0, $a_icon_alt=0)
Set title and title icon.
$counter
__construct($a_parent_obj, $a_parent_cmd, array $a_preselect=null, $a_load_items=true, $a_is_chart=false, $a_is_details=false)
Constructor.
setResetCommand($a_val, $a_caption=null)
Set reset filter command.
TableGUI class for learning progress.
if(!is_array($argv)) $options
setDisableFilterHiding($a_val=true)
Set disable filter hiding.
date( 'd-M-Y', $objPHPExcel->getProperties() ->getCreated())
buildValueScale($a_max_value, $a_anonymize=false, $a_format_seconds=false)
addMultiCommand($a_cmd, $a_text)
Add Command button.
This class represents a text property in a property form.
setMaxLength($a_maxlength)
Set Max Length.
setRowTemplate($a_template, $a_template_dir="")
Set row template.
Create styles array
The data for the language used.
static _lookupType($a_id, $a_reference=false)
lookup object type
const TYPE_GRID
static initPanel($a_resize=false)
Init yui panel.
const LP_STATUS_NOT_ATTEMPTED_NUM
setFormAction($a_form_action, $a_multipart=false)
Set Form action parameter.
static img($a_src, $a_alt="", $a_width="", $a_height="", $a_border=0, $a_id="", $a_class="")
Build img tag.
getMonthsFilter($a_short=false)
global $lng
Definition: privfeed.php:17
setShowRowsSelector($a_value)
Toggle rows-per-page selector.
$text
static initjQuery($a_tpl=null)
Init jQuery.
setEnableHeader($a_enableheader)
Set Enable Header.
TableGUI class for learning progress.
getCurrentFilter($as_query=false)
setEnableTitle($a_enabletitle)
Set Enable Title.
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.
static getInstanceByType($a_type, $a_id)
Get type instance.
setLimit($a_limit=0, $a_default_limit=0)
const LP_STATUS_FAILED_NUM
setFilterCommand($a_val, $a_caption=null)
Set filter command.