ILIAS  release_5-3 Revision v5.3.23-19-g915713cf615
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  public 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  $this->setShowRowsSelector(true);
44  // $this->setLimit(ilSearchSettings::getInstance()->getMaxHits());
45 
46  $this->addColumn("", "", "1%", true);
47  $this->addColumn($lng->txt("trac_title"), "title");
48  $this->addColumn($lng->txt("object_id"), "obj_id");
49  } else {
50  $this->setLimit(20);
51 
52  $this->addColumn($lng->txt("trac_figure"));
53  }
54 
55  $this->initFilter();
56 
57  if (strpos($this->filter["yearmonth"], "-") === false) {
58  foreach ($this->getMonthsYear($this->filter["yearmonth"]) as $num => $caption) {
59  $this->addColumn($caption, "month_" . $num);
60  }
61  } else {
62  foreach ($this->types as $type) {
63  if ($type != "avg") {
64  $caption = " " . $this->lng->txt("trac_object_stat_lp_" . $type);
65  } else {
66  $caption = " &#216;";
67  }
68  $this->addColumn($lng->txt("trac_members_short") . $caption, "mem_cnt_" . $type);
69  }
70 
71  include_once("./Services/Tracking/classes/class.ilLearningProgressBaseGUI.php");
72  foreach ($this->status as $status) {
76 
77  foreach ($this->types as $type) {
78  if ($type != "avg") {
79  $caption = $icon . $this->lng->txt("trac_object_stat_lp_" . $type);
80  } else {
81  $caption = $icon . " &#216;";
82  }
83  $this->addColumn($caption, $status . "_" . $type);
84  }
85  }
86  }
87 
88  if (!$this->is_details) {
89  $this->setTitle($this->lng->txt("trac_object_stat_lp"));
90 
91  // $this->setSelectAllCheckbox("item_id");
92  $this->addMultiCommand("showLearningProgressGraph", $lng->txt("trac_show_graph"));
93  $this->setResetCommand("resetLearningProgressFilter");
94  $this->setFilterCommand("applyLearningProgressFilter");
95  }
96 
97  $this->setFormAction($ilCtrl->getFormAction($a_parent_obj, $a_parent_cmd));
98  $this->setRowTemplate("tpl.lp_object_statistics_lp_row.html", "Services/Tracking");
99  $this->setEnableHeader(true);
100  $this->setEnableNumInfo(true);
101  $this->setEnableTitle(true);
102  $this->setDefaultOrderField("title");
103  $this->setDefaultOrderDirection("asc");
104 
105  $this->status_map = array(ilLPStatus::LP_STATUS_NOT_ATTEMPTED_NUM => "not_attempted",
106  ilLPStatus::LP_STATUS_IN_PROGRESS_NUM => "in_progress",
109 
110  if ($a_load_items) {
111  if ($this->is_details) {
112  $this->getDetailItems($this->preselected[0]);
113  } else {
115  $this->getItems();
116  }
117  }
118  }
119 
120  public function numericOrdering($a_field)
121  {
122  if ($a_field != "title") {
123  return true;
124  }
125  return false;
126  }
127 
131  public function initFilter()
132  {
133  global $lng;
134 
135  $this->setDisableFilterHiding(true);
136 
137  // object type selection
138  include_once("./Services/Form/classes/class.ilSelectInputGUI.php");
139  /*
140  $si = new ilSelectInputGUI($lng->txt("obj_type"), "type");
141  $options = $this->getPossibleTypes(true);
142  $si->setOptions($options);
143  $this->addFilterItem($si);
144  $si->readFromSession();
145  if(!$si->getValue())
146  {
147  $si->setValue("crs");
148  }
149  $this->filter["type"] = $si->getValue();
150 
151  $this->filter_captions[] = $options[$this->filter["type"]];
152  */
153  $this->filter["type"] = "crs";
154 
155 
156  // title/description
157  include_once("./Services/Form/classes/class.ilTextInputGUI.php");
158  $ti = new ilTextInputGUI($lng->txt("trac_title_description"), "query");
159  $ti->setMaxLength(64);
160  $ti->setSize(20);
161  $this->addFilterItem($ti);
162  $ti->readFromSession();
163  $this->filter["query"] = $ti->getValue();
164 
165  // year/month
166  $si = new ilSelectInputGUI($lng->txt("year") . " / " . $lng->txt("month"), "yearmonth");
167  $si->setOptions($this->getMonthsFilter());
168  $this->addFilterItem($si);
169  $si->readFromSession();
170  if (!$si->getValue()) {
171  $si->setValue(date("Y-m"));
172  }
173  $this->filter["yearmonth"] = $si->getValue();
174 
175  if (!strpos($this->filter["yearmonth"], "-")) {
176  $si = new ilSelectInputGUI($lng->txt("trac_figure"), "figure");
177  $options = array(
178  "mem_cnt_max" => $lng->txt("members") . " " . $lng->txt("trac_object_stat_lp_max"),
179  "mem_cnt_avg" => $lng->txt("members") . " &#216;",
180  // we are using the db column names here (not the lp constants)!
181  "in_progress_max" => ilLearningProgressBaseGUI::_getStatusText(ilLPStatus::LP_STATUS_IN_PROGRESS_NUM) . " " . $lng->txt("trac_object_stat_lp_max"),
183  $si->setOptions($options);
184  $this->addFilterItem($si);
185  $si->readFromSession();
186  if (!$si->getValue()) {
187  $si->setValue("mem_cnt_max");
188  }
189  $this->filter["measure"] = $si->getValue();
190  }
191 
192  if ($this->is_details) {
193  $this->filters = array();
194  }
195  }
196 
197  public function getItems()
198  {
199  $data = array();
200  $all_status = array_merge(array("mem_cnt"), $this->status);
201 
202  $objects = $this->searchObjects(
203  $this->getCurrentFilter(true),
204  "read",
205  null,
206  false
207  );
208  if ($objects) {
209  $objects = array_keys($objects);
210 
211  include_once "Services/Tracking/classes/class.ilTrQuery.php";
212 
213  $yearmonth = explode("-", $this->filter["yearmonth"]);
214  if (sizeof($yearmonth) == 1) {
215  foreach (ilTrQuery::getObjectLPStatistics($objects, $yearmonth[0]) as $item) {
216  $obj_id = $item["obj_id"];
217  if (!isset($data[$obj_id])) {
218  $data[$obj_id]["obj_id"] = $obj_id;
219  $data[$obj_id]["title"] = ilObject::_lookupTitle($obj_id);
220  }
221 
222  $measure_type = substr($this->filter["measure"], -3);
223  $measure_field = substr($this->filter["measure"], 0, -4);
224  $value = $item[$measure_field . "_" . $measure_type];
225  $idx = $item["yyyy"] . "-" . str_pad($item["mm"], 2, "0", STR_PAD_LEFT);
226  $data[$obj_id]["month_" . $idx] = $value;
227  }
228 
229  if ($this->is_chart) {
230  // get data for single days (used in chart display)
231  foreach (array_keys($this->getMonthsYear($yearmonth[0])) as $num) {
232  $num = (int) array_pop(explode("-", $num));
233  foreach (ilTrQuery::getObjectLPStatistics($objects, $yearmonth[0], $num, true) as $item) {
234  $idx = $yearmonth[0] .
235  "-" . str_pad($num, 2, "0", STR_PAD_LEFT) .
236  "-" . str_pad($item["dd"], 2, "0", STR_PAD_LEFT);
237  $this->chart_data[$item["obj_id"]][$idx] = $item;
238  }
239  }
240  }
241  } else {
242  // get data aggregated for month
243  foreach (ilTrQuery::getObjectLPStatistics($objects, $yearmonth[0], (int) $yearmonth[1]) as $item) {
244  $obj_id = $item["obj_id"];
245  if (!isset($data[$obj_id])) {
246  $data[$obj_id]["obj_id"] = $obj_id;
247  $data[$obj_id]["title"] = ilObject::_lookupTitle($obj_id);
248  $this->initRow($data[$obj_id]);
249  }
250 
251  foreach ($all_status as $status) {
252  // status-id to field name
253  if (is_numeric($status)) {
254  $field = $this->status_map[$status];
255  } else {
256  $field = $status;
257  }
258 
259  // aggregated fields
260  foreach ($this->types as $type) {
261  $value = $item[$field . "_" . $type];
262  $data[$obj_id][$status . "_" . $type] = $value;
263  }
264  }
265  }
266 
267  if ($this->is_chart) {
268  // get data for single days (used in chart display)
269  foreach (ilTrQuery::getObjectLPStatistics($objects, $yearmonth[0], (int) $yearmonth[1], true) as $item) {
270  $this->chart_data[$item["obj_id"]][$item["dd"]] = $item;
271  }
272  }
273  }
274 
275  // add objects with no usage data
276  foreach ($objects as $obj_id) {
277  if (!isset($data[$obj_id])) {
278  $data[$obj_id]["obj_id"] = $obj_id;
279  $data[$obj_id]["title"] = ilObject::_lookupTitle($obj_id);
280  }
281  }
282  }
283 
284  $this->setData($data);
285 
286  include_once "./Services/Link/classes/class.ilLink.php";
287  }
288 
289  protected function getDetailItems($a_obj_id)
290  {
291  $data = array();
292  $all_status = array_merge(array("mem_cnt"), $this->status);
293 
294  include_once "Services/Tracking/classes/class.ilTrQuery.php";
295  foreach (ilTrQuery::getObjectLPStatistics(array($a_obj_id), $this->filter["yearmonth"]) as $item) {
296  $month = "month_" . $item["yyyy"] . "-" . str_pad($item["mm"], 2, "0", STR_PAD_LEFT);
297 
298  foreach ($all_status as $status) {
299  // status-id to field name
300  if ($status != "mem_cnt") {
301  $field = $this->status_map[$status];
302  } else {
303  $field = $status;
304  }
305  // aggregated fields
306  foreach ($this->types as $type) {
307  $value = $item[$field . "_" . $type];
308  $idx = $item["yyyy"] . "-" . str_pad($item["mm"], 2, "0", STR_PAD_LEFT);
309  $data[$status . "_" . $type]["month_" . $idx] = $value;
310  }
311  }
312  }
313 
314  // add captions
315  foreach (array_keys($data) as $figure) {
316  $status = substr($figure, 0, -4);
317  $type = substr($figure, -3);
318 
319  if ($status != "mem_cnt") {
323  $text = $icon . " " . $text;
324  } else {
325  $text = $this->lng->txt("members");
326  }
327  if ($type != "avg") {
328  $caption = $text . " " . $this->lng->txt("trac_object_stat_lp_" . $type);
329  } else {
330  $caption = $text . " &#216;";
331  }
332  $data[$figure]["figure"] = $caption;
333  }
334 
335  $this->setData($data);
336  }
337 
338  protected function initRow(&$a_row)
339  {
340  foreach ($this->types as $type) {
341  $a_row["mem_cnt_" . $type] = null;
342  }
343  foreach ($this->status as $status) {
344  foreach ($this->types as $type) {
345  $a_row[$status . "_" . $type] = null;
346  }
347  }
348  }
349 
353  protected function fillRow($a_set)
354  {
355  global $ilCtrl;
356 
357  if (!$this->is_details) {
358  $type = ilObject::_lookupType($a_set["obj_id"]);
359 
360  // ajax details layer link
361  if (strpos($this->filter["yearmonth"], "-") === false) {
362  $ilCtrl->setParameter($this->parent_obj, "item_id", $a_set["obj_id"]);
363  $url = $ilCtrl->getLinkTarget($this->parent_obj, "showLearningProgressDetails");
364  $a_set["title"] .= " (<a href=\"#\" onclick=\"ilObjStat.showLPDetails(event, '" . $url . "');\">Details</a>)";
365  $ilCtrl->setParameter($this->parent_obj, "item_id", "");
366  }
367 
368  $this->tpl->setCurrentBlock("checkbox");
369  $this->tpl->setVariable("OBJ_ID", $a_set["obj_id"]);
370  $this->tpl->setVariable("ICON_SRC", ilObject::_getIcon("", "tiny", $type));
371  $this->tpl->setVariable("ICON_ALT", $this->lng->txt($type));
372  $this->tpl->setVariable("TITLE_TEXT", $a_set["title"]);
373  if ($this->preselected && in_array($a_set["obj_id"], $this->preselected)) {
374  $this->tpl->setVariable("CHECKBOX_STATE", " checked=\"checked\"");
375  }
376  $this->tpl->parseCurrentBlock();
377  } else {
378  $this->tpl->setCurrentBlock("details");
379  $this->tpl->setVariable("TXT_FIGURE", $a_set["figure"]);
380  $this->tpl->parseCurrentBlock();
381  }
382 
383  $this->tpl->setCurrentBlock("item");
384 
385  if (strpos($this->filter["yearmonth"], "-") === false) {
386  foreach (array_keys($this->getMonthsYear($this->filter["yearmonth"])) as $num) {
387  $value = $this->anonymizeValue((int) $a_set["month_" . $num]);
388  $this->tpl->setVariable("ITEM_VALUE", $value);
389  $this->tpl->parseCurrentBlock();
390  }
391  } else {
392  foreach ($this->types as $type) {
393  $this->tpl->setVariable("ITEM_VALUE", $this->anonymizeValue((int) $a_set["mem_cnt_" . $type]));
394  $this->tpl->parseCurrentBlock();
395  }
396  foreach ($this->status as $status) {
397  foreach ($this->types as $type) {
398  $this->tpl->setVariable("ITEM_VALUE", $this->anonymizeValue((int) $a_set[$status . "_" . $type]));
399  $this->tpl->parseCurrentBlock();
400  }
401  }
402  }
403  }
404 
405  public function getGraph(array $a_graph_items)
406  {
407  global $lng;
408 
409  $a_graph_items = array(array_pop($a_graph_items));
410 
411  include_once "Services/Chart/classes/class.ilChart.php";
413  $chart->setsize(700, 500);
414 
415  $legend = new ilChartLegend();
416  $chart->setLegend($legend);
417 
418  // needed for correct stacking
419  $custom_order = array(
420  ilLPStatus::LP_STATUS_IN_PROGRESS_NUM => array("#f7d408", "#fffa00"),
421  ilLPStatus::LP_STATUS_FAILED_NUM => array("#cf0202", "#f15b5b"),
422  ilLPStatus::LP_STATUS_COMPLETED_NUM => array("#17aa0e", "#6ce148"),
423  ilLPStatus::LP_STATUS_NOT_ATTEMPTED_NUM => array("#a4a4a4", "#c4c4c4")
424  );
425 
426  $chart->setColors(array());
427 
428  $max_value = 0;
429  foreach ($this->chart_data as $object_id => $days) {
430  if (in_array($object_id, $a_graph_items)) {
431  $series = array();
432  foreach ($custom_order as $status => $colors) {
433  /*
434  if(strpos($this->filter["yearmonth"], "-") === false)
435  {
436  $series[$status] = new ilChartData("lines");
437  $series[$status]->setLineSteps(true);
438  }
439  else
440  {
441  $series[$status] = new ilChartData("bars");
442  $series[$status]->setBarOptions(0.75);
443  $series[$status]->setFill(true, $colors[1]);
444  }
445  $series[$status]->setStackingId($object_id);
446  */
447  $series[$status] = $chart->getDataInstance(ilChartGrid::DATA_LINES);
448 
450  $chart_colors[] = $colors[0];
451  }
452  $chart->setColors($chart_colors);
453 
454  if (strpos($this->filter["yearmonth"], "-") === false) {
455  $x_axis = $this->lng->txt("month");
456 
457  $counter = 0;
458  foreach (array_keys($this->getMonthsYear($this->filter["yearmonth"])) as $month) {
459  for ($loop = 1; $loop<32; $loop++) {
460  $item_day = $month . "-" . str_pad($loop, 2, "0", STR_PAD_LEFT);
461  foreach (array_keys($custom_order) as $status) {
462  if (isset($days[$item_day])) {
463  // as there is only 1 entry per day, avg == sum
464  $value = (int) $days[$item_day][$this->status_map[$status] . "_avg"];
465  } else {
466  $value = 0;
467  }
468  $max_value = max($max_value, $value);
469  $value = $this->anonymizeValue($value, true);
470  $series[$status]->addPoint($counter, $value);
471  }
472  $counter++;
473  }
474  }
475  } else {
476  $x_axis = $this->lng->txt("day");
477  for ($loop = 1; $loop<32; $loop++) {
478  foreach (array_keys($custom_order) as $status) {
479  if (isset($days[$loop])) {
480  // as there is only 1 entry per day, avg == sum
481  $value = (int) $days[$loop][$this->status_map[$status] . "_avg"];
482  } else {
483  $value = 0;
484  }
485  $max_value = max($max_value, $value);
486  $value = $this->anonymizeValue($value, true);
487  $series[$status]->addPoint($loop, $value);
488  }
489  }
490  }
491 
492  foreach (array_keys($custom_order) as $status) {
493  $chart->addData($series[$status]);
494  }
495  }
496  }
497 
498  $value_ticks = $this->buildValueScale($max_value, true);
499 
500  $labels = array();
501  if (strpos($this->filter["yearmonth"], "-") === false) {
502  $counter = 0;
503  foreach ($this->getMonthsYear($this->filter["yearmonth"], true) as $caption) {
504  $labels[$counter] = $caption;
505  $counter += 31;
506  }
507  } else {
508  for ($loop = 1; $loop<32; $loop++) {
509  $labels[$loop] = $loop . ".";
510  }
511  }
512  $chart->setTicks($labels, $value_ticks, true);
513 
514  return $chart->getHTML();
515  }
516 
517  protected function initLearningProgressDetailsLayer()
518  {
519  global $tpl;
520 
521  include_once("./Services/YUI/classes/class.ilYuiUtil.php");
523  include_once("./Services/jQuery/classes/class.iljQueryUtil.php");
525 
526  $tpl->addJavascript("./Services/Tracking/js/ilObjStat.js");
527  }
528 }
const LP_STATUS_COMPLETED_NUM
static _getIcon( $a_obj_id="", $a_size="big", $a_type="", $a_offline=false)
Get icon for repository item.
anonymizeValue($a_value, $a_force_number=false)
static getObjectLPStatistics(array $a_obj_ids, $a_year, $a_month=null, $a_group_by_day=false)
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.
$type
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
setId($a_val)
Set id.
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.
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)
$text
Definition: errorreport.php:18
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
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)
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.
static initjQuery($a_tpl=null)
inits and adds the jQuery JS-File to the global or a passed template
setEnableHeader($a_enableheader)
Set Enable Header.
TableGUI class for learning progress.
$url
getCurrentFilter($as_query=false)
setEnableTitle($a_enabletitle)
Set Enable Title.
static initPanel($a_resize=false, ilTemplate $a_main_tpl=null)
Init yui panel.
static getInstanceByType($a_type, $a_id)
Get type instance.
setLimit($a_limit=0, $a_default_limit=0)
const LP_STATUS_FAILED_NUM
if(!isset($_REQUEST['ReturnTo'])) if(!isset($_REQUEST['AuthId'])) $options
Definition: as_login.php:20
setFilterCommand($a_val, $a_caption=null)
Set filter command.