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
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 $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",
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
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}
date( 'd-M-Y', $objPHPExcel->getProperties() ->getCreated())
if(!isset( $_REQUEST[ 'ReturnTo'])) if(!isset($_REQUEST['AuthId'])) $options
Definition: as_login.php:20
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 _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 img($a_src, $a_alt="", $a_width="", $a_height="", $a_border=0, $a_id="", $a_class="")
Build img tag.
static initPanel($a_resize=false, ilTemplate $a_main_tpl=null)
Init yui panel.
static initjQuery($a_tpl=null)
inits and adds the jQuery JS-File to the global or a passed template
$counter
global $ilCtrl
Definition: ilias.php:18
$type
$url
$text
Definition: errorreport.php:18