1<?php 2/* Copyright (c) 1998-2009 ILIAS open source, Extended GPL, see docs/LICENSE */ 3 4include_once("./Services/Tracking/classes/class.ilLPTableBaseGUI.php"); 5require_once("./Services/Tracking/classes/class.ilLearningProgressGUI.php"); 6 7/** 8* TableGUI class for learning progress 9* 10* @author Alex Killing <alex.killing@gmx.de> 11* @version $Id$ 12* 13* @ilCtrl_Calls ilLPProgressTableGUI: ilFormPropertyDispatchGUI 14* @ingroup ServicesTracking 15*/ 16class ilLPProgressTableGUI extends ilLPTableBaseGUI 17{ 18 /** 19 * Constructor 20 */ 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) { 137 case ilLearningProgressGUI::LP_CONTEXT_ORG_UNIT: 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) { 157 case ilLPObjSettings::LP_MODE_SCORM: 158 $data = ilTrQuery::getSCOsStatusForUser($this->tracked_user->getId(), $this->parent_obj_id, $obj_ids); 159 break; 160 161 case ilLPObjSettings::LP_MODE_OBJECTIVES: 162 $data = ilTrQuery::getObjectivesStatusForUser($this->tracked_user->getId(), $this->parent_obj_id, $obj_ids); 163 break; 164 165 case ilLPObjSettings::LP_MODE_COLLECTION_MANUAL: 166 case ilLPObjSettings::LP_MODE_COLLECTION_TLT: 167 case ilLPObjSettings::LP_MODE_COLLECTION_MOBS: 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 195 /** 196 * Fill table row 197 */ 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 353 ilDatePresentation::setUseRelativeDates(false); 354 $a_csv->addColumn(ilDatePresentation::formatDate(new ilDateTime($a_set['status_changed'], IL_CAL_DATETIME))); 355 ilDatePresentation::resetToDefaults(); 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} 369