ILIAS  release_8 Revision v8.19
All Data Structures Namespaces Files Functions Variables Modules Pages
class.ilSessionParticipantsTableGUI.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
26 {
27  protected static array $all_columns = [];
28 
29  private ilLogger $logger;
30  private ilTree $tree;
31  private \ILIAS\DI\RBACServices $rbac;
34  private int $parent_ref_id = 0;
35  private int $member_ref_id = 0;
36  private array $current_filter = [];
37 
38  public function __construct(object $a_parent_gui, ilObjSession $a_parent_obj, string $a_parent_cmd)
39  {
40  global $DIC;
41 
42  $this->logger = $DIC->logger()->sess();
43  $this->tree = $DIC->repositoryTree();
44  $this->rbac = $DIC->rbac();
45 
46  $this->rep_object = $a_parent_obj;
47 
48  $this->participants = ilParticipants::getInstance($this->getRepositoryObject()->getRefId());
49 
50  $this->setId('session_part_' . $this->getRepositoryObject()->getId());
51  parent::__construct($a_parent_gui, $a_parent_cmd);
52 
53  $this->parent_ref_id = $this->tree->getParentId(
54  $this->getRepositoryObject()->getRefId()
55  );
56 
57  if ($member_ref = $this->tree->checkForParentType($this->parent_ref_id, 'grp')) {
58  $this->member_ref_id = $member_ref;
59  } elseif ($member_ref = $this->tree->checkForParentType($this->parent_ref_id, 'crs')) {
60  $this->member_ref_id = $member_ref;
61  } else {
62  throw new \InvalidArgumentException("Error in tree structure. Session has no parent course/group ref_id: " . $this->getRepositoryObject()->getRefId());
63  }
64  }
65 
66  protected function getRepositoryObject(): ilObjSession
67  {
68  return $this->rep_object;
69  }
70 
71  protected function isRegistrationEnabled(): bool
72  {
73  return $this->getRepositoryObject()->enabledRegistration();
74  }
75 
76  protected function getParticipants(): ilParticipants
77  {
78  return $this->participants;
79  }
80 
81  public function init(): void
82  {
83  $this->lng->loadLanguageModule('sess');
84  $this->lng->loadLanguageModule('crs');
85  $this->lng->loadLanguageModule('trac');
86  $this->lng->loadLanguageModule('mmbr');
87 
88  $this->setFormName('participants');
89 
90  $this->initFilter();
91 
92 
93  $this->setSelectAllCheckbox('participants', true);
94  $this->setShowRowsSelector(true);
95 
96  $this->enable('sort');
97  $this->enable('header');
98  $this->enable('numinfo');
99  $this->enable('select_all');
100 
101 
102  $this->setFormAction($this->ctrl->getFormAction($this->getParentObject(), $this->getParentCmd()));
103 
104  $this->setRowTemplate("tpl.sess_members_row.html", "Modules/Session");
105 
106  $this->addColumn('', 'f', '1', true);
107  $this->addColumn($this->lng->txt('name'), 'name', '20%');
108  $this->addColumn($this->lng->txt('login'), 'login', '10%');
109 
110  $all_cols = $this->getSelectableColumns();
111  foreach ($this->getSelectedColumns() as $col) {
112  $this->addColumn($all_cols[$col]['txt'], $col);
113  }
114 
115 
116  if ($this->isRegistrationEnabled()) {
117  $this->addColumn($this->lng->txt('event_tbl_registered'), 'registered');
118  $this->setDefaultOrderField('registered');
119  $this->setDefaultOrderDirection('desc');
120  } else {
121  $this->setDefaultOrderField('name');
122  }
123 
124  $this->addColumn($this->lng->txt('event_tbl_participated'), 'participated');
125 
126  if ($this->isRegistrationEnabled()) {
127  $this->addColumn($this->lng->txt('sess_part_table_excused'), 'excused');
128  }
129 
130  $this->addColumn($this->lng->txt('sess_contact'), 'contact');
131  if (true === $this->getRepositoryObject()->isRegistrationNotificationEnabled()) {
132  $this->addColumn($this->lng->txt('notification'), 'notification_checked');
133  }
134 
135  $this->addColumn($this->lng->txt('trac_mark'), 'mark');
136  $this->addColumn($this->lng->txt('trac_comment'), 'comment');
137 
138 
139  $this->addMultiCommand('sendMailToSelectedUsers', $this->lng->txt('mmbr_btn_mail_selected_users'));
140  $this->lng->loadLanguageModule('user');
141  $this->addMultiCommand('addToClipboard', $this->lng->txt('clipboard_add_btn'));
142 
143 
144  $this->addCommandButton('updateMembers', $this->lng->txt('save'));
145  }
146 
147  public function initFilter(): void
148  {
149  $login = $this->addFilterItemByMetaType(
150  'login',
152  false,
153  $this->lng->txt('name')
154  );
155  $this->current_filter['login'] = $login->getValue();
156 
157 
158  if ($this->isColumnSelected('roles')) {
159  $role = $this->addFilterItemByMetaType(
160  'roles',
162  false,
163  $this->lng->txt('objs_' . ilObject::_lookupType(ilObject::_lookupObjId($this->member_ref_id)) . '_role')
164  );
165 
166  $options = [];
167  $options[0] = $this->lng->txt('all_roles');
168  $role->setOptions($options + $this->getParentLocalRoles());
169  $this->current_filter['roles'] = $role->getValue();
170  }
171 
172  if ($this->getRepositoryObject()->enabledRegistration()) {
173  $reg = $this->addFilterItemByMetaType(
174  'filter_registration',
176  false,
177  $this->lng->txt('sess_part_filter_registered')
178  );
179  $this->current_filter['filter_registration'] = $reg->getChecked();
180  }
181  $participated = $this->addFilterItemByMetaType(
182  'filter_participated',
184  false,
185  $this->lng->txt('sess_part_filter_participated')
186  );
187  $this->current_filter['filter_participated'] = $participated->getChecked();
188  }
189 
190  public function getSelectableColumns(): array
191  {
192  self::$all_columns['roles'] = array(
193  'txt' => $this->lng->txt('objs_role'),
194  'default' => true
195  );
196 
197  return self::$all_columns;
198  }
199 
200  public function parse(): void
201  {
202  $all_participants = [];
203  $all_possible_participants = $this->collectParticipants();
204  if ($all_possible_participants !== []) {
205  // user filter
206  $user_query = new ilUserQuery();
207  $user_query->setLimit(50000);
208  $user_query->setUserFilter($all_possible_participants);
209  $user_query->setTextFilter((string) $this->current_filter['login']);
210  $res = $user_query->query();
211  $all_participants = $res['set'];
212  }
213 
214  $part = [];
215  foreach ($all_participants as $counter => $participant) {
216  $usr_data = $this->getParticipants()->getEventParticipants()->getUser((int) $participant['usr_id']);
217  $tmp_data = [];
218  $tmp_data['id'] = $participant['usr_id'];
219 
220  $tmp_data['name'] = $participant['lastname'];
221  $tmp_data['lastname'] = $participant['lastname'];
222  $tmp_data['firstname'] = $participant['firstname'];
223  $tmp_data['login'] = $participant['login'];
224  $tmp_data['mark'] = $usr_data['mark'] ?? null;
225  $tmp_data['comment'] = $usr_data['comment'] ?? null;
226  $tmp_data['participated'] = $this->getParticipants()->getEventParticipants()->hasParticipated((int) $participant['usr_id']);
227  $tmp_data['registered'] = $this->getParticipants()->getEventParticipants()->isRegistered((int) $participant['usr_id']);
228  $tmp_data['excused'] = $this->getParticipants()->getEventParticipants()->isExcused((int) $participant['usr_id']);
229  $tmp_data['contact'] = $this->getParticipants()->isContact((int) $participant['usr_id']);
230 
231  $notificationShown = false;
232  if (true === $this->getRepositoryObject()->isRegistrationNotificationEnabled()) {
233  $notificationShown = true;
234  $notificationCheckboxEnabled = true;
235  if (ilSessionConstants::NOTIFICATION_INHERIT_OPTION === $this->getRepositoryObject()->getRegistrationNotificationOption()) {
236  $notificationCheckboxEnabled = false;
237  }
238  $tmp_data['notification_checkbox_enabled'] = $notificationCheckboxEnabled;
239  $tmp_data['notification_checked'] = $usr_data['notification_enabled'] ?? false;
240  }
241  $tmp_data['show_notification'] = $notificationShown;
242 
243  $roles = [];
244  $local_roles = $this->getParentLocalRoles();
245  foreach ($local_roles as $role_id => $role_name) {
246  // @todo fix performance
247  if ($this->rbac->review()->isAssigned((int) $participant['usr_id'], $role_id)) {
248  $tmp_data['role_ids'][] = $role_id;
249  $roles[] = $role_name;
250  }
251  }
252  $tmp_data['roles'] = implode('<br />', $roles);
253 
254  if ($this->matchesFilterCriteria($tmp_data)) {
255  $part[] = $tmp_data;
256  }
257  }
258  $this->setData($part);
259  }
260 
264  protected function collectParticipants(): array
265  {
266  $direct_participants = $this->getParticipants()
267  ->getEventParticipants()
268  ->getParticipants();
269  $direct_participants = array_keys($direct_participants);
270 
271  $part = ilParticipants::getInstance($this->member_ref_id);
272  if (!$part instanceof ilParticipants) {
273  return $direct_participants;
274  }
275 
276  return array_unique(array_merge(
277  $direct_participants,
278  $part->getParticipants()
279  ));
280  }
281 
282  protected function matchesFilterCriteria(array $a_user_info): bool
283  {
284  foreach ($this->current_filter as $filter => $filter_value) {
285  if (!$filter_value) {
286  continue;
287  }
288  switch ($filter) {
289  case 'roles':
290  if (!in_array($filter_value, ($a_user_info['role_ids'] ?? []))) {
291  return false;
292  }
293  break;
294 
295  case 'filter_participated':
296  if (!($a_user_info['participated'] ?? false)) {
297  return false;
298  }
299  break;
300 
301  case 'filter_registration':
302  if (!($a_user_info['registered'] ?? false)) {
303  return false;
304  }
305  break;
306  }
307  }
308  return true;
309  }
310 
311  protected function fillRow(array $a_set): void
312  {
313  $this->tpl->setVariable('VAL_POSTNAME', 'participants');
314 
315  if ($this->isRegistrationEnabled()) {
316  $this->tpl->setCurrentBlock('registered_col');
317  $this->tpl->setVariable('VAL_ID', $a_set['id']);
318  $this->tpl->setVariable('REG_CHECKED', $a_set['registered'] ? 'checked="checked"' : '');
319  $this->tpl->parseCurrentBlock();
320  }
321 
322  foreach ($this->getSelectedColumns() as $field) {
323  if ($field == 'roles') {
324  $this->tpl->setCurrentBlock('custom_fields');
325  $this->tpl->setVariable('VAL_CUST', (string) $a_set['roles']);
326  $this->tpl->parseCurrentBlock();
327  }
328  }
329 
330  if (true === $a_set['show_notification']) {
331  $this->tpl->setCurrentBlock('notification_column');
332  $this->tpl->setVariable('VAL_ID', $a_set['id']);
333  $this->tpl->setVariable('NOTIFICATION_CHECKED', $a_set['notification_checked'] ? 'checked="checked"' : '');
334 
335  $enableCheckbox = $a_set['notification_checkbox_enabled'];
336 
337  $this->tpl->setVariable('NOTIFICATION_ENABLED', $enableCheckbox ? '' : 'disabled');
338  $this->tpl->parseCurrentBlock();
339  }
340 
341  $this->tpl->setVariable('VAL_ID', $a_set['id']);
342  $this->tpl->setVariable('LASTNAME', $a_set['lastname']);
343  $this->tpl->setVariable('FIRSTNAME', $a_set['firstname']);
344  $this->tpl->setVariable('LOGIN', $a_set['login']);
345  $this->tpl->setVariable('MARK', $a_set['mark']);
346  $this->tpl->setVariable('COMMENT', $a_set['comment']);
347  $this->tpl->setVariable('PART_CHECKED', $a_set['participated'] ? 'checked="checked"' : '');
348  $this->tpl->setVariable('CONTACT_CHECKED', $a_set['contact'] ? 'checked="checked"' : '');
349  $this->tpl->setVariable('PART_CHECKED', $a_set['participated'] ? 'checked="checked"' : '');
350  if ($this->isRegistrationEnabled()) {
351  $this->tpl->setVariable('EXCUSED_CHECKED', $a_set['excused'] ? 'checked="checked"' : '');
352  }
353  }
354 
355  protected function getParentLocalRoles(): array
356  {
357  $part = null;
358  $type = ilObject::_lookupType($this->member_ref_id, true);
359  switch ($type) {
360  case 'crs':
361  case 'grp':
362  $part = ilParticipants::getInstance($this->member_ref_id);
363  // no break
364  default:
365 
366  }
367  if (!$part instanceof ilParticipants) {
368  return [];
369  }
370 
371  $review = $this->rbac->review();
372  $local_parent_roles = $review->getLocalRoles($this->member_ref_id);
373  $local_roles_info = [];
374  foreach ($local_parent_roles as $index => $role_id) {
375  $local_roles_info[$role_id] = ilObjRole::_getTranslation(
376  ilObject::_lookupTitle($role_id)
377  );
378  }
379  return $local_roles_info;
380  }
381 }
setData(array $a_data)
$res
Definition: ltiservices.php:69
enable(string $a_module_name)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
setFormAction(string $a_form_action, bool $a_multipart=false)
$type
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 getInstance(int $a_ref_id)
setFormName(string $a_name="")
setId(string $a_val)
$index
Definition: metadata.php:145
static _lookupObjId(int $ref_id)
global $DIC
Definition: feed.php:28
isColumnSelected(string $col)
setShowRowsSelector(bool $a_value)
Toggle rows-per-page selector.
addFilterItemByMetaType(string $id, int $type=self::FILTER_TEXT, bool $a_optional=false, string $caption="")
Add filter by standard type.
static _lookupTitle(int $obj_id)
setDefaultOrderField(string $a_defaultorderfield)
static _getTranslation(string $a_role_title)
setRowTemplate(string $a_template, string $a_template_dir="")
Set row template.
setDefaultOrderDirection(string $a_defaultorderdirection)
__construct(object $a_parent_gui, ilObjSession $a_parent_obj, string $a_parent_cmd)
Base class for course and group participants.
__construct(Container $dic, ilPlugin $plugin)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
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 _lookupType(int $id, bool $reference=false)
addMultiCommand(string $a_cmd, string $a_text)