ILIAS  release_8 Revision v8.19
All Data Structures Namespaces Files Functions Variables Modules Pages
class.ilGroupParticipantsTableGUI.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
28 {
29  protected bool $show_learning_progress = false;
30 
34  protected ilObjUser $user;
35 
36  protected array $cached_user_names = [];
37 
38  public function __construct(
39  ?object $a_parent_obj,
41  bool $show_learning_progress = false
42  ) {
43  global $DIC;
44 
45  $this->show_learning_progress = $show_learning_progress;
46  $this->rep_object = $rep_object;
47 
48  $this->privacy = ilPrivacySettings::getInstance();
49 
50  $this->participants = ilParticipants::getInstanceByObjId($this->getRepositoryObject()->getId());
51 
52  $this->access = $DIC->access();
53  $this->rbacreview = $DIC->rbac()->review();
54  $this->user = $DIC->user();
55 
56 
57  $this->setPrefix('participants');
58  $this->setId('grp_' . $this->getRepositoryObject()->getId());
59  parent::__construct($a_parent_obj, 'participants');
60  $this->lng->loadLanguageModule('grp');
61  $this->lng->loadLanguageModule('trac');
62  $this->lng->loadLanguageModule('rbac');
63  $this->lng->loadLanguageModule('mmbr');
64 
65  $this->initSettings();
66 
67  $this->setFormName('participants');
68  $this->addColumn('', 'f', "1", true);
69  $this->addColumn($this->lng->txt('name'), 'lastname', '20%');
70 
71  $all_cols = $this->getSelectableColumns();
72  foreach ($this->getSelectedColumns() as $col) {
73  $this->addColumn($all_cols[$col]['txt'], $col);
74  }
75 
76  if ($this->show_learning_progress) {
77  $this->addColumn($this->lng->txt('learning_progress'), 'progress');
78  }
79 
80  if ($this->privacy->enabledGroupAccessTimes()) {
81  $this->addColumn($this->lng->txt('last_access'), 'access_time_unix');
82  }
83  $this->addColumn($this->lng->txt('grp_mem_contacts'), 'contact');
84  $this->addColumn($this->lng->txt('grp_notification'), 'notification');
85 
86  $this->addColumn($this->lng->txt('actions'), 'optional', '', false, 'ilMembershipRowActionsHeader');
87  $this->setDefaultOrderField('roles');
88 
89  $this->setRowTemplate("tpl.show_participants_row.html", "Modules/Group");
90 
91  $this->setShowRowsSelector(true);
92 
93  $this->enable('sort');
94  $this->enable('header');
95  $this->enable('numinfo');
96  $this->enable('select_all');
97 
98  $this->initFilter();
99 
100  $this->addMultiCommand('editParticipants', $this->lng->txt('edit'));
101  $this->addMultiCommand('confirmDeleteParticipants', $this->lng->txt('remove'));
102  $this->addMultiCommand('sendMailToSelectedUsers', $this->lng->txt('mmbr_btn_mail_selected_users'));
103  $this->lng->loadLanguageModule('user');
104  $this->addMultiCommand('addToClipboard', $this->lng->txt('clipboard_add_btn'));
105 
106  $this->setSelectAllCheckbox('participants', true);
107  $this->addCommandButton('updateParticipantsStatus', $this->lng->txt('save'));
108  }
109 
113  protected function fillRow(array $a_set): void
114  {
115  global $DIC;
116 
117  $ilAccess = $DIC->access();
118 
119  $a_set['usr_id'] = (int) $a_set['usr_id'];
120  $this->tpl->setVariable('VAL_ID', $a_set['usr_id']);
121  $this->tpl->setVariable('VAL_NAME', $a_set['lastname'] . ', ' . $a_set['firstname']);
122  if (!$ilAccess->checkAccessOfUser($a_set['usr_id'], 'read', '', $this->getRepositoryObject()->getRefId()) and
123  is_array($info = $ilAccess->getInfo())) {
124  $this->tpl->setCurrentBlock('access_warning');
125  $this->tpl->setVariable('PARENT_ACCESS', $info[0]['text']);
126  $this->tpl->parseCurrentBlock();
127  }
128 
129  if (!$a_set['active']) {
130  $this->tpl->setCurrentBlock('access_warning');
131  $this->tpl->setVariable('PARENT_ACCESS', $this->lng->txt('usr_account_inactive'));
132  $this->tpl->parseCurrentBlock();
133  }
134 
135 
136  foreach ($this->getSelectedColumns() as $field) {
137  switch ($field) {
138  case 'gender':
139  $a_set['gender'] = $a_set['gender'] ? $this->lng->txt('gender_' . $a_set['gender']) : '';
140  $this->tpl->setCurrentBlock('custom_fields');
141  $this->tpl->setVariable('VAL_CUST', $a_set[$field]);
142  $this->tpl->parseCurrentBlock();
143  break;
144 
145  case 'birthday':
146  $a_set['birthday'] = $a_set['birthday'] ? ilDatePresentation::formatDate(new ilDate($a_set['birthday'], IL_CAL_DATE)) : $this->lng->txt('no_date');
147  $this->tpl->setCurrentBlock('custom_fields');
148  $this->tpl->setVariable('VAL_CUST', $a_set[$field]);
149  $this->tpl->parseCurrentBlock();
150  break;
151 
152  case 'consultation_hour':
153  $this->tpl->setCurrentBlock('custom_fields');
154  $dts = array();
155  foreach ((array) $a_set['consultation_hours'] as $ch) {
157  new ilDateTime($ch['dt'], IL_CAL_UNIX),
158  new ilDateTime($ch['dtend'], IL_CAL_UNIX)
159  );
160  if ($ch['explanation']) {
161  $tmp .= ' ' . $ch['explanation'];
162  }
163  $dts[] = $tmp;
164  }
165  $dt_string = implode('<br />', $dts);
166  $this->tpl->setVariable('VAL_CUST', $dt_string) ;
167  $this->tpl->parseCurrentBlock();
168  break;
169 
170  case 'prtf':
171  $tmp = array();
172  if (is_array($a_set['prtf'])) {
173  foreach ($a_set['prtf'] as $prtf_url => $prtf_txt) {
174  $tmp[] = '<a href="' . $prtf_url . '">' . $prtf_txt . '</a>';
175  }
176  }
177  $this->tpl->setCurrentBlock('custom_fields');
178  $this->tpl->setVariable('VAL_CUST', implode('<br />', $tmp)) ;
179  $this->tpl->parseCurrentBlock();
180  break;
181 
182  case 'odf_last_update':
183  $this->tpl->setCurrentBlock('custom_fields');
184  $this->tpl->setVariable('VAL_CUST', $a_set['odf_info_txt'] ?? '');
185  $this->tpl->parseCurrentBlock();
186  break;
187 
188  case 'roles':
189  $this->tpl->setCurrentBlock('custom_fields');
190  $this->tpl->setVariable('VAL_CUST', (string) $a_set['roles_label']);
191  $this->tpl->parseCurrentBlock();
192  break;
193 
194  case 'org_units':
195  $this->tpl->setCurrentBlock('custom_fields');
196  $this->tpl->setVariable(
197  'VAL_CUST',
198  ilOrgUnitPathStorage::getTextRepresentationOfUsersOrgUnits($a_set['usr_id'])
199  );
200  $this->tpl->parseCurrentBlock();
201  break;
202 
203  default:
204  $this->tpl->setCurrentBlock('custom_fields');
205  $this->tpl->setVariable('VAL_CUST', isset($a_set[$field]) ? (string) $a_set[$field] : '');
206  $this->tpl->parseCurrentBlock();
207  break;
208  }
209  }
210 
211  if ($this->privacy->enabledGroupAccessTimes()) {
212  $this->tpl->setVariable('VAL_ACCESS', $a_set['access_time']);
213  }
214 
215  if ($this->show_learning_progress) {
216  $this->tpl->setCurrentBlock('lp');
218  $icon_rendered = $icons->renderIconForStatus($icons->lookupNumStatus($a_set['progress']));
219 
220  $this->tpl->setVariable('LP_STATUS_ALT', $this->lng->txt($a_set['progress']));
221  $this->tpl->setVariable('LP_STATUS_ICON', $icon_rendered);
222 
223  $this->tpl->parseCurrentBlock();
224  }
225 
226  $this->tpl->setVariable('VAL_POSTNAME', 'participants');
227 
228  if ($this->getParticipants()->isAdmin($a_set['usr_id'])) {
229  $this->tpl->setVariable('VAL_CONTACT_ID', $a_set['usr_id']);
230  $this->tpl->setVariable(
231  'VAL_CONTACT_CHECKED',
232  $a_set['contact'] ? 'checked="checked"' : ''
233  );
234  }
235 
236  if (
237  $this->getParticipants()->isAdmin($a_set['usr_id'])
238  ) {
239  $this->tpl->setVariable('VAL_NOTIFICATION_ID', $a_set['usr_id']);
240  $this->tpl->setVariable(
241  'VAL_NOTIFICATION_CHECKED',
242  $a_set['notification'] ? 'checked="checked"' : ''
243  );
244  }
245  $this->showActionLinks($a_set);
246  $this->tpl->setVariable('VAL_LOGIN', $a_set['login']);
247  }
248 
249  public function parse(): void
250  {
251  $this->determineOffsetAndOrder(true);
252  $part = ilGroupParticipants::_getInstanceByObjId($this->getRepositoryObject()->getId())->getParticipants();
253  $part = $this->access->filterUserIdsByRbacOrPositionOfCurrentUser(
254  'manage_members',
255  'manage_members',
256  $this->getRepositoryObject()->getRefId(),
257  $part
258  );
259 
260  if (!$part) {
261  $this->setData(array());
262  return;
263  }
264 
265 
266  $group_user_data = (array) $this->getParentObject()->readMemberData(
267  $part,
268  $this->getSelectedColumns()
269  );
270 
271 
272  $additional_fields = $this->getSelectedColumns();
273  unset($additional_fields["firstname"]);
274  unset($additional_fields["lastname"]);
275  unset($additional_fields["last_login"]);
276  unset($additional_fields["access_until"]);
277  unset($additional_fields['consultation_hour']);
278  unset($additional_fields['prtf']);
279  unset($additional_fields['roles']);
280  unset($additional_fields['org_units']);
281 
282 
283 
284  $udf_ids = $usr_data_fields = $odf_ids = array();
285  foreach ($additional_fields as $field) {
286  if (substr($field, 0, 3) == 'udf') {
287  $udf_ids[] = substr($field, 4);
288  continue;
289  }
290  if (substr($field, 0, 3) == 'odf') {
291  $odf_ids[] = substr($field, 4);
292  continue;
293  }
294 
295  $usr_data_fields[] = $field;
296  }
297 
298  $usr_data = ilUserQuery::getUserListData(
299  '',
300  '',
301  0,
302  9999,
303  (string) $this->current_filter['login'],
304  '',
305  null,
306  false,
307  false,
308  0,
309  0,
310  null,
311  $usr_data_fields,
312  $part
313  );
314 
315  $a_user_data = array();
316  $filtered_user_ids = array();
317  $local_roles = $this->getParentObject()->getLocalRoles();
318  foreach ((array) $usr_data['set'] as $ud) {
319  $user_id = (int) $ud['usr_id'];
320  if ($this->current_filter['roles']) {
321  if (!$this->rbacreview->isAssigned($user_id, $this->current_filter['roles'])) {
322  continue;
323  }
324  }
325  if (array_key_exists('org_units', $this->current_filter) && $this->current_filter['org_units']) {
326  $org_unit = $this->current_filter['org_units'];
327  $assigned = ilObjOrgUnitTree::_getInstance()->getOrgUnitOfUser($user_id);
328  if (!in_array($org_unit, $assigned)) {
329  continue;
330  }
331  }
332 
333  $filtered_user_ids[] = $user_id;
334  $a_user_data[$user_id] = array_merge($ud, (array) $group_user_data[$user_id]);
335 
336  $roles = array();
337  foreach ($local_roles as $role_id => $role_name) {
338  // @todo fix performance
339  if ($this->rbacreview->isAssigned($user_id, $role_id)) {
340  $roles[] = $role_name;
341  }
342  }
343  $a_user_data[$user_id]['name'] = $a_user_data[$user_id]['lastname'] . ', ' . $a_user_data[$user_id]['firstname'];
344  $a_user_data[$user_id]['roles_label'] = implode('<br />', $roles);
345  $a_user_data[$user_id]['roles'] = $this->participants->setRoleOrderPosition($user_id);
346  }
347 
348  // Custom user data fields
349  if ($udf_ids) {
350  $data = ilUserDefinedData::lookupData($filtered_user_ids, $udf_ids);
351  foreach ($data as $usr_id => $fields) {
352  $usr_id = (int) $usr_id;
353  if (!$this->checkAcceptance($usr_id)) {
354  continue;
355  }
356 
357  foreach ($fields as $field_id => $value) {
358  $a_user_data[$usr_id]['udf_' . $field_id] = $value;
359  }
360  }
361  }
362  // Object specific user data fields
363  if ($odf_ids) {
365  foreach ($data as $usr_id => $fields) {
366  $usr_id = (int) $usr_id;
367  if (!$this->checkAcceptance($usr_id)) {
368  continue;
369  }
370  foreach ($fields as $field_id => $value) {
371  if ($a_user_data[$usr_id] ?? false) {
372  $a_user_data[$usr_id]['odf_' . $field_id] = $value;
373  }
374  }
375  }
376  // add last edit date
377  foreach (ilObjectCustomUserFieldHistory::lookupEntriesByObjectId($this->getRepositoryObject()->getId()) as $usr_id => $edit_info) {
378  if (!isset($a_user_data[$usr_id])) {
379  continue;
380  }
381 
382  if ($usr_id == $edit_info['update_user']) {
383  $a_user_data[$usr_id]['odf_last_update'] = '';
384  $a_user_data[$usr_id]['odf_info_txt'] = $this->lng->txt('cdf_edited_by_self');
385  if (ilPrivacySettings::getInstance()->enabledAccessTimesByType($this->getRepositoryObject()->getType())) {
386  $a_user_data[$usr_id]['odf_last_update'] .= ('_' . $edit_info['editing_time']->get(IL_CAL_UNIX));
387  $a_user_data[$usr_id]['odf_info_txt'] .= (', ' . ilDatePresentation::formatDate($edit_info['editing_time']));
388  }
389  } else {
390  $a_user_data[$usr_id]['odf_last_update'] = $edit_info['update_user'];
391  $a_user_data[$usr_id]['odf_last_update'] .= ('_' . $edit_info['editing_time']->get(IL_CAL_UNIX));
392 
393  $name = $this->lookupUserName((int) $edit_info['update_user']);
394  $a_user_data[$usr_id]['odf_info_txt'] = ($name['firstname'] . ' ' . $name['lastname'] . ', ' . ilDatePresentation::formatDate($edit_info['editing_time']));
395  }
396  }
397  }
398 
399  // consultation hours
400  if ($this->isColumnSelected('consultation_hour')) {
401  foreach (ilBookingEntry::lookupManagedBookingsForObject($this->getRepositoryObject()->getId(), $this->user->getId()) as $buser => $booking) {
402  if (isset($a_user_data[$buser])) {
403  $a_user_data[$buser]['consultation_hour'] = $booking[0]['dt'];
404  $a_user_data[$buser]['consultation_hour_end'] = $booking[0]['dtend'];
405  $a_user_data[$buser]['consultation_hours'] = $booking;
406  }
407  }
408  }
409  // always sort by name first
410  $a_user_data = ilArrayUtil::sortArray(
411  $a_user_data,
412  'name',
413  $this->getOrderDirection()
414  );
415  $this->setData($a_user_data);
416  }
417 
421  protected function lookupUserName(int $user_id): array
422  {
423  if (isset($this->cached_user_names[$user_id])) {
424  return $this->cached_user_names[$user_id];
425  }
426  return $this->cached_user_names[$user_id] = ilObjUser::_lookupName($user_id);
427  }
428 }
static lookupData(array $a_user_ids, array $a_field_ids)
Lookup data.
setData(array $a_data)
enable(string $a_module_name)
addCommandButton(string $a_cmd, string $a_text, string $a_onclick='', string $a_id="", string $a_class="")
setSelectAllCheckbox(string $a_select_all_checkbox, bool $a_select_all_on_top=false)
static getInstanceByObjId(int $a_obj_id)
Get instance by obj type.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static formatDate(ilDateTime $date, bool $a_skip_day=false, bool $a_include_wd=false, bool $include_seconds=false)
static getInstance(int $variant=ilLPStatusIcons::ICON_VARIANT_DEFAULT, ?\ILIAS\UI\Renderer $renderer=null, ?\ILIAS\UI\Factory $factory=null)
static _getValuesByObjId(int $a_obj_id)
static _lookupName(int $a_user_id)
lookup user name
__construct(?object $a_parent_obj, ilObject $rep_object, bool $show_learning_progress=false)
const IL_CAL_UNIX
setFormName(string $a_name="")
setId(string $a_val)
global $DIC
Definition: feed.php:28
if($format !==null) $name
Definition: metadata.php:247
isColumnSelected(string $col)
setShowRowsSelector(bool $a_value)
Toggle rows-per-page selector.
setDefaultOrderField(string $a_defaultorderfield)
Singleton class that stores all privacy settings.
setRowTemplate(string $a_template, string $a_template_dir="")
Set row template.
static lookupManagedBookingsForObject(int $a_obj_id, int $a_usr_id)
Lookup bookings for own and managed consultation hours of an object.
const IL_CAL_DATE
static formatPeriod(ilDateTime $start, ilDateTime $end, bool $a_skip_starting_day=false)
Format a period of two dates Shows: 14.
static _getInstanceByObjId(int $a_obj_id)
Get singleton instance.
__construct(Container $dic, ilPlugin $plugin)
addColumn(string $a_text, string $a_sort_field="", string $a_width="", bool $a_is_checkbox_action_column=false, string $a_class="", string $a_tooltip="", bool $a_tooltip_with_html=false)
static getUserListData(string $a_order_field, string $a_order_dir, int $a_offset, int $a_limit, string $a_string_filter="", string $a_activation_filter="", ?ilDateTime $a_last_login_filter=null, bool $a_limited_access_filter=false, bool $a_no_courses_filter=false, int $a_course_group_filter=0, int $a_role_filter=0, array $a_user_folder_filter=null, array $a_additional_fields=null, array $a_user_filter=null, string $a_first_letter="", string $a_authentication_filter="")
Get data for user administration list.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
addMultiCommand(string $a_cmd, string $a_text)
determineOffsetAndOrder(bool $a_omit_offset=false)
static sortArray(array $array, string $a_array_sortby_key, string $a_array_sortorder="asc", bool $a_numeric=false, bool $a_keep_keys=false)
setPrefix(string $a_prefix)