ILIAS  Release_4_4_x_branch Revision 61816
 All Data Structures Namespaces Files Functions Variables Groups Pages
class.ilCourseParticipantsTableGUI.php
Go to the documentation of this file.
1 <?php
2 
3 /*
4  +-----------------------------------------------------------------------------+
5  | ILIAS open source |
6  +-----------------------------------------------------------------------------+
7  | Copyright (c) 1998-2006 ILIAS open source, University of Cologne |
8  | |
9  | This program is free software; you can redistribute it and/or |
10  | modify it under the terms of the GNU General Public License |
11  | as published by the Free Software Foundation; either version 2 |
12  | of the License, or (at your option) any later version. |
13  | |
14  | This program is distributed in the hope that it will be useful, |
15  | but WITHOUT ANY WARRANTY; without even the implied warranty of |
16  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
17  | GNU General Public License for more details. |
18  | |
19  | You should have received a copy of the GNU General Public License |
20  | along with this program; if not, write to the Free Software |
21  | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
22  +-----------------------------------------------------------------------------+
23  */
24 
25 include_once('./Services/Table/classes/class.ilTable2GUI.php');
26 
35 {
36  protected $type = 'admin';
37  protected $show_learning_progress = false;
38  protected $show_timings = false;
39  protected $show_edit_link = true;
40  protected static $export_allowed = false;
41  protected static $confirmation_required = true;
42  protected static $accepted_ids = null;
43  protected static $all_columns = null;
44 
45  protected $role_id = 0;
46 
54  public function __construct(
55  $a_parent_obj,
56  $a_type = 'admin',
57  $show_content = true,
58  $a_show_learning_progress = false,
59  $a_show_timings = false,
60  $a_show_edit_link= true,
61  $a_role_id = 0,
62  $a_show_lp_status_sync = false)
63  {
64  global $lng, $ilCtrl;
65 
66  $this->show_learning_progress = $a_show_learning_progress;
67  $this->show_timings = $a_show_timings;
68  $this->show_edit_link = $a_show_edit_link;
69  $this->show_lp_status_sync = $a_show_lp_status_sync;
70 
71  // #13208
72  include_once("Services/Tracking/classes/class.ilObjUserTracking.php");
74  {
75  $this->show_lp_status_sync = false;
76  }
77 
78  $this->lng = $lng;
79  $this->lng->loadLanguageModule('crs');
80  $this->lng->loadLanguageModule('trac');
81  $this->ctrl = $ilCtrl;
82 
83  $this->type = $a_type;
84  $this->setRoleId($a_role_id);
85 
86  include_once('./Services/PrivacySecurity/classes/class.ilPrivacySettings.php');
87  $this->privacy = ilPrivacySettings::_getInstance();
88 
89  // required before constructor for columns
90  $this->setId('crs_' . $a_type . '_' . $a_role_id.'_'. $a_parent_obj->object->getId());
91  parent::__construct($a_parent_obj, 'members');
92 
93  $this->initAcceptedAgreements();
94 
95  $this->setFormName('participants');
96 
97  $this->addColumn('', 'f', "1");
98  $this->addColumn($this->lng->txt('name'), 'lastname', '20%');
99 
100  $all_cols = $this->getSelectableColumns();
101  foreach($this->getSelectedColumns() as $col)
102  {
103  $this->addColumn($all_cols[$col]['txt'], $col);
104  }
105 
106  if($this->show_learning_progress)
107  {
108  $this->addColumn($this->lng->txt('learning_progress'), 'progress');
109  }
110 
111  if($this->privacy->enabledCourseAccessTimes())
112  {
113  $this->addColumn($this->lng->txt('last_access'), 'access_ut', '16em');
114  }
115 
116  $this->addColumn($this->lng->txt('crs_member_passed'), 'passed');
117  if($this->show_lp_status_sync)
118  {
119  $this->addColumn($this->lng->txt('crs_member_passed_status_changed'), 'passed_info');
120  }
121 
122  if($this->type == 'admin')
123  {
124  $this->setSelectAllCheckbox('admins');
125  $this->addColumn($this->lng->txt('crs_notification_list_title'), 'notification');
126  $this->addCommandButton('updateAdminStatus', $this->lng->txt('save'));
127  }
128  elseif($this->type == 'tutor')
129  {
130  $this->setSelectAllCheckbox('tutors');
131  $this->addColumn($this->lng->txt('crs_notification_list_title'), 'notification');
132  $this->addCommandButton('updateTutorStatus', $this->lng->txt('save'));
133  }
134  elseif($this->type == 'member')
135  {
136  $this->setSelectAllCheckbox('members');
137  $this->addColumn($this->lng->txt('crs_blocked'), 'blocked');
138  $this->addCommandButton('updateMemberStatus', $this->lng->txt('save'));
139  }
140  else
141  {
142  $this->setSelectAllCheckbox('roles');
143  $this->addColumn($this->lng->txt('crs_blocked'), 'blocked');
144  $this->addCommandButton('updateRoleStatus', $this->lng->txt('save'));
145 
146  }
147  $this->addColumn($this->lng->txt(''), 'optional');
148 
149  $this->setRowTemplate("tpl.show_participants_row.html", "Modules/Course");
150 
151  if($show_content)
152  {
153  $this->setDefaultOrderField('lastname');
154  $this->enable('sort');
155  $this->enable('header');
156  $this->enable('numinfo');
157  $this->enable('select_all');
158  }
159  else
160  {
161  $this->disable('content');
162  $this->disable('header');
163  $this->disable('footer');
164  $this->disable('numinfo');
165  $this->disable('select_all');
166  }
167 
168  $this->setEnableNumInfo(true);
169  $this->setExternalSegmentation(true);
170 
171  $this->getItems();
172  $this->setTopCommands(true);
173  $this->setEnableHeader(true);
174  $this->setEnableTitle(true);
175  $this->initFilter();
176 
177  $this->setShowRowsSelector(true);
178 
179  include_once "Services/Certificate/classes/class.ilCertificate.php";
180  $this->enable_certificates = ilCertificate::isActive();
181  if($this->enable_certificates)
182  {
183  $this->enable_certificates = ilCertificate::isObjectActive($a_parent_obj->object->getId());
184  }
185  if($this->enable_certificates)
186  {
187  $lng->loadLanguageModule('certificate');
188  }
189  }
190 
194  public function setRoleId($a_role_id)
195  {
196  $this->role_id = $a_role_id;
197  }
198 
203  public function getRoleId()
204  {
205  return $this->role_id;
206  }
207 
208  public function getItems()
209  {
210 
211  }
212 
217  public function getSelectableColumns()
218  {
219  global $ilSetting;
220 
221  if(self::$all_columns)
222  {
223  #return self::$all_columns;
224  }
225 
226  include_once './Services/PrivacySecurity/classes/class.ilExportFieldsInfo.php';
227  $ef = ilExportFieldsInfo::_getInstanceByType($this->getParentObject()->object->getType());
228  self::$all_columns = $ef->getSelectableFieldsInfo($this->getParentObject()->object->getId());
229 
230  if ($this->type == 'member' &&
231  $ilSetting->get('user_portfolios'))
232  {
233  self::$all_columns['prtf'] = array(
234  'txt' => $this->lng->txt('obj_prtf'),
235  'default' => false
236  );
237  }
238 
239  return self::$all_columns;
240  }
241 
249  public function fillRow($a_set)
250  {
251  global $ilAccess;
252 
253  $this->tpl->setVariable('VAL_ID', $a_set['usr_id']);
254  $this->tpl->setVariable('VAL_NAME', $a_set['lastname'] . ', ' . $a_set['firstname']);
255 
256  if(!$ilAccess->checkAccessOfUser($a_set['usr_id'], 'read', '', $this->getParentObject()->object->getRefId()) and
257  is_array($info = $ilAccess->getInfo()))
258  {
259  $this->tpl->setCurrentBlock('access_warning');
260  $this->tpl->setVariable('PARENT_ACCESS', $info[0]['text']);
261  $this->tpl->parseCurrentBlock();
262  }
263 
264  if(!ilObjUser::_lookupActive($a_set['usr_id']))
265  {
266  $this->tpl->setCurrentBlock('access_warning');
267  $this->tpl->setVariable('PARENT_ACCESS', $this->lng->txt('usr_account_inactive'));
268  $this->tpl->parseCurrentBlock();
269  }
270 
271 
272  foreach($this->getSelectedColumns() as $field)
273  {
274  switch($field)
275  {
276  case 'gender':
277  $a_set['gender'] = $a_set['gender'] ? $this->lng->txt('gender_' . $a_set['gender']) : '';
278  $this->tpl->setCurrentBlock('custom_fields');
279  $this->tpl->setVariable('VAL_CUST', $a_set[$field]);
280  $this->tpl->parseCurrentBlock();
281  break;
282 
283  case 'birthday':
284  $a_set['birthday'] = $a_set['birthday'] ? ilDatePresentation::formatDate(new ilDate($a_set['birthday'], IL_CAL_DATE)) : $this->lng->txt('no_date');
285  $this->tpl->setCurrentBlock('custom_fields');
286  $this->tpl->setVariable('VAL_CUST', $a_set[$field]);
287  $this->tpl->parseCurrentBlock();
288  break;
289 
290  case 'consultation_hour':
291  $this->tpl->setCurrentBlock('custom_fields');
292  $dts = array();
293  foreach((array) $a_set['consultation_hours'] as $ch)
294  {
296  new ilDateTime($ch['dt'],IL_CAL_UNIX),
297  new ilDateTime($ch['dtend'],IL_CAL_UNIX)
298  );
299  if($ch['explanation'])
300  {
301  $tmp .= ' ' . $ch['explanation'];
302  }
303  $dts[] = $tmp;
304  }
305  $dt_string = implode('<br />', $dts);
306  $this->tpl->setVariable('VAL_CUST',$dt_string);
307  $this->tpl->parseCurrentBlock();
308  break;
309 
310  case 'prtf':
311  $tmp = array();
312  if(is_array($a_set['prtf']))
313  {
314  foreach($a_set['prtf'] as $prtf_url => $prtf_txt)
315  {
316  $tmp[] = '<a href="'.$prtf_url.'">'.$prtf_txt.'</a>';
317  }
318  }
319  $this->tpl->setVariable('VAL_CUST', implode('<br />', $tmp)) ;
320  break;
321 
322  default:
323  $this->tpl->setCurrentBlock('custom_fields');
324  $this->tpl->setVariable('VAL_CUST', isset($a_set[$field]) ? (string) $a_set[$field] : '');
325  $this->tpl->parseCurrentBlock();
326  break;
327  }
328  }
329 
330  if($this->privacy->enabledCourseAccessTimes())
331  {
332  $this->tpl->setVariable('VAL_ACCESS', $a_set['access_time']);
333  }
334  if($this->show_learning_progress)
335  {
336  $this->tpl->setCurrentBlock('lp');
337  switch($a_set['progress'])
338  {
340  $this->tpl->setVariable('LP_STATUS_ALT', $this->lng->txt($a_set['progress']));
341  $this->tpl->setVariable('LP_STATUS_PATH', ilUtil::getImagePath('scorm/complete.png'));
342  break;
343 
345  $this->tpl->setVariable('LP_STATUS_ALT', $this->lng->txt($a_set['progress']));
346  $this->tpl->setVariable('LP_STATUS_PATH', ilUtil::getImagePath('scorm/incomplete.png'));
347  break;
348 
350  $this->tpl->setVariable('LP_STATUS_ALT', $this->lng->txt($a_set['progress']));
351  $this->tpl->setVariable('LP_STATUS_PATH', ilUtil::getImagePath('scorm/not_attempted.png'));
352  break;
353 
355  $this->tpl->setVariable('LP_STATUS_ALT', $this->lng->txt($a_set['progress']));
356  $this->tpl->setVariable('LP_STATUS_PATH', ilUtil::getImagePath('scorm/failed.png'));
357  break;
358  }
359  $this->tpl->parseCurrentBlock();
360  }
361  if($this->type == 'admin')
362  {
363  $this->tpl->setVariable('VAL_POSTNAME', 'admins');
364  $this->tpl->setVariable('VAL_NOTIFICATION_ID', $a_set['usr_id']);
365  $this->tpl->setVariable('VAL_NOTIFICATION_CHECKED', ($a_set['notification'] ? 'checked="checked"' : ''));
366  }
367  elseif($this->type == 'tutor')
368  {
369  $this->tpl->setVariable('VAL_POSTNAME', 'tutors');
370  $this->tpl->setVariable('VAL_NOTIFICATION_ID', $a_set['usr_id']);
371  $this->tpl->setVariable('VAL_NOTIFICATION_CHECKED', ($a_set['notification'] ? 'checked="checked"' : ''));
372  }
373  elseif($this->type == 'member')
374  {
375  $this->tpl->setCurrentBlock('blocked');
376  $this->tpl->setVariable('VAL_POSTNAME','members');
377  $this->tpl->setVariable('VAL_BLOCKED_ID',$a_set['usr_id']);
378  $this->tpl->setVariable('VAL_BLOCKED_CHECKED',($a_set['blocked'] ? 'checked="checked"' : ''));
379  $this->tpl->parseCurrentBlock();
380  }
381  else
382  {
383  $this->tpl->setCurrentBlock('blocked');
384  $this->tpl->setVariable('VAL_BLOCKED_ID', $a_set['usr_id']);
385  $this->tpl->setVariable('VAL_BLOCKED_CHECKED', ($a_set['blocked'] ? 'checked="checked"' : ''));
386  $this->tpl->parseCurrentBlock();
387 
388  $this->tpl->setVariable('VAL_POSTNAME','roles');
389  }
390 
391  $this->tpl->setVariable('VAL_PASSED_ID',$a_set['usr_id']);
392  $this->tpl->setVariable('VAL_PASSED_CHECKED',($a_set['passed'] ? 'checked="checked"' : ''));
393 
394  if($this->show_lp_status_sync)
395  {
396  $this->tpl->setVariable('PASSED_INFO', $a_set["passed_info"]);
397  }
398 
399  $this->ctrl->setParameter($this->parent_obj, 'member_id', $a_set['usr_id']);
400  if($this->show_edit_link)
401  {
402  $this->tpl->setCurrentBlock('link');
403  $this->tpl->setVariable('LINK_NAME', $this->ctrl->getLinkTarget($this->parent_obj, 'editMember'));
404  $this->tpl->setVariable('LINK_TXT', $this->lng->txt('edit'));
405  $this->tpl->parseCurrentBlock();
406  }
407  if($a_set['passed'] && $this->enable_certificates)
408  {
409  $this->tpl->setCurrentBlock('link');
410  $this->tpl->setVariable('LINK_NAME', $this->ctrl->getLinkTarget($this->parent_obj, 'deliverCertificate'));
411  $this->tpl->setVariable('LINK_TXT', $this->lng->txt('download_certificate'));
412  $this->tpl->parseCurrentBlock();
413  }
414  $this->ctrl->clearParameters($this->parent_obj);
415 
416  if($this->show_timings)
417  {
418  $this->ctrl->setParameterByClass('ilcoursecontentgui', 'member_id', $a_set['usr_id']);
419  $this->tpl->setCurrentBlock('link');
420  $this->tpl->setVariable('LINK_NAME', $this->ctrl->getLinkTargetByClass('ilcoursecontentgui', 'showUserTimings'));
421  $this->tpl->setVariable('LINK_TXT', $this->lng->txt('timings_timings'));
422  $this->tpl->parseCurrentBlock();
423  }
424  }
425 
432  public function parse()
433  {
434  global $rbacreview;
435 
436  $this->determineOffsetAndOrder();
437 
438  include_once './Services/User/classes/class.ilUserQuery.php';
439 
440  $additional_fields = $this->getSelectedColumns();
441  unset($additional_fields["firstname"]);
442  unset($additional_fields["lastname"]);
443  unset($additional_fields["last_login"]);
444  unset($additional_fields["access_until"]);
445  unset($additional_fields['consultation_hour']);
446  unset($additional_fields['prtf']);
447 
448  $udf_ids = $usr_data_fields = $odf_ids = array();
449  foreach($additional_fields as $field)
450  {
451  if(substr($field, 0, 3) == 'udf')
452  {
453  $udf_ids[] = substr($field, 4);
454  continue;
455  }
456  if(substr($field, 0, 3) == 'odf')
457  {
458  $odf_ids[] = substr($field, 4);
459  continue;
460  }
461 
462  $usr_data_fields[] = $field;
463  }
464 
465  $usr_data = ilUserQuery::getUserListData(
466  $this->getOrderField(),
467  $this->getOrderDirection(),
468  $this->getOffset(),
469  $this->getLimit(),
470  '',
471  '',
472  null,
473  false,
474  false,
475  0,
476  $this->getRoleId(),
477  null,
478  $usr_data_fields,
479  $part
480  );
481  foreach((array) $usr_data['set'] as $user)
482  {
483  $usr_ids[] = $user['usr_id'];
484  }
485 
486  // merge course data
487  $course_user_data = $this->getParentObject()->readMemberData($usr_ids,
488  $this->type == 'admin',
489  $this->getSelectedColumns());
490  $a_user_data = array();
491  foreach((array) $usr_data['set'] as $ud)
492  {
493  $a_user_data[$ud['usr_id']] = array_merge($ud,$course_user_data[$ud['usr_id']]);
494 
495  if($this->show_lp_status_sync)
496  {
497  // #9912 / #13208
498  $passed_info = "";
499  if($a_user_data[$ud['usr_id']]["passed_info"])
500  {
501  $pinfo = $a_user_data[$ud['usr_id']]["passed_info"];
502  if($pinfo["user_id"])
503  {
504  if($pinfo["user_id"] < 0)
505  {
506  $passed_info = $this->lng->txt("crs_passed_status_system");
507  }
508  else if($pinfo["user_id"] > 0)
509  {
510  $name = ilObjUser::_lookupName($pinfo["user_id"]);
511  $passed_info = $this->lng->txt("crs_passed_status_manual_by").": ".$name["login"];
512  }
513  }
514  if($pinfo["timestamp"])
515  {
516  $passed_info .= "<br />".ilDatePresentation::formatDate($pinfo["timestamp"]);
517  }
518  }
519  $a_user_data[$ud['usr_id']]["passed_info"] = $passed_info;
520  }
521  }
522 
523  // Custom user data fields
524  if($udf_ids)
525  {
526  include_once './Services/User/classes/class.ilUserDefinedData.php';
527  $data = ilUserDefinedData::lookupData($usr_ids, $udf_ids);
528  foreach($data as $usr_id => $fields)
529  {
530  if(!$this->checkAcceptance($usr_id))
531  {
532  continue;
533  }
534 
535  foreach($fields as $field_id => $value)
536  {
537  $a_user_data[$usr_id]['udf_' . $field_id] = $value;
538  }
539  }
540  }
541  // Object specific user data fields
542  if($odf_ids)
543  {
544  include_once './Modules/Course/classes/Export/class.ilCourseUserData.php';
545  $data = ilCourseUserData::_getValuesByObjId($this->getParentObject()->object->getId());
546  foreach($data as $usr_id => $fields)
547  {
548  // #7264: as we get data for all course members filter against user data
549  if(!$this->checkAcceptance($usr_id) || !in_array($usr_id, $usr_ids))
550  {
551  continue;
552  }
553 
554  foreach($fields as $field_id => $value)
555  {
556  $a_user_data[$usr_id]['odf_' . $field_id] = $value;
557  }
558  }
559  }
560 
561  foreach($usr_data['set'] as $user)
562  {
563  // Check acceptance
564  if(!$this->checkAcceptance($user['usr_id']))
565  {
566  continue;
567  }
568  // DONE: accepted
569  foreach($usr_data_fields as $field)
570  {
571  $a_user_data[$user['usr_id']][$field] = $user[$field] ? $user[$field] : '';
572  }
573  }
574  // consultation hours
575  if($this->isColumnSelected('consultation_hour'))
576  {
577  include_once './Services/Booking/classes/class.ilBookingEntry.php';
578  foreach(ilBookingEntry::lookupManagedBookingsForObject($this->getParentObject()->object->getId(), $GLOBALS['ilUser']->getId()) as $buser => $booking)
579  {
580  if(isset($a_user_data[$buser]))
581  {
582  $a_user_data[$buser]['consultation_hour'] = $booking[0]['dt'];
583  $a_user_data[$buser]['consultation_hour_end'] = $booking[0]['dtend'];
584  $a_user_data[$buser]['consultation_hours'] = $booking;
585  }
586  }
587  }
588  $this->setMaxCount($usr_data['cnt'] ? $usr_data['cnt'] : 0);
589  return $this->setData($a_user_data);
590  }
591 
592  public function checkAcceptance($a_usr_id)
593  {
594  if(!self::$confirmation_required)
595  {
596  return true;
597  }
598  if(!self::$export_allowed)
599  {
600  return false;
601  }
602  return in_array($a_usr_id, self::$accepted_ids);
603  }
604 
609  public function initAcceptedAgreements()
610  {
611  if(self::$accepted_ids !== NULL)
612  {
613  return true;
614  }
615 
616  self::$export_allowed = ilPrivacySettings::_getInstance()->checkExportAccess($this->getParentObject()->object->getRefId());
617  self::$confirmation_required = ilPrivacySettings::_getInstance()->courseConfirmationRequired();
618 
619  include_once 'Services/Membership/classes/class.ilMemberAgreement.php';
620  self::$accepted_ids = ilMemberAgreement::lookupAcceptedAgreements($this->getParentObject()->object->getId());
621  }
622 
623 }
624 ?>