ILIAS  Release_5_0_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/Membership/classes/class.ilParticipantsTableGUI.php';
34 {
35  protected $type = 'admin';
36  protected $show_learning_progress = false;
37  protected $show_timings = false;
38  protected $show_edit_link = true;
39 
40  protected $role_id = 0;
41 
49  public function __construct(
50  $a_parent_obj,
51  $a_type = 'admin',
52  $show_content = true,
53  $a_show_learning_progress = false,
54  $a_show_timings = false,
55  $a_show_edit_link= true,
56  $a_role_id = 0,
57  $a_show_lp_status_sync = false)
58  {
59  global $lng, $ilCtrl;
60 
61  $this->show_learning_progress = $a_show_learning_progress;
62  $this->show_timings = $a_show_timings;
63  $this->show_edit_link = $a_show_edit_link;
64  $this->show_lp_status_sync = $a_show_lp_status_sync;
65 
66  // #13208
67  include_once("Services/Tracking/classes/class.ilObjUserTracking.php");
69  {
70  $this->show_lp_status_sync = false;
71  }
72 
73  $this->lng = $lng;
74  $this->lng->loadLanguageModule('crs');
75  $this->lng->loadLanguageModule('trac');
76  $this->ctrl = $ilCtrl;
77 
78  $this->type = $a_type;
79  $this->setRoleId($a_role_id);
80 
81  include_once('./Services/PrivacySecurity/classes/class.ilPrivacySettings.php');
82  $this->privacy = ilPrivacySettings::_getInstance();
83 
84  // required before constructor for columns
85  $this->setId('crs_' . $a_type . '_' . $a_role_id.'_'. $a_parent_obj->object->getId());
86  parent::__construct($a_parent_obj, 'members');
87 
88  $this->initSettings();
89 
90  $this->setFormName('participants');
91 
92  $this->addColumn('', 'f', "1");
93  $this->addColumn($this->lng->txt('name'), 'lastname', '20%');
94 
95  $all_cols = $this->getSelectableColumns();
96  foreach($this->getSelectedColumns() as $col)
97  {
98  $this->addColumn($all_cols[$col]['txt'], $col);
99  }
100 
101  if($this->show_learning_progress)
102  {
103  $this->addColumn($this->lng->txt('learning_progress'), 'progress');
104  }
105 
106  if($this->privacy->enabledCourseAccessTimes())
107  {
108  $this->addColumn($this->lng->txt('last_access'), 'access_ut', '16em');
109  }
110 
111  $this->addColumn($this->lng->txt('crs_member_passed'), 'passed');
112  if($this->show_lp_status_sync)
113  {
114  $this->addColumn($this->lng->txt('crs_member_passed_status_changed'), 'passed_info');
115  }
116 
117  if($this->type == 'admin')
118  {
119  $this->setSelectAllCheckbox('admins');
120  $this->addColumn($this->lng->txt('crs_notification_list_title'), 'notification');
121  $this->addCommandButton('updateAdminStatus', $this->lng->txt('save'));
122  }
123  elseif($this->type == 'tutor')
124  {
125  $this->setSelectAllCheckbox('tutors');
126  $this->addColumn($this->lng->txt('crs_notification_list_title'), 'notification');
127  $this->addCommandButton('updateTutorStatus', $this->lng->txt('save'));
128  }
129  elseif($this->type == 'member')
130  {
131  $this->setSelectAllCheckbox('members');
132  $this->addColumn($this->lng->txt('crs_blocked'), 'blocked');
133  $this->addCommandButton('updateMemberStatus', $this->lng->txt('save'));
134  }
135  else
136  {
137  $this->setSelectAllCheckbox('roles');
138  $this->addColumn($this->lng->txt('crs_blocked'), 'blocked');
139  $this->addCommandButton('updateRoleStatus', $this->lng->txt('save'));
140 
141  }
142  $this->addColumn($this->lng->txt(''), 'optional');
143 
144  $this->setRowTemplate("tpl.show_participants_row.html", "Modules/Course");
145 
146  if($show_content)
147  {
148  $this->setDefaultOrderField('lastname');
149  $this->enable('sort');
150  $this->enable('header');
151  $this->enable('numinfo');
152  $this->enable('select_all');
153  }
154  else
155  {
156  $this->disable('content');
157  $this->disable('header');
158  $this->disable('footer');
159  $this->disable('numinfo');
160  $this->disable('select_all');
161  }
162 
163  $this->setEnableNumInfo(true);
164  $this->setExternalSegmentation(true);
165 
166  $this->getItems();
167  $this->setTopCommands(true);
168  $this->setEnableHeader(true);
169  $this->setEnableTitle(true);
170  $this->initFilter();
171 
172  $this->setShowRowsSelector(true);
173 
174  include_once "Services/Certificate/classes/class.ilCertificate.php";
175  $this->enable_certificates = ilCertificate::isActive();
176  if($this->enable_certificates)
177  {
178  $this->enable_certificates = ilCertificate::isObjectActive($a_parent_obj->object->getId());
179  }
180  if($this->enable_certificates)
181  {
182  $lng->loadLanguageModule('certificate');
183  }
184  }
185 
189  public function setRoleId($a_role_id)
190  {
191  $this->role_id = $a_role_id;
192  }
193 
198  public function getRoleId()
199  {
200  return $this->role_id;
201  }
202 
203  public function getItems()
204  {
205 
206  }
207 
208 
216  public function fillRow($a_set)
217  {
218  global $ilAccess;
219 
220  $this->tpl->setVariable('VAL_ID', $a_set['usr_id']);
221  $this->tpl->setVariable('VAL_NAME', $a_set['lastname'] . ', ' . $a_set['firstname']);
222 
223  if(!$ilAccess->checkAccessOfUser($a_set['usr_id'], 'read', '', $this->getParentObject()->object->getRefId()) and
224  is_array($info = $ilAccess->getInfo()))
225  {
226  $this->tpl->setCurrentBlock('access_warning');
227  $this->tpl->setVariable('PARENT_ACCESS', $info[0]['text']);
228  $this->tpl->parseCurrentBlock();
229  }
230 
231  if(!ilObjUser::_lookupActive($a_set['usr_id']))
232  {
233  $this->tpl->setCurrentBlock('access_warning');
234  $this->tpl->setVariable('PARENT_ACCESS', $this->lng->txt('usr_account_inactive'));
235  $this->tpl->parseCurrentBlock();
236  }
237 
238 
239  foreach($this->getSelectedColumns() as $field)
240  {
241  switch($field)
242  {
243  case 'gender':
244  $a_set['gender'] = $a_set['gender'] ? $this->lng->txt('gender_' . $a_set['gender']) : '';
245  $this->tpl->setCurrentBlock('custom_fields');
246  $this->tpl->setVariable('VAL_CUST', $a_set[$field]);
247  $this->tpl->parseCurrentBlock();
248  break;
249 
250  case 'birthday':
251  $a_set['birthday'] = $a_set['birthday'] ? ilDatePresentation::formatDate(new ilDate($a_set['birthday'], IL_CAL_DATE)) : $this->lng->txt('no_date');
252  $this->tpl->setCurrentBlock('custom_fields');
253  $this->tpl->setVariable('VAL_CUST', $a_set[$field]);
254  $this->tpl->parseCurrentBlock();
255  break;
256 
257  case 'consultation_hour':
258  $this->tpl->setCurrentBlock('custom_fields');
259  $dts = array();
260  foreach((array) $a_set['consultation_hours'] as $ch)
261  {
263  new ilDateTime($ch['dt'],IL_CAL_UNIX),
264  new ilDateTime($ch['dtend'],IL_CAL_UNIX)
265  );
266  if($ch['explanation'])
267  {
268  $tmp .= ' ' . $ch['explanation'];
269  }
270  $dts[] = $tmp;
271  }
272  $dt_string = implode('<br />', $dts);
273  $this->tpl->setVariable('VAL_CUST',$dt_string);
274  $this->tpl->parseCurrentBlock();
275  break;
276 
277  case 'prtf':
278  $tmp = array();
279  if(is_array($a_set['prtf']))
280  {
281  foreach($a_set['prtf'] as $prtf_url => $prtf_txt)
282  {
283  $tmp[] = '<a href="'.$prtf_url.'">'.$prtf_txt.'</a>';
284  }
285  }
286  $this->tpl->setVariable('VAL_CUST', implode('<br />', $tmp)) ;
287  break;
288 
289 
290  case 'odf_last_update':
291  $this->tpl->setCurrentBlock('custom_fields');
292  $this->tpl->setVariable('VAL_CUST',(string) $a_set['odf_info_txt']);
293  $this->tpl->parseCurrentBlock();
294  break;
295 
296  default:
297  $this->tpl->setCurrentBlock('custom_fields');
298  $this->tpl->setVariable('VAL_CUST', isset($a_set[$field]) ? (string) $a_set[$field] : '');
299  $this->tpl->parseCurrentBlock();
300  break;
301  }
302  }
303 
304  if($this->privacy->enabledCourseAccessTimes())
305  {
306  $this->tpl->setVariable('VAL_ACCESS', $a_set['access_time']);
307  }
308  if($this->show_learning_progress)
309  {
310  $this->tpl->setCurrentBlock('lp');
311  switch($a_set['progress'])
312  {
314  $this->tpl->setVariable('LP_STATUS_ALT', $this->lng->txt($a_set['progress']));
315  $this->tpl->setVariable('LP_STATUS_PATH', ilUtil::getImagePath('scorm/complete.svg'));
316  break;
317 
319  $this->tpl->setVariable('LP_STATUS_ALT', $this->lng->txt($a_set['progress']));
320  $this->tpl->setVariable('LP_STATUS_PATH', ilUtil::getImagePath('scorm/incomplete.svg'));
321  break;
322 
324  $this->tpl->setVariable('LP_STATUS_ALT', $this->lng->txt($a_set['progress']));
325  $this->tpl->setVariable('LP_STATUS_PATH', ilUtil::getImagePath('scorm/not_attempted.svg'));
326  break;
327 
329  $this->tpl->setVariable('LP_STATUS_ALT', $this->lng->txt($a_set['progress']));
330  $this->tpl->setVariable('LP_STATUS_PATH', ilUtil::getImagePath('scorm/failed.svg'));
331  break;
332  }
333  $this->tpl->parseCurrentBlock();
334  }
335  if($this->type == 'admin')
336  {
337  $this->tpl->setVariable('VAL_POSTNAME', 'admins');
338  $this->tpl->setVariable('VAL_NOTIFICATION_ID', $a_set['usr_id']);
339  $this->tpl->setVariable('VAL_NOTIFICATION_CHECKED', ($a_set['notification'] ? 'checked="checked"' : ''));
340  }
341  elseif($this->type == 'tutor')
342  {
343  $this->tpl->setVariable('VAL_POSTNAME', 'tutors');
344  $this->tpl->setVariable('VAL_NOTIFICATION_ID', $a_set['usr_id']);
345  $this->tpl->setVariable('VAL_NOTIFICATION_CHECKED', ($a_set['notification'] ? 'checked="checked"' : ''));
346  }
347  elseif($this->type == 'member')
348  {
349  $this->tpl->setCurrentBlock('blocked');
350  $this->tpl->setVariable('VAL_POSTNAME','members');
351  $this->tpl->setVariable('VAL_BLOCKED_ID',$a_set['usr_id']);
352  $this->tpl->setVariable('VAL_BLOCKED_CHECKED',($a_set['blocked'] ? 'checked="checked"' : ''));
353  $this->tpl->parseCurrentBlock();
354  }
355  else
356  {
357  $this->tpl->setCurrentBlock('blocked');
358  $this->tpl->setVariable('VAL_BLOCKED_ID', $a_set['usr_id']);
359  $this->tpl->setVariable('VAL_BLOCKED_CHECKED', ($a_set['blocked'] ? 'checked="checked"' : ''));
360  $this->tpl->parseCurrentBlock();
361 
362  $this->tpl->setVariable('VAL_POSTNAME','roles');
363  }
364 
365  $this->tpl->setVariable('VAL_PASSED_ID',$a_set['usr_id']);
366  $this->tpl->setVariable('VAL_PASSED_CHECKED',($a_set['passed'] ? 'checked="checked"' : ''));
367 
368  if($this->show_lp_status_sync)
369  {
370  $this->tpl->setVariable('PASSED_INFO', $a_set["passed_info"]);
371  }
372 
373  $this->showActionLinks($a_set);
374 
375  if($a_set['passed'] && $this->enable_certificates)
376  {
377  $this->tpl->setCurrentBlock('link');
378  $this->tpl->setVariable('LINK_NAME', $this->ctrl->getLinkTarget($this->parent_obj, 'deliverCertificate'));
379  $this->tpl->setVariable('LINK_TXT', $this->lng->txt('download_certificate'));
380  $this->tpl->parseCurrentBlock();
381  }
382  $this->ctrl->clearParameters($this->parent_obj);
383 
384  if($this->show_timings)
385  {
386  $this->ctrl->setParameterByClass('ilcoursecontentgui', 'member_id', $a_set['usr_id']);
387  $this->tpl->setCurrentBlock('link');
388  $this->tpl->setVariable('LINK_NAME', $this->ctrl->getLinkTargetByClass('ilcoursecontentgui', 'showUserTimings'));
389  $this->tpl->setVariable('LINK_TXT', $this->lng->txt('timings_timings'));
390  $this->tpl->parseCurrentBlock();
391  }
392  }
393 
400  public function parse()
401  {
402  global $rbacreview;
403 
404  $this->determineOffsetAndOrder();
405 
406  include_once './Services/User/classes/class.ilUserQuery.php';
407 
408  $additional_fields = $this->getSelectedColumns();
409  unset($additional_fields["firstname"]);
410  unset($additional_fields["lastname"]);
411  unset($additional_fields["last_login"]);
412  unset($additional_fields["access_until"]);
413  unset($additional_fields['consultation_hour']);
414  unset($additional_fields['prtf']);
415 
416  $udf_ids = $usr_data_fields = $odf_ids = array();
417  foreach($additional_fields as $field)
418  {
419  if(substr($field, 0, 3) == 'udf')
420  {
421  $udf_ids[] = substr($field, 4);
422  continue;
423  }
424  if(substr($field, 0, 3) == 'odf')
425  {
426  $odf_ids[] = substr($field, 4);
427  continue;
428  }
429 
430  $usr_data_fields[] = $field;
431  }
432 
433  $usr_data = ilUserQuery::getUserListData(
434  $this->getOrderField(),
435  $this->getOrderDirection(),
436  $this->getOffset(),
437  $this->getLimit(),
438  '',
439  '',
440  null,
441  false,
442  false,
443  0,
444  $this->getRoleId(),
445  null,
446  $usr_data_fields,
447  $part
448  );
449  foreach((array) $usr_data['set'] as $user)
450  {
451  $usr_ids[] = $user['usr_id'];
452  }
453 
454  // merge course data
455  $course_user_data = $this->getParentObject()->readMemberData($usr_ids,
456  $this->type == 'admin',
457  $this->getSelectedColumns());
458  $a_user_data = array();
459  foreach((array) $usr_data['set'] as $ud)
460  {
461  $a_user_data[$ud['usr_id']] = array_merge($ud,$course_user_data[$ud['usr_id']]);
462 
463  if($this->show_lp_status_sync)
464  {
465  // #9912 / #13208
466  $passed_info = "";
467  if($a_user_data[$ud['usr_id']]["passed_info"])
468  {
469  $pinfo = $a_user_data[$ud['usr_id']]["passed_info"];
470  if($pinfo["user_id"])
471  {
472  if($pinfo["user_id"] < 0)
473  {
474  $passed_info = $this->lng->txt("crs_passed_status_system");
475  }
476  else if($pinfo["user_id"] > 0)
477  {
478  $name = ilObjUser::_lookupName($pinfo["user_id"]);
479  $passed_info = $this->lng->txt("crs_passed_status_manual_by").": ".$name["login"];
480  }
481  }
482  if($pinfo["timestamp"])
483  {
484  $passed_info .= "<br />".ilDatePresentation::formatDate($pinfo["timestamp"]);
485  }
486  }
487  $a_user_data[$ud['usr_id']]["passed_info"] = $passed_info;
488  }
489  }
490 
491  // Custom user data fields
492  if($udf_ids)
493  {
494  include_once './Services/User/classes/class.ilUserDefinedData.php';
495  $data = ilUserDefinedData::lookupData($usr_ids, $udf_ids);
496  foreach($data as $usr_id => $fields)
497  {
498  if(!$this->checkAcceptance($usr_id))
499  {
500  continue;
501  }
502 
503  foreach($fields as $field_id => $value)
504  {
505  $a_user_data[$usr_id]['udf_' . $field_id] = $value;
506  }
507  }
508  }
509  // Object specific user data fields
510  if($odf_ids)
511  {
512  include_once './Modules/Course/classes/Export/class.ilCourseUserData.php';
513  $data = ilCourseUserData::_getValuesByObjId($this->getParentObject()->object->getId());
514  foreach($data as $usr_id => $fields)
515  {
516  // #7264: as we get data for all course members filter against user data
517  if(!$this->checkAcceptance($usr_id) || !in_array($usr_id, $usr_ids))
518  {
519  continue;
520  }
521 
522  foreach($fields as $field_id => $value)
523  {
524  $a_user_data[$usr_id]['odf_' . $field_id] = $value;
525  }
526  }
527 
528 
529  // add last edit date
530  include_once './Services/Membership/classes/class.ilObjectCustomUserFieldHistory.php';
531  foreach(ilObjectCustomUserFieldHistory::lookupEntriesByObjectId($this->getParentObject()->object->getId()) as $usr_id => $edit_info)
532  {
533  if(!isset($a_user_data[$usr_id]))
534  {
535  continue;
536  }
537 
538  include_once './Services/PrivacySecurity/classes/class.ilPrivacySettings.php';
539  if($usr_id == $edit_info['update_user'])
540  {
541  $a_user_data[$usr_id]['odf_last_update'] = '';
542  $a_user_data[$usr_id]['odf_info_txt'] = $GLOBALS['lng']->txt('cdf_edited_by_self');
543  if(ilPrivacySettings::_getInstance()->enabledAccessTimesByType($this->getParentObject()->object->getType()))
544  {
545  $a_user_data[$usr_id]['odf_last_update'] .= ('_'.$edit_info['editing_time']->get(IL_CAL_UNIX));
546  $a_user_data[$usr_id]['odf_info_txt'] .= (', '.ilDatePresentation::formatDate($edit_info['editing_time']));
547  }
548  }
549  else
550  {
551  $a_user_data[$usr_id]['odf_last_update'] = $edit_info['update_user'];
552  $a_user_data[$usr_id]['odf_last_update'] .= ('_'.$edit_info['editing_time']->get(IL_CAL_UNIX));
553 
554  $name = ilObjUser::_lookupName($edit_info['update_user']);
555  $a_user_data[$usr_id]['odf_info_txt'] = ($name['firstname'].' '.$name['lastname'].', '.ilDatePresentation::formatDate($edit_info['editing_time']));
556  }
557  }
558  }
559 
560  foreach($usr_data['set'] as $user)
561  {
562  // Check acceptance
563  if(!$this->checkAcceptance($user['usr_id']))
564  {
565  continue;
566  }
567  // DONE: accepted
568  foreach($usr_data_fields as $field)
569  {
570  $a_user_data[$user['usr_id']][$field] = $user[$field] ? $user[$field] : '';
571  }
572  }
573  // consultation hours
574  if($this->isColumnSelected('consultation_hour'))
575  {
576  include_once './Services/Booking/classes/class.ilBookingEntry.php';
577  foreach(ilBookingEntry::lookupManagedBookingsForObject($this->getParentObject()->object->getId(), $GLOBALS['ilUser']->getId()) as $buser => $booking)
578  {
579  if(isset($a_user_data[$buser]))
580  {
581  $a_user_data[$buser]['consultation_hour'] = $booking[0]['dt'];
582  $a_user_data[$buser]['consultation_hour_end'] = $booking[0]['dtend'];
583  $a_user_data[$buser]['consultation_hours'] = $booking;
584  }
585  }
586  }
587  $this->setMaxCount($usr_data['cnt'] ? $usr_data['cnt'] : 0);
588  return $this->setData($a_user_data);
589  }
590 
591 }
592 ?>