ILIAS  Release_4_4_x_branch Revision 61816
 All Data Structures Namespaces Files Functions Variables Groups Pages
class.ilLPTableBaseGUI.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/Table/classes/class.ilTable2GUI.php");
5 include_once './Services/Search/classes/class.ilSearchSettings.php';
6 
16 {
17  protected $filter; // array
18  protected $anonymized; // [bool]
19 
20  public function __construct($a_parent_obj, $a_parent_cmd = "", $a_template_context = "")
21  {
22  parent::__construct($a_parent_obj, $a_parent_cmd, $a_template_context);
23 
24  // country names
25  $this->lng->loadLanguageModule("meta");
26 
27  include_once("./Services/Object/classes/class.ilObjectLP.php");
28 
29  $this->anonymized = (bool)!ilObjUserTracking::_enabledUserRelatedData();
30  if(!$this->anonymized && $this->obj_id)
31  {
32  include_once "Services/Object/classes/class.ilObjectLP.php";
33  $olp = ilObjectLP::getInstance($this->obj_id);
34  $this->anonymized = $olp->isAnonymized();
35  }
36  }
37 
38  public function executeCommand()
39  {
40  global $ilCtrl;
41 
42  $this->determineSelectedFilters();
43 
44  if(!$ilCtrl->getNextClass($this))
45  {
46  $to_hide = false;
47 
48  switch($ilCtrl->getCmd())
49  {
50  case "applyFilter":
51  $this->resetOffset();
52  $this->writeFilterToSession();
53  break;
54 
55  case "resetFilter":
56  $this->resetOffset();
57  $this->resetFilter();
58  break;
59 
60  case "hideSelected":
61  $to_hide = $_POST["item_id"];
62  break;
63 
64  case "hide":
65  $to_hide = array((int)$_GET["hide"]);
66  break;
67 
68  // page selector
69  default:
70  $this->determineOffsetAndOrder();
71  $this->storeNavParameter();
72  break;
73  }
74 
75  if($to_hide)
76  {
77  $obj = $this->getFilterItemByPostVar("hide");
78  $value = array_unique(array_merge((array)$obj->getValue(), $to_hide));
79  $obj->setValue($value);
80  $obj->writeToSession();
81  }
82 
83  if(isset($_REQUEST["tbltplcrt"]))
84  {
85  $ilCtrl->setParameter($this->parent_obj, "tbltplcrt", $_REQUEST["tbltplcrt"]);
86  }
87  if(isset($_REQUEST["tbltpldel"]))
88  {
89  $ilCtrl->setParameter($this->parent_obj, "tbltpldel", $_REQUEST["tbltpldel"]);
90  }
91 
92  $ilCtrl->redirect($this->parent_obj, $this->parent_cmd);
93  }
94  else
95  {
96  // e.g. repository selector
97  return parent::executeCommand();
98  }
99  }
100 
108  protected function searchObjects(array $filter, $permission, array $preset_obj_ids = null)
109  {
110  global $ilObjDataCache;
111 
112  /* for performance issues: fast search WITHOUT any permission checks
113  include_once "Services/Tracking/classes/class.ilTrQuery.php";
114  return ilTrQuery::searchObjects($filter["type"], $filter["query"],
115  $filter["area"], $filter["hide"], $preset_obj_ids);
116  */
117 
118  include_once './Services/Search/classes/class.ilQueryParser.php';
119 
120  $query_parser =& new ilQueryParser($filter["query"]);
121  $query_parser->setMinWordLength(0);
122  $query_parser->setCombination(QP_COMBINATION_AND);
123  $query_parser->parse();
124  if(!$query_parser->validate())
125  {
126  // echo $query_parser->getMessage();
127  return false;
128  }
129 
130  if($filter["type"] == "lres")
131  {
132  $filter["type"] = array('lm','sahs','htlm','dbk');
133  }
134  else
135  {
136  $filter["type"] = array($filter["type"]);
137  }
138 
139  include_once 'Services/Search/classes/Like/class.ilLikeObjectSearch.php';
140  $object_search =& new ilLikeObjectSearch($query_parser);
141  $object_search->setFilter($filter["type"]);
142  if($preset_obj_ids)
143  {
144  $object_search->setIdFilter($preset_obj_ids);
145  }
146  $res =& $object_search->performSearch();
147 
148  if($permission)
149  {
150  $res->setRequiredPermission($permission);
151  }
152 
153  $res->setMaxHits(1000);
154  $res->addObserver($this, "searchFilterListener");
155 
156  if(!$this->filter["area"])
157  {
158  $res->filter(ROOT_FOLDER_ID, false);
159  }
160  else
161  {
162  $res->filter($this->filter["area"], false);
163  }
164 
165  $objects = array();
166  foreach($res->getResults() as $obj_data)
167  {
168  $objects[$obj_data['obj_id']][] = $obj_data['ref_id'];
169  }
170 
171  // Check if search max hits is reached
172  if($res->isLimitReached())
173  {
174  $this->lng->loadLanguageModule("search");
175  ilUtil::sendFailure(sprintf($this->lng->txt("search_limit_reached"), 1000));
176  }
177 
178  return $objects ? $objects : array();
179  }
180 
186  public function searchFilterListener($a_ref_id, $a_data)
187  {
188  if(is_array($this->filter["hide"]) && in_array($a_data["obj_id"], $this->filter["hide"]))
189  {
190  return false;
191  }
192  $olp = ilObjectLP::getInstance($a_data["obj_id"]);
193  if(get_class($olp) != "ilObjectLP" && // #13654 - LP could be unsupported
194  !$olp->isActive())
195  {
196  return false;
197  }
198  return true;
199  }
200 
206  public function initFilter($a_split_learning_resources = false, $a_include_no_status_filter = true)
207  {
208  global $lng, $ilObjDataCache;
209 
210  $this->setDisableFilterHiding(true);
211 
212  // object type selection
213  include_once("./Services/Form/classes/class.ilSelectInputGUI.php");
214  $si = new ilSelectInputGUI($this->lng->txt("obj_type"), "type");
215  $si->setOptions($this->getPossibleTypes($a_split_learning_resources));
216  $this->addFilterItem($si);
217  $si->readFromSession();
218  if(!$si->getValue())
219  {
220  $si->setValue("crs");
221  }
222  $this->filter["type"] = $si->getValue();
223 
224  // hidden items
225  include_once("./Services/Form/classes/class.ilMultiSelectInputGUI.php");
226  $msi = new ilMultiSelectInputGUI($lng->txt("trac_filter_hidden"), "hide");
227  $this->addFilterItem($msi);
228  $msi->readFromSession();
229  $this->filter["hide"] = $msi->getValue();
230  if($this->filter["hide"])
231  {
232  // create options from current value
233  $types = $this->getCurrentFilter(true);
234  $type = $types["type"];
235  $options = array();
236  if($type == 'lres')
237  {
238  $type = array('lm','sahs','htlm','dbk');
239  }
240  else
241  {
242  $type = array($type);
243  }
244  foreach($this->filter["hide"] as $obj_id)
245  {
246  if(in_array($ilObjDataCache->lookupType($obj_id), $type))
247  {
248  $options[$obj_id] = $ilObjDataCache->lookupTitle($obj_id);
249  }
250  }
251  $msi->setOptions($options);
252  }
253 
254  // title/description
255  include_once("./Services/Form/classes/class.ilTextInputGUI.php");
256  $ti = new ilTextInputGUI($lng->txt("trac_title_description"), "query");
257  $ti->setMaxLength(64);
258  $ti->setSize(20);
259  $this->addFilterItem($ti);
260  $ti->readFromSession();
261  $this->filter["query"] = $ti->getValue();
262 
263  // repository area selection
264  include_once("./Services/Form/classes/class.ilRepositorySelectorInputGUI.php");
265  $rs = new ilRepositorySelectorInputGUI($lng->txt("trac_filter_area"), "area");
266  $rs->setSelectText($lng->txt("trac_select_area"));
267  $this->addFilterItem($rs);
268  $rs->readFromSession();
269  $this->filter["area"] = $rs->getValue();
270 
271  // hide "not started yet"
272  if($a_include_no_status_filter)
273  {
274  include_once("./Services/Form/classes/class.ilCheckboxInputGUI.php");
275  $cb = new ilCheckboxInputGUI($lng->txt("trac_filter_has_status"), "status");
276  $this->addFilterItem($cb);
277  $cb->readFromSession();
278  $this->filter["status"] = $cb->getChecked();
279  }
280  }
281 
288  protected function buildPath($ref_ids)
289  {
290  global $tree, $ilCtrl;
291 
292  include_once './Services/Link/classes/class.ilLink.php';
293 
294  if(!count($ref_ids))
295  {
296  return false;
297  }
298  foreach($ref_ids as $ref_id)
299  {
300  $path = "...";
301  $counter = 0;
302  $path_full = $tree->getPathFull($ref_id);
303  foreach($path_full as $data)
304  {
305  if(++$counter < (count($path_full)-1))
306  {
307  continue;
308  }
309  $path .= " &raquo; ";
310  if($ref_id != $data['ref_id'])
311  {
312  $path .= $data['title'];
313  }
314  else
315  {
316  $path .= ('<a target="_top" href="'.
317  ilLink::_getLink($data['ref_id'],$data['type']).'">'.
318  $data['title'].'</a>');
319  }
320  }
321 
322  $result[$ref_id] = $path;
323  }
324  return $result;
325  }
326 
334  protected function getPossibleTypes($a_split_learning_resources = false, $a_include_digilib = false, $a_allow_undefined_lp = false)
335  {
336  global $lng, $ilPluginAdmin;
337 
338  $options = array();
339 
340  if($a_split_learning_resources)
341  {
342  $options['lm'] = $lng->txt('objs_lm');
343  $options['sahs'] = $lng->txt('objs_sahs');
344  $options['htlm'] = $lng->txt('objs_htlm');
345 
346  if($a_include_digilib)
347  {
348  $options['dbk'] = $lng->txt('objs_dbk');
349  }
350  }
351  else
352  {
353  $options['lres'] = $lng->txt('learning_resources');
354  }
355 
356  $options['crs'] = $lng->txt('objs_crs');
357  $options['grp'] = $lng->txt('objs_grp');
358  $options['exc'] = $lng->txt('objs_exc');
359  $options['tst'] = $lng->txt('objs_tst');
360 
361  if($a_allow_undefined_lp)
362  {
363  $options["file"] = $lng->txt("objs_file");
364  $options["webr"] = $lng->txt("objs_webr");
365  $options["wiki"] = $lng->txt("objs_wiki");
366  }
367 
368  // repository plugins (currently only active)
369  include_once 'Services/Repository/classes/class.ilRepositoryObjectPluginSlot.php';
370  $pl_names = $ilPluginAdmin->getActivePluginsForSlot(IL_COMP_SERVICE, "Repository", "robj");
371  foreach ($pl_names as $pl)
372  {
373  $pl_id = $ilPluginAdmin->getId(IL_COMP_SERVICE, "Repository", "robj", $pl);
375  {
376  $options[$pl_id] = ilPlugin::lookupTxt("rep_robj", $pl_id, "objs_".$pl_id);
377  }
378  }
379 
380  asort($options);
381  return $options;
382  }
383 
384  protected function parseValue($id, $value, $type)
385  {
386  global $lng;
387 
388  // get rid of aggregation
389  $pos = strrpos($id, "_");
390  if($pos !== false)
391  {
392  $function = strtoupper(substr($id, $pos+1));
393  if(in_array($function, array("MIN", "MAX", "SUM", "AVG", "COUNT")))
394  {
395  $id = substr($id, 0, $pos);
396  }
397  }
398 
399  if(trim($value) == "" && $id != "status")
400  {
401  if($id == "title" && get_class($this) != "ilTrObjectUsersPropsTableGUI")
402  {
403  return "--".$lng->txt("none")."--";
404  }
405  return " ";
406  }
407 
408  switch($id)
409  {
410  case "first_access":
411  case "create_date":
412  case 'status_changed':
414  break;
415 
416  case "last_access":
418  break;
419 
420  case "birthday":
421  $value = ilDatePresentation::formatDate(new ilDate($value, IL_CAL_DATE));
422  break;
423 
424  case "spent_seconds":
425  if(in_array($type, array("exc")))
426  {
427  $value = "-";
428  }
429  else
430  {
431  include_once("./Services/Utilities/classes/class.ilFormat.php");
432  $value = ilFormat::_secondsToString($value);
433  }
434  break;
435 
436  case "percentage":
437  /* :TODO:
438  if(in_array(strtolower($this->status_class),
439  array("illpstatusmanual", "illpstatusscormpackage", "illpstatustestfinished")) ||
440  $type == "exc"))
441  */
442  if(false)
443  {
444  $value = "-";
445  }
446  else
447  {
448  $value = $value."%";
449  }
450  break;
451 
452  case "mark":
453  if(in_array($type, array("lm", "dbk")))
454  {
455  $value = "-";
456  }
457  break;
458 
459  case "gender":
460  $value = $lng->txt("gender_".$value);
461  break;
462 
463  case "status":
464  include_once("./Services/Tracking/classes/class.ilLearningProgressBaseGUI.php");
467  $value = ilUtil::img($path, $text);
468  break;
469 
470  case "language":
471  $lng->loadLanguageModule("meta");
472  $value = $lng->txt("meta_l_".$value);
473  break;
474 
475  case "sel_country":
476  $value = $lng->txt("meta_c_".$value);
477  break;
478  }
479 
480  return $value;
481  }
482 
483  public function getCurrentFilter($as_query = false)
484  {
485  $result = array();
486  foreach($this->filter as $id => $value)
487  {
488  $item = $this->getFilterItemByPostVar($id);
489  switch($id)
490  {
491  case "title":
492  case "country":
493  case "gender":
494  case "city":
495  case "language":
496  case "login":
497  case "firstname":
498  case "lastname":
499  case "mark":
500  case "u_comment":
501  case "institution":
502  case "department":
503  case "title":
504  case "street":
505  case "zipcode":
506  case "email":
507  case "matriculation":
508  case "sel_country":
509  case "query":
510  case "type":
511  case "area":
512  if($value)
513  {
514  $result[$id] = $value;
515  }
516  break;
517 
518  case "status":
519  if($value !== false)
520  {
521  $result[$id] = $value;
522  }
523  break;
524 
525  case "user_total":
526  case "read_count":
527  case "percentage":
528  case "hide":
529  case "spent_seconds":
530  if(is_array($value) && implode("", $value))
531  {
532  $result[$id] = $value;
533  }
534  break;
535 
536  case "registration":
537  case "create_date":
538  case "first_access":
539  case "last_access":
540  case 'status_changed':
541  if($value)
542  {
543  if($value["from"])
544  {
545  $result[$id]["from"] = $value["from"]->get(IL_CAL_DATETIME);
546  }
547  if($value["to"])
548  {
549  $result[$id]["to"] = $value["to"]->get(IL_CAL_DATETIME);
550  }
551  }
552  break;
553 
554  case "birthday":
555  if($value)
556  {
557  if($value["from"])
558  {
559  $result[$id]["from"] = $value["from"]->get(IL_CAL_DATETIME);
560  $result[$id]["from"] = substr($result[$id]["from"], 0, -8)."00:00:00";
561  }
562  if($value["to"])
563  {
564  $result[$id]["to"] = $value["to"]->get(IL_CAL_DATETIME);
565  $result[$id]["to"] = substr($result[$id]["to"], 0, -8)."23:59:59";
566  }
567  }
568  break;
569  }
570  }
571 
572  return $result;
573  }
574 
575  protected function isPercentageAvailable($a_obj_id)
576  {
577  // :TODO:
578  $olp = ilObjectLP::getInstance($a_obj_id);
579  $mode = $olp->getCurrentMode();
580  if(in_array($mode, array(ilLPObjSettings::LP_MODE_TLT,
585  {
586  return true;
587  }
588  return false;
589  }
590 
591  protected function parseTitle($a_obj_id, $action, $a_user_id = false)
592  {
593  global $lng, $ilObjDataCache, $ilUser;
594 
595  $user = "";
596  if($a_user_id)
597  {
598  if($a_user_id != $ilUser->getId())
599  {
600  $a_user = ilObjectFactory::getInstanceByObjId($a_user_id);
601  }
602  else
603  {
604  $a_user = $ilUser;
605  }
606  $user .= ", ".$a_user->getFullName(); // " [".$a_user->getLogin()."]";
607  }
608 
609  if($a_obj_id != ROOT_FOLDER_ID)
610  {
611  $this->setTitle($lng->txt($action).": ".$ilObjDataCache->lookupTitle($a_obj_id).$user);
612 
613  $olp = ilObjectLP::getInstance($a_obj_id);
614  $this->setDescription($this->lng->txt('trac_mode').": ".$olp->getModeText($olp->getCurrentMode()));
615  }
616  else
617  {
618  $this->setTitle($lng->txt($action));
619  }
620  }
621 
627  protected function getExportMeta()
628  {
629  global $lng, $ilObjDataCache, $ilUser, $ilClientIniFile;
630 
631  /* see spec
632  Name of installation
633  Name of the course
634  Permalink to course
635  Owner of course object
636  Date of report generation
637  Reporting period
638  Name of person who generated the report.
639  */
640 
642  include_once './Services/Link/classes/class.ilLink.php';
643 
644  $data = array(
645  $lng->txt("trac_name_of_installation") => $ilClientIniFile->readVariable('client', 'name'),
646  $lng->txt("trac_object_name") => $ilObjDataCache->lookupTitle($this->obj_id),
647  $lng->txt("trac_object_link") => ilLink::_getLink($this->ref_id, ilObject::_lookupType($this->obj_id)),
648  $lng->txt("trac_object_owner") => ilObjUser::_lookupFullname(ilObject::_lookupOwner($this->obj_id)),
649  $lng->txt("trac_report_date") =>
651  $lng->txt("trac_report_owner") => $ilUser->getFullName()
652  );
653  return $data;
654  }
655 
656  protected function fillMetaExcel($worksheet, &$a_row)
657  {
658  foreach($this->getExportMeta() as $caption => $value)
659  {
660  $worksheet->write($a_row, 0, $caption);
661  $worksheet->write($a_row, 1, $value);
662  $a_row++;
663  }
664  $a_row++;
665  }
666 
667  protected function fillMetaCSV($a_csv)
668  {
669  foreach($this->getExportMeta() as $caption => $value)
670  {
671  $a_csv->addColumn(strip_tags($caption));
672  $a_csv->addColumn(strip_tags($value));
673  $a_csv->addRow();
674  }
675  $a_csv->addRow();
676  }
677 
678  protected function showTimingsWarning($a_ref_id, $a_user_id)
679  {
680  include_once 'Modules/Course/classes/Timings/class.ilTimingCache.php';
681  if(ilTimingCache::_showWarning($a_ref_id, $a_user_id))
682  {
683  $timings = ilTimingCache::_getTimings($a_ref_id);
684  if($timings['item']['changeable'] and $timings['user'][$a_user_id]['end'])
685  {
686  $end = $timings['user'][$a_user_id]['end'];
687  }
688  else if ($timings['item']['suggestion_end'])
689  {
690  $end = $timings['item']['suggestion_end'];
691  }
692  else
693  {
694  $end = true;
695  }
696  return $end;
697  }
698  }
699 
700  protected function formatSeconds($seconds, $a_shorten_zero = false)
701  {
702  $seconds = ((int)$seconds > 0) ? $seconds : 0;
703  if($a_shorten_zero && !$seconds)
704  {
705  return "-";
706  }
707 
708  $hours = floor($seconds / 3600);
709  $rest = $seconds % 3600;
710 
711  $minutes = floor($rest / 60);
712  $rest = $rest % 60;
713 
714  if($rest)
715  {
716  $minutes++;
717  }
718 
719  return sprintf("%dh%02dm",$hours,$minutes);
720  }
721 
722  protected function anonymizeValue($a_value, $a_force_number = false)
723  {
724  // currently inactive
725  return $a_value;
726 
727  if(is_numeric($a_value))
728  {
729  $threshold = 3;
730  $a_value = (int)$a_value;
731  if($a_value <= $threshold)
732  {
733  if(!$a_force_number)
734  {
735  return "0-".$threshold;
736  }
737  else
738  {
739  return $threshold;
740  }
741  }
742  }
743  return $a_value;
744  }
745 
746  protected function buildValueScale($a_max_value, $a_anonymize = false, $a_format_seconds = false)
747  {
748  $step = 0;
749  if($a_max_value)
750  {
751  $step = $a_max_value / 10;
752  $base = ceil(log($step, 10));
753  $fac = ceil($step / pow(10, ($base - 1)));
754  $step = pow(10, $base - 1) * $fac;
755  }
756  if ($step <= 1)
757  {
758  $step = 1;
759  }
760  $ticks = range(0, $a_max_value+$step, $step);
761 
762  $value_ticks = array(0 => 0);
763  foreach($ticks as $tick)
764  {
765  $value = $tvalue = $tick;
766  if($a_anonymize)
767  {
768  $value = $this->anonymizeValue($value, true);
769  $tvalue = $this->anonymizeValue($tvalue);
770  }
771  if($a_format_seconds)
772  {
773  $tvalue = $this->formatSeconds($value);
774  }
775  $value_ticks[$value] = $tvalue;
776  }
777 
778  return $value_ticks;
779  }
780 
781  protected function getMonthsFilter($a_short = false)
782  {
783  global $lng;
784 
785  $options = array();
786  for($loop = 0; $loop < 10; $loop++)
787  {
788  $year = date("Y")-$loop;
789  $options[$year] = $year;
790  for($loop2 = 12; $loop2 > 0; $loop2--)
791  {
792  $month = str_pad($loop2, 2, "0", STR_PAD_LEFT);
793  if($year.$month <= date("Ym"))
794  {
795  if(!$a_short)
796  {
797  $caption = $year." / ".$lng->txt("month_".$month."_long");
798  }
799  else
800  {
801  $caption = $year."/".$month;
802  }
803  $options[$year."-".$month] = $caption;
804  }
805  }
806  }
807  return $options;
808  }
809 
810  protected function getMonthsYear($a_year = null, $a_short = false)
811  {
812  global $lng;
813 
814  if(!$a_year)
815  {
816  $a_year = date("Y");
817  }
818 
819  $all = array();
820  for($loop = 1; $loop<13; $loop++)
821  {
822  $month = str_pad($loop, 2, "0", STR_PAD_LEFT);
823  if($a_year."-".$month <= date("Y-m"))
824  {
825  if(!$a_short)
826  {
827  $caption = $lng->txt("month_".$month."_long");
828  }
829  else
830  {
831  $caption = $lng->txt("month_".$month."_short");
832  }
833  $all[$a_year."-".$month] = $caption;
834  }
835  }
836  return $all;
837  }
838 
839  protected function getSelectableUserColumns($a_in_course = false, $a_in_group = false)
840  {
841  global $lng, $ilSetting;
842 
843  $cols = $privacy_fields = array();
844 
845  include_once("./Services/User/classes/class.ilUserProfile.php");
846  $up = new ilUserProfile();
847  $up->skipGroup("preferences");
848  $up->skipGroup("settings");
849  $ufs = $up->getStandardFields();
850 
851  // default fields
852  $cols["login"] = array(
853  "txt" => $lng->txt("login"),
854  "default" => true);
855 
856  if(!$this->anonymized)
857  {
858  $cols["firstname"] = array(
859  "txt" => $lng->txt("firstname"),
860  "default" => true);
861  $cols["lastname"] = array(
862  "txt" => $lng->txt("lastname"),
863  "default" => true);
864  }
865 
866  // show only if extended data was activated in lp settings
867  include_once 'Services/Tracking/classes/class.ilObjUserTracking.php';
868  $tracking = new ilObjUserTracking();
869  if($tracking->hasExtendedData(ilObjUserTracking::EXTENDED_DATA_LAST_ACCESS))
870  {
871  $cols["first_access"] = array(
872  "txt" => $lng->txt("trac_first_access"),
873  "default" => true);
874  $cols["last_access"] = array(
875  "txt" => $lng->txt("trac_last_access"),
876  "default" => true);
877  }
878  if($tracking->hasExtendedData(ilObjUserTracking::EXTENDED_DATA_READ_COUNT))
879  {
880  $cols["read_count"] = array(
881  "txt" => $lng->txt("trac_read_count"),
882  "default" => true);
883  }
884  if($tracking->hasExtendedData(ilObjUserTracking::EXTENDED_DATA_SPENT_SECONDS))
885  {
886  $cols["spent_seconds"] = array(
887  "txt" => $lng->txt("trac_spent_seconds"),
888  "default" => true);
889  }
890 
891  if($this->isPercentageAvailable($this->obj_id))
892  {
893  $cols["percentage"] = array(
894  "txt" => $lng->txt("trac_percentage"),
895  "default" => true);
896  }
897 
898  // do not show status if learning progress is deactivated
899  $olp = ilObjectLP::getInstance($this->obj_id);
900  if($olp->isActive())
901  {
902  $cols["status"] = array(
903  "txt" => $lng->txt("trac_status"),
904  "default" => true);
905 
906  $cols['status_changed'] = array(
907  'txt' => $lng->txt('trac_status_changed'),
908  'default' => false);
909  }
910 
911  if($this->type != "lm")
912  {
913  $cols["mark"] = array(
914  "txt" => $lng->txt("trac_mark"),
915  "default" => true);
916  }
917 
918  $cols["u_comment"] = array(
919  "txt" => $lng->txt("trac_comment"),
920  "default" => false);
921 
922  $cols["create_date"] = array(
923  "txt" => $lng->txt("create_date"),
924  "default" => false);
925  $cols["language"] = array(
926  "txt" => $lng->txt("language"),
927  "default" => false);
928 
929  // add user data only if object is [part of] course
930  if(!$this->anonymized &&
931  ($a_in_course || $a_in_group))
932  {
933  // only show if export permission is granted
934  include_once('Services/PrivacySecurity/classes/class.ilPrivacySettings.php');
935  if(ilPrivacySettings::_getInstance()->checkExportAccess($this->ref_id))
936  {
937  // other user profile fields
938  foreach ($ufs as $f => $fd)
939  {
940  if (!isset($cols[$f]) && $f != "username" && !$fd["lists_hide"])
941  {
942  if($a_in_course &&
943  !($fd["course_export_fix_value"] || $ilSetting->get("usr_settings_course_export_".$f)))
944  {
945  continue;
946  }
947  if($a_in_group &&
948  !($fd["group_export_fix_value"] || $ilSetting->get("usr_settings_group_export_".$f)))
949  {
950  continue;
951  }
952 
953  $cols[$f] = array(
954  "txt" => $lng->txt($f),
955  "default" => false);
956 
957  $privacy_fields[] = $f;
958  }
959  }
960 
961  // additional defined user data fields
962  include_once './Services/User/classes/class.ilUserDefinedFields.php';
963  $user_defined_fields = ilUserDefinedFields::_getInstance();
964  if($a_in_course)
965  {
966  $user_defined_fields = $user_defined_fields->getCourseExportableFields();
967  }
968  else
969  {
970  $user_defined_fields = $user_defined_fields->getGroupExportableFields();
971  }
972  foreach($user_defined_fields as $definition)
973  {
974  if($definition["field_type"] != UDF_TYPE_WYSIWYG)
975  {
976  $f = "udf_".$definition["field_id"];
977  $cols[$f] = array(
978  "txt" => $definition["field_name"],
979  "default" => false);
980 
981  $privacy_fields[] = $f;
982  }
983  }
984  }
985  }
986 
987  return array($cols, $privacy_fields);
988  }
989 }
990 
991 ?>