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
4include_once("./Services/Tracking/classes/class.ilLPTableBaseGUI.php");
5include_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",
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";
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
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}
An exception for terminatinating execution or to throw for unit testing.
static getInstanceByType($a_type, $a_id)
Get type instance.
const TYPE_GRID
TableGUI class for learning progress.
__construct($a_parent_obj, $a_parent_cmd, array $a_preselect=null, $a_load_items=true, $a_is_chart=false, $a_is_details=false)
Constructor.
numericOrdering($a_field)
Should this field be sorted numeric?
static getInstance(int $variant=ilLPStatusIcons::ICON_VARIANT_DEFAULT, ?\ILIAS\UI\Renderer $renderer=null, ?\ILIAS\UI\Factory $factory=null)
const LP_STATUS_COMPLETED_NUM
const LP_STATUS_IN_PROGRESS_NUM
const LP_STATUS_NOT_ATTEMPTED_NUM
const LP_STATUS_FAILED_NUM
TableGUI class for learning progress.
getCurrentFilter($as_query=false)
getMonthsYear($a_year=null, $a_short=false)
buildValueScale($a_max_value, $a_anonymize=false, $a_format_seconds=false)
anonymizeValue($a_value, $a_force_number=false)
getMonthsFilter($a_short=false)
searchObjects(array $filter, $permission, array $preset_obj_ids=null, $a_check_lp_activation=true)
Search objects that match current filters.
static _getStatusText($a_status, $a_lng=null)
Get status alt text.
static _lookupTitle($a_id)
lookup object title
static _getIcon( $a_obj_id="", $a_size="big", $a_type="", $a_offline=false)
Get icon for repository item.
static _lookupType($a_id, $a_reference=false)
lookup object type
This class represents a selection list property in a property form.
setEnableHeader($a_enableheader)
Set Enable Header.
setDisableFilterHiding($a_val=true)
Set disable filter hiding.
setShowRowsSelector($a_value)
Toggle rows-per-page selector.
setTitle($a_title, $a_icon=0, $a_icon_alt=0)
Set title and title icon.
setData($a_data)
set table data @access public
setResetCommand($a_val, $a_caption=null)
Set reset filter command.
setEnableTitle($a_enabletitle)
Set Enable Title.
setEnableNumInfo($a_val)
Set enable num info.
setRowTemplate($a_template, $a_template_dir="")
Set row template.
setLimit($a_limit=0, $a_default_limit=0)
set max.
addMultiCommand($a_cmd, $a_text)
Add Command button.
addFilterItem($a_input_item, $a_optional=false)
Add filter item.
setDefaultOrderField($a_defaultorderfield)
Set Default order field.
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.
setId($a_val)
Set id.
setFormAction($a_form_action, $a_multipart=false)
Set Form action parameter.
setDefaultOrderDirection($a_defaultorderdirection)
Set Default order direction.
setFilterCommand($a_val, $a_caption=null)
Set filter command.
This class represents a text property in a property form.
static getObjectLPStatistics(array $a_obj_ids, $a_year, $a_month=null, $a_group_by_day=false)
static initPanel($a_resize=false, ilGlobalTemplateInterface $a_main_tpl=null)
Init yui panel.
static initjQuery(ilGlobalTemplateInterface $a_tpl=null)
inits and adds the jQuery JS-File to the global or a passed template
filter()
Definition: filter.php:2
global $DIC
Definition: goto.php:24
__construct(Container $dic, ilPlugin $plugin)
@inheritDoc
$type
$url