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