ILIAS  release_5-4 Revision v5.4.26-12-gabc799a52e6
class.ilLPProgressTableGUI.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 require_once("./Services/Tracking/classes/class.ilLearningProgressGUI.php");
6 
17 {
21  public function __construct($a_parent_obj, $a_parent_cmd, $a_user = "", $obj_ids = null, $details = false, $mode = null, $personal_only = false, $a_parent_id = null, $a_parent_ref_id = null, $lp_context = null)
22  {
23  global $DIC;
24 
25  $ilCtrl = $DIC['ilCtrl'];
26  $lng = $DIC['lng'];
27  $ilUser = $DIC['ilUser'];
28 
29  $this->tracked_user = $a_user;
30  $this->obj_ids = $obj_ids;
31  $this->details = $details;
32  $this->mode = $mode;
33  $this->parent_obj_id = $a_parent_id;
34  $this->lp_context = $lp_context;
35 
36  if ($a_parent_id) {
37  // #15042 - needed for export meta
38  $this->obj_id = $this->parent_obj_id;
39  $this->ref_id = $a_parent_ref_id;
40  }
41 
42  $this->setId("lpprgtbl");
43 
44  parent::__construct($a_parent_obj, $a_parent_cmd);
45 
46  $this->setLimit(9999);
47 
48  if (!$this->details) {
49  $this->has_object_subitems = true;
50 
51  $user = $this->tracked_user;
52  if (!$user) {
53  $user = $ilUser;
54  }
55 
56  $this->addColumn("", "", "1", true);
57  $this->addColumn($this->lng->txt("trac_title"), "title", "26%");
58  $this->addColumn($this->lng->txt("status"), "status", "7%");
59  $this->addColumn($this->lng->txt('trac_status_changed'), 'status_changed', '10%');
60  $this->addColumn($this->lng->txt("trac_percentage"), "percentage", "7%");
61  $this->addColumn($this->lng->txt("trac_mark"), "", "5%");
62  $this->addColumn($this->lng->txt("comment"), "", "10%");
63  $this->addColumn($this->lng->txt("trac_mode"), "", "20%");
64  $this->addColumn($this->lng->txt("path"), "", "20%");
65  $this->addColumn($this->lng->txt("actions"), "", "5%");
66 
67  $this->setTitle(sprintf($this->lng->txt("trac_learning_progress_of"), $user->getFullName()));
68  $this->initBaseFilter();
69 
70  $this->setSelectAllCheckbox("item_id");
71  $this->addMultiCommand("hideSelected", $lng->txt("trac_hide_selected"));
72 
73  $this->setShowTemplates(true);
74  } else {
75  include_once './Services/Object/classes/class.ilObjectLP.php';
76  $olp = ilObjectLP::getInstance($this->parent_obj_id);
77  $collection = $olp->getCollectionInstance();
78  $this->has_object_subitems = ($collection instanceof ilLPCollectionOfRepositoryObjects);
79 
80  /*
81  if(!$personal_only)
82  {
83  $this->parseTitle($a_parent_obj->details_obj_id, "trac_subitems");
84  }
85  else
86  {
87  $this->parseTitle($a_parent_obj->details_obj_id, "trac_progress");
88  }
89  */
90  $this->setTitle($this->lng->txt("details")); // #15247
91 
92  $this->addColumn($this->lng->txt("trac_title"), "title", "31%");
93  $this->addColumn($this->lng->txt("status"), "status", "7%");
94 
95  if ($this->mode == ilLPObjSettings::LP_MODE_SCORM) {
96  $this->lng->loadLanguageModule('content');
97  $this->addColumn($this->lng->txt('cont_score'), 'score', '10%');
98  } elseif ($this->has_object_subitems) {
99  $this->addColumn($this->lng->txt('trac_status_changed'), 'status_changed', '10%');
100  $this->addColumn($this->lng->txt("trac_percentage"), "percentage", "7%");
101  $this->addColumn($this->lng->txt("trac_mark"), "", "5%");
102  $this->addColumn($this->lng->txt("comment"), "", "10%");
103  $this->addColumn($this->lng->txt("trac_mode"), "", "20%");
104  $this->addColumn($this->lng->txt("path"), "", "20%");
105  }
106  }
107 
108  $this->setEnableHeader(true);
109  $this->setFormAction($ilCtrl->getFormActionByClass(get_class($this)));
110  $this->setRowTemplate("tpl.lp_progress_list_row.html", "Services/Tracking");
111  $this->setEnableHeader(true);
112  $this->setEnableNumInfo(false);
113  $this->setEnableTitle(true);
114  $this->setDefaultOrderField("title");
115  $this->setDefaultOrderDirection("asc");
116 
117  if ($this->has_object_subitems) {
118  $this->setExportFormats(array(self::EXPORT_CSV, self::EXPORT_EXCEL));
119  }
120 
121  // area selector gets in the way
122  if ($this->tracked_user) {
123  $this->getItems();
124  }
125  }
126 
127  public function numericOrdering($a_field)
128  {
129  return ($a_field == "percentage"); // #15041
130  }
131 
132  public function getItems()
133  {
134  $obj_ids = $this->obj_ids;
135  if (!$obj_ids && !$this->details) {
136  switch ($this->lp_context) {
138  $obj_ids = $this->searchObjects($this->getCurrentFilter(true), null);
139  break;
140 
141  default:
142  $obj_ids = $this->searchObjects($this->getCurrentFilter(true), "read");
143 
144  // check for LP relevance
145  include_once "Services/Object/classes/class.ilObjectLP.php";
146  foreach (ilObjectLP::getLPMemberships($this->tracked_user->getId(), $obj_ids, null, true) as $obj_id => $status) {
147  if (!$status) {
148  unset($obj_ids[$obj_id]);
149  }
150  }
151  break;
152  }
153  }
154  if ($obj_ids) {
155  include_once("./Services/Tracking/classes/class.ilTrQuery.php");
156  switch ($this->mode) {
158  $data = ilTrQuery::getSCOsStatusForUser($this->tracked_user->getId(), $this->parent_obj_id, $obj_ids);
159  break;
160 
162  $data = ilTrQuery::getObjectivesStatusForUser($this->tracked_user->getId(), $this->parent_obj_id, $obj_ids);
163  break;
164 
168  $data = ilTrQuery::getSubItemsStatusForUser($this->tracked_user->getId(), $this->parent_obj_id, $obj_ids);
169  break;
170 
171  default:
172  $data = ilTrQuery::getObjectsStatusForUser($this->tracked_user->getId(), $obj_ids);
173  foreach ($data as $idx => $item) {
174  if (!$item["status"] && !$this->filter["status"] && !$this->details) {
175  unset($data[$idx]);
176  } else {
177  $data[$idx]["offline"] = ilLearningProgressBaseGUI::isObjectOffline($item["obj_id"], $item["type"]);
178  }
179  }
180  break;
181  }
182 
183  // #15334
184  foreach ($data as $idx => $row) {
185  if (!$this->isPercentageAvailable($row["obj_id"])) {
186  // #17000 - enable proper (numeric) sorting
187  $data[$idx]["percentage"] = -1;
188  }
189  }
190 
191  $this->setData($data);
192  }
193  }
194 
198  protected function fillRow($a_set)
199  {
200  global $DIC;
201 
202  $ilCtrl = $DIC['ilCtrl'];
203 
204  if (!$this->details) {
205  $this->tpl->setCurrentBlock("column_checkbox");
206  $this->tpl->setVariable("OBJ_ID", $a_set["obj_id"]);
207  $this->tpl->parseCurrentBlock();
208  }
209 
210  $this->tpl->setVariable("ICON_SRC", ilObject::_getIcon("", "tiny", $a_set["type"]));
211  $this->tpl->setVariable("ICON_ALT", $this->lng->txt($a_set["type"]));
212  $this->tpl->setVariable("TITLE_TEXT", $a_set["title"]);
213 
214  if ($a_set["offline"]) {
215  $this->tpl->setCurrentBlock("offline");
216  $this->tpl->setVariable("TEXT_STATUS", $this->lng->txt("status"));
217  $this->tpl->setVariable("TEXT_OFFLINE", $this->lng->txt("offline"));
218  $this->tpl->parseCurrentBlock();
219  }
220 
221  $this->tpl->setVariable("STATUS_ALT", ilLearningProgressBaseGUI::_getStatusText($a_set["status"]));
222  $this->tpl->setVariable("STATUS_IMG", ilLearningProgressBaseGUI::_getImagePathForStatus($a_set["status"]));
223 
224  if ($this->mode == ilLPObjSettings::LP_MODE_SCORM) {
225  $this->tpl->setVariable('SCORE_VAL', $a_set["score"]);
226  } elseif ($this->has_object_subitems) {
227  $this->tpl->setCurrentBlock("status_details");
228 
229  $this->tpl->setVariable('STATUS_CHANGED_VAL', ilDatePresentation::formatDate(new ilDateTime($a_set['status_changed'], IL_CAL_DATETIME)));
230 
231  $olp = ilObjectLP::getInstance($a_set["obj_id"]);
232  $this->tpl->setVariable("MODE_TEXT", $olp->getModeText($a_set["u_mode"]));
233  $this->tpl->setVariable("MARK_VALUE", $a_set["mark"]);
234  $this->tpl->setVariable("COMMENT_TEXT", $a_set["comment"]);
235 
236  if ($a_set["percentage"] < 0) {
237  $this->tpl->setVariable("PERCENTAGE_VALUE", "");
238  } else {
239  $this->tpl->setVariable("PERCENTAGE_VALUE", sprintf("%d%%", $a_set["percentage"]));
240  }
241 
242  // path
243  $path = $this->buildPath($a_set["ref_ids"]);
244  if ($path) {
245  $this->tpl->setCurrentBlock("item_path");
246  foreach ($path as $path_item) {
247  $this->tpl->setVariable("PATH_ITEM", $path_item);
248  $this->tpl->parseCurrentBlock();
249  }
250  }
251 
252  $this->tpl->parseCurrentBlock();
253  }
254 
255  // not for objectives/scos
256  if (!$this->mode) {
257  // tlt warning
258  if ($a_set["status"] != ilLPStatus::LP_STATUS_COMPLETED_NUM && $a_set["ref_ids"]) {
259  $ref_id = $a_set["ref_ids"];
260  $ref_id = array_shift($ref_id);
261  $timing = $this->showTimingsWarning($ref_id, $this->tracked_user->getId());
262  if ($timing) {
263  if ($timing !== true) {
264  $timing = ": " . ilDatePresentation::formatDate(new ilDate($timing, IL_CAL_UNIX));
265  } else {
266  $timing = "";
267  }
268  $this->tpl->setCurrentBlock('warning_img');
269  $this->tpl->setVariable('WARNING_IMG', ilUtil::getImagePath('time_warn.svg'));
270  $this->tpl->setVariable('WARNING_ALT', $this->lng->txt('trac_time_passed') . $timing);
271  $this->tpl->parseCurrentBlock();
272  }
273  }
274 
275  // hide / unhide?!
276  if (!$this->details) {
277  $this->tpl->setCurrentBlock("item_command");
278  $ilCtrl->setParameterByClass(get_class($this), 'hide', $a_set["obj_id"]);
279  $this->tpl->setVariable("HREF_COMMAND", $ilCtrl->getLinkTargetByClass(get_class($this), 'hide'));
280  $this->tpl->setVariable("TXT_COMMAND", $this->lng->txt('trac_hide'));
281  $this->tpl->parseCurrentBlock();
282 
283  $olp = ilObjectLP::getInstance($a_set["obj_id"]);
284  if ($olp->getCollectionInstance() && $a_set["ref_ids"]) {
285  $ref_id = $a_set["ref_ids"];
286  $ref_id = array_shift($ref_id);
287  $ilCtrl->setParameterByClass($ilCtrl->getCmdClass(), 'details_id', $ref_id);
288  $this->tpl->setVariable("HREF_COMMAND", $ilCtrl->getLinkTargetByClass($ilCtrl->getCmdClass(), 'details'));
289  $ilCtrl->setParameterByClass($ilCtrl->getCmdClass(), 'details_id', '');
290  $this->tpl->setVariable("TXT_COMMAND", $this->lng->txt('trac_subitems'));
291  $this->tpl->parseCurrentBlock();
292  }
293 
294  $this->tpl->setCurrentBlock("column_action");
295  $this->tpl->parseCurrentBlock();
296  }
297  }
298  }
299 
300  protected function fillHeaderExcel(ilExcel $a_excel, &$a_row)
301  {
302  $a_excel->setCell($a_row, 0, $this->lng->txt("type"));
303  $a_excel->setCell($a_row, 1, $this->lng->txt("trac_title"));
304  $a_excel->setCell($a_row, 2, $this->lng->txt("status"));
305  $a_excel->setCell($a_row, 3, $this->lng->txt("trac_status_changed"));
306  $a_excel->setCell($a_row, 4, $this->lng->txt("trac_percentage"));
307  $a_excel->setCell($a_row, 5, $this->lng->txt("trac_mark"));
308  $a_excel->setCell($a_row, 6, $this->lng->txt("comment"));
309  $a_excel->setCell($a_row, 7, $this->lng->txt("trac_mode"));
310  // $a_excel->setCell($a_row, 7, $this->lng->txt("path"));
311 
312  $a_excel->setBold("A" . $a_row . ":H" . $a_row);
313  }
314 
315  protected function fillRowExcel(ilExcel $a_excel, &$a_row, $a_set)
316  {
317  $a_excel->setCell($a_row, 0, $this->lng->txt($a_set["type"]));
318  $a_excel->setCell($a_row, 1, $a_set["title"]);
319  $a_excel->setCell($a_row, 2, ilLearningProgressBaseGUI::_getStatusText($a_set["status"]));
320 
321  $a_excel->setCell($a_row, 3, new ilDateTime($a_set['status_changed'], IL_CAL_DATETIME));
322 
323  if (!$this->isPercentageAvailable($a_row['obj_id'])) {
324  $a_excel->setCell($a_row, 4, '-');
325  } else {
326  $a_excel->setCell($a_row, 4, $a_set["percentage"] . "%");
327  }
328  $a_excel->setCell($a_row, 5, $a_set["mark"]);
329  $a_excel->setCell($a_row, 6, $a_set["comment"]);
330  $a_excel->setCell($a_row, 7, ilLPObjSettings::_mode2Text($a_set["u_mode"]));
331  }
332 
333  protected function fillHeaderCSV($a_csv)
334  {
335  $a_csv->addColumn($this->lng->txt("type"));
336  $a_csv->addColumn($this->lng->txt("trac_title"));
337  $a_csv->addColumn($this->lng->txt("status"));
338  $a_csv->addColumn($this->lng->txt("trac_status_changed"));
339  $a_csv->addColumn($this->lng->txt("trac_percentage"));
340  $a_csv->addColumn($this->lng->txt("trac_mark"));
341  $a_csv->addColumn($this->lng->txt("comment"));
342  $a_csv->addColumn($this->lng->txt("trac_mode"));
343  // $a_csv->addColumn($this->lng->txt("path"));
344  $a_csv->addRow();
345  }
346 
347  protected function fillRowCSV($a_csv, $a_set)
348  {
349  $a_csv->addColumn($this->lng->txt($a_set["type"]));
350  $a_csv->addColumn($a_set["title"]);
351  $a_csv->addColumn(ilLearningProgressBaseGUI::_getStatusText($a_set["status"]));
352 
354  $a_csv->addColumn(ilDatePresentation::formatDate(new ilDateTime($a_set['status_changed'], IL_CAL_DATETIME)));
356 
357  if (!$this->isPercentageAvailable($a_set['obj_id'])) {
358  $a_csv->addColumn('-');
359  } else {
360  $a_csv->addColumn(sprintf("%d%%", $a_set["percentage"]));
361  }
362  $a_csv->addColumn($a_set["mark"]);
363  $a_csv->addColumn($a_set["comment"]);
364  $a_csv->addColumn(ilLPObjSettings::_mode2Text($a_set["u_mode"]));
365 
366  $a_csv->addRow();
367  }
368 }
const LP_STATUS_COMPLETED_NUM
fillRowExcel(ilExcel $a_excel, &$a_row, $a_set)
buildPath($ref_ids)
Build path with deep-link.
$path
Definition: aliased.php:25
setDefaultOrderField($a_defaultorderfield)
Set Default order field.
setExportFormats(array $formats)
Set available export formats.
const IL_CAL_DATETIME
static _getImagePathForStatus($a_status)
Get image path for status.
fillHeaderExcel(ilExcel $a_excel, &$a_row)
global $DIC
Definition: saml.php:7
setShowTemplates($a_value)
Toggle templates.
setEnableNumInfo($a_val)
Set enable num info.
static _getStatusText($a_status, $a_lng=null)
Get status alt text.
searchObjects(array $filter, $permission, array $preset_obj_ids=null, $a_check_lp_activation=true)
Search objects that match current filters.
static resetToDefaults()
reset to defaults
static setUseRelativeDates($a_status)
set use relative dates
static getObjectsStatusForUser($a_user_id, array $obj_refs)
const IL_CAL_UNIX
static formatDate(ilDateTime $date, $a_skip_day=false, $a_include_wd=false, $include_seconds=false)
Format a date public.
setId($a_val)
Set id.
TableGUI class for learning progress.
global $ilCtrl
Definition: ilias.php:18
initBaseFilter($a_split_learning_resources=false, $a_include_no_status_filter=true)
Init filter.
setDefaultOrderDirection($a_defaultorderdirection)
Set Default order direction.
setTitle($a_title, $a_icon=0, $a_icon_alt=0)
Set title and title icon.
static getSCOsStatusForUser($a_user_id, $a_parent_obj_id, array $a_sco_ids)
Class for single dates.
TableGUI class for learning progress.
setBold($a_coords)
Set cell(s) to bold.
setSelectAllCheckbox($a_select_all_checkbox, $a_select_all_on_top=false)
Set the name of the checkbox that should be toggled with a select all button.
static getSubItemsStatusForUser($a_user_id, $a_parent_obj_id, array $a_item_ids)
Get subitems status.
static getImagePath($img, $module_path="", $mode="output", $offline=false)
get image path (for images located in a template directory)
static isObjectOffline($a_obj_id, $a_type=null)
fillRow($a_set)
Fill table row.
addMultiCommand($a_cmd, $a_text)
Add Command button.
__construct($a_parent_obj, $a_parent_cmd, $a_user="", $obj_ids=null, $details=false, $mode=null, $personal_only=false, $a_parent_id=null, $a_parent_ref_id=null, $lp_context=null)
Constructor.
Date and time handling
$ilUser
Definition: imgupload.php:18
setCell($a_row, $a_col, $a_value, $a_datatype=null)
Set cell value.
$user
Definition: migrateto20.php:57
setRowTemplate($a_template, $a_template_dir="")
Set row template.
$row
setFormAction($a_form_action, $a_multipart=false)
Set Form action parameter.
static getObjectivesStatusForUser($a_user_id, $a_obj_id, array $a_objective_ids)
showTimingsWarning($a_ref_id, $a_user_id)
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.
setEnableHeader($a_enableheader)
Set Enable Header.
static getLPMemberships($a_usr_id, array $a_obj_ids, $a_parent_ref_id=null, $a_mapped_ref_ids=false)
Get all objects where given user is member (from LP POV)
getCurrentFilter($as_query=false)
setEnableTitle($a_enabletitle)
Set Enable Title.
static getInstance($a_obj_id)
setLimit($a_limit=0, $a_default_limit=0)
static _mode2Text($a_mode)