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