ILIAS  release_5-4 Revision v5.4.26-12-gabc799a52e6
class.ilLearningSequenceParticipantsTableGUI.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
9 {
14 
18  protected $current_filter = array();
19 
20  public function __construct(
22  ilObjLearningSequence $ls_object,
23  ilObjUserTracking $obj_user_tracking,
24  ilPrivacySettings $privacy_settings,
26  ilAccess $access,
27  ilRbacReview $rbac_review,
28  ilSetting $settings
29  ) {
30  $this->parent_gui = $parent_gui;
31  $this->rep_object = $ls_object;
32  $this->show_learning_progress = $show_learning_progress;
33 
34  $this->obj_user_tracking = $obj_user_tracking;
35  $this->privacy_settings = $privacy_settings;
36  $this->lng = $lng;
37  $this->access = $access;
38  $this->rbac_review = $rbac_review;
39  $this->settings = $settings;
40 
41  $this->lng->loadLanguageModule('lso');
42  $this->lng->loadLanguageModule('trac');
43  $this->lng->loadLanguageModule('rbac');
44  $this->lng->loadLanguageModule('mmbr');
45  $this->lng->loadLanguageModule('user');
46  $this->lng->loadLanguageModule('ps');
47 
48  $this->participants = $ls_object->getLSParticipants();
49 
50  $this->setPrefix('participants');
51 
52  $this->setId('lso_' . $this->getRepositoryObject()->getId());
53  parent::__construct($parent_gui, 'participants');
54 
55  $this->initSettings();
56  $this->initForm();
57  }
58 
59  protected function initForm()
60  {
61  $this->setFormName('participants');
62  $this->setDefaultOrderField('roles');
63  $this->setRowTemplate("tpl.show_participants_row.html", "Modules/LearningSequence");
64  $this->setShowRowsSelector(true);
65  $this->setSelectAllCheckbox('participants');
66 
67  $this->addColumn('', 'f', "1");
68  $this->addColumn($this->lng->txt('name'), 'lastname', '20%');
69  $this->addColumn($this->lng->txt('login'), 'login');
70 
71  $all_cols = $this->getSelectableColumns();
72  foreach ($this->getSelectedColumns() as $col) {
73  $this->addColumn($all_cols[$col]['txt'], $col);
74  }
75 
76  if (
77  $this->obj_user_tracking->hasExtendedData(ilObjUserTracking::EXTENDED_DATA_LAST_ACCESS) &&
79  ) {
80  $this->addColumn($this->lng->txt('first_access'), "first_access");
81  $this->addColumn($this->lng->txt('last_access'), "last_access");
82  }
83  $this->addColumn($this->lng->txt('completed_steps'), "completed_steps");
84  $this->addColumn($this->lng->txt('last_visited_step'), "last_visited_step");
85  $this->addColumn($this->lng->txt('lso_notification'), 'notification');
86  $this->addColumn($this->lng->txt(''), 'optional');
87 
88  $this->enable('sort');
89  $this->enable('header');
90  $this->enable('numinfo');
91  $this->enable('select_all');
92 
93  $this->initFilter();
94 
95  $this->addMultiCommand('editParticipants', $this->lng->txt('edit'));
96  $this->addMultiCommand('confirmDeleteParticipants', $this->lng->txt('remove'));
97  $this->addMultiCommand('sendMailToSelectedUsers', $this->lng->txt('mmbr_btn_mail_selected_users'));
98  $this->addMultiCommand('addToClipboard', $this->lng->txt('clipboard_add_btn'));
99  $this->addCommandButton('updateParticipantsStatus', $this->lng->txt('save'));
100  }
101 
102  public function fillRow($set)
103  {
104  $this->tpl->setVariable('VAL_ID', $set['usr_id']);
105  $this->tpl->setVariable('VAL_NAME', $set['lastname'] . ', ' . $set['firstname']);
106  $this->tpl->setVariable('VAL_LOGIN', $set['login']);
107 
108  if (
109  !$this->access->checkAccessOfUser($set['usr_id'], 'read', '', $this->getRepositoryObject()->getRefId()) &&
110  is_array($info = $this->access->getInfo())
111  ) {
112  $this->tpl->setCurrentBlock('access_warning');
113  $this->tpl->setVariable('PARENT_ACCESS', $info[0]['text']);
114  $this->tpl->parseCurrentBlock();
115  }
116 
117  if (!ilObjUser::_lookupActive($set['usr_id'])) {
118  $this->tpl->setCurrentBlock('access_warning');
119  $this->tpl->setVariable('PARENT_ACCESS', $this->lng->txt('usr_account_inactive'));
120  $this->tpl->parseCurrentBlock();
121  }
122 
123  foreach ($this->getSelectedColumns() as $field) {
124  switch ($field) {
125  case 'prtf':
126  $tmp = array();
127  if (is_array($set['prtf'])) {
128  foreach ($set['prtf'] as $prtf_url => $prtf_txt) {
129  $tmp[] = '<a href="' . $prtf_url . '">' . $prtf_txt . '</a>';
130  }
131  }
132  $this->tpl->setCurrentBlock('custom_fields');
133  $this->tpl->setVariable('VAL_CUST', (string) implode('<br />', $tmp));
134  $this->tpl->parseCurrentBlock();
135  break;
136  case 'roles':
137  $this->tpl->setCurrentBlock('custom_fields');
138  $this->tpl->setVariable('VAL_CUST', (string) $set['roles_label']);
139  $this->tpl->parseCurrentBlock();
140  break;
141  case 'org_units':
142  $this->tpl->setCurrentBlock('custom_fields');
143  $this->tpl->setVariable('VAL_CUST', (string) ilOrgUnitPathStorage::getTextRepresentationOfUsersOrgUnits($set['usr_id']));
144  $this->tpl->parseCurrentBlock();
145  break;
146  default:
147  $this->tpl->setCurrentBlock('custom_fields');
148  $this->tpl->setVariable('VAL_CUST', isset($set[$field]) ? (string) $set[$field] : '');
149  $this->tpl->parseCurrentBlock();
150  break;
151  }
152  }
153 
154  $this->tpl->setVariable('VAL_POSTNAME', 'participants');
155  $this->tpl->setVariable('FIRST_ACCESS', $this->getFirstAccess((int) $set['usr_id']));
156  $this->tpl->setVariable('LAST_ACCESS', $this->getLastAccess((int) $set['usr_id']));
157  $this->tpl->setVariable('COMPLETED_STEPS', $this->getCompletedSteps((int) $set['usr_id']));
158  $this->tpl->setVariable('LAST_VISITED_STEP', $this->getLastVisitedStep((int) $set['usr_id']));
159 
160  if ($this->getParticipants()->isAdmin($set['usr_id'])) {
161  $this->tpl->setVariable('VAL_NOTIFICATION_ID', $set['usr_id']);
162  $this->tpl->setVariable(
163  'VAL_NOTIFICATION_CHECKED',
164  $set['notification'] ? 'checked="checked"' : ''
165  );
166  }
167 
168  $this->showActionLinks($set);
169  $this->tpl->setVariable('VAL_LOGIN', $set['login']);
170  }
171 
172  protected function getFirstAccess(int $user_id)
173  {
174  $data = $this->getRepositoryObject()->getStateDB()->getFirstAccessFor(
175  (int) $this->getRepositoryObject()->getRefId(),
176  array($user_id)
177  );
178 
179  if ($data[$user_id] === -1) {
180  return "-";
181  }
182 
183  return $data[$user_id];
184  }
185 
186  protected function getLastAccess(int $user_id)
187  {
188  $data = $this->getRepositoryObject()->getStateDB()->getLastAccessFor(
189  (int) $this->getRepositoryObject()->getRefId(),
190  array($user_id)
191  );
192 
193  if ($data[$user_id] === -1) {
194  return "-";
195  }
196 
197  return $data[$user_id];
198  }
199 
200  protected function getCompletedSteps(int $user_id)
201  {
202  $passed = 0;
203  $learner_items = array();
204 
205  $learner_items = $this->getRepositoryObject()->getLSLearnerItems(
206  $user_id
207  );
208 
209  $completion_states = $this->rep_object->getLPCompletionStates();
210 
211  foreach ($learner_items as $learner_item) {
212  if (in_array($learner_item->getLearningProgressStatus(), $completion_states)) {
213  $passed++;
214  }
215  }
216 
217  return $passed . " / " . count($learner_items);
218  }
219 
225  protected function getLastVisitedStep(int $user_id)
226  {
227  $data = $this->getRepositoryObject()->getStateDB()->getCurrentItemsFor(
228  (int) $this->getRepositoryObject()->getRefId(),
229  array($user_id)
230  );
231 
232  if ($data[$user_id] === -1) {
233  return "-";
234  }
235 
236  return $this->getTitleFor((int) $data[$user_id]);
237  }
238 
239  protected function getTitleFor(int $ref_id) : string
240  {
242  }
243 
244  public function parse()
245  {
246  $this->determineOffsetAndOrder(true);
247 
248  $ls_participants = $this->participants->getParticipants();
249 
250  $ls_participants = $this->access->filterUserIdsByRbacOrPositionOfCurrentUser(
251  'manage_members',
252  'manage_members',
253  $this->getRepositoryObject()->getRefId(),
254  $ls_participants
255  );
256 
257  if (!$ls_participants) {
258  $this->setData(array());
259  return;
260  }
261 
262  $lso_user_data = $this->parent_gui->readMemberData(
263  $ls_participants,
264  $this->getSelectedColumns()
265  );
266 
267  $additional_fields = $this->getSelectedColumns();
268  unset($additional_fields['prtf']);
269  unset($additional_fields['roles']);
270  unset($additional_fields['org_units']);
271 
272  $udf_ids = $usr_data_fields = $odf_ids = array();
273  foreach ($additional_fields as $field) {
274  if (substr($field, 0, 3) == 'udf') {
275  $udf_ids[] = substr($field, 4);
276  continue;
277  }
278 
279  if (substr($field, 0, 3) == 'odf') {
280  $odf_ids[] = substr($field, 4);
281  continue;
282  }
283 
284  $usr_data_fields[] = $field;
285  }
286 
287  $usr_data = ilUserQuery::getUserListData(
288  $this->getOrderField(),
289  $this->getOrderDirection(),
290  0,
291  9999,
292  $this->current_filter['login'],
293  '',
294  null,
295  false,
296  false,
297  0,
298  0,
299  null,
300  $usr_data_fields,
301  $ls_participants
302  );
303 
304  $user_data = array();
305  $filtered_user_ids = array();
306  $local_roles = $this->parent_gui->getLocalRoles();
307 
308  foreach ($usr_data['set'] as $ud) {
309  $user_id = $ud['usr_id'];
310 
311  if ($this->current_filter['roles']) {
312  if (!$this->rbac_review->isAssigned($user_id, $this->current_filter['roles'])) {
313  continue;
314  }
315  }
316 
317  if ($this->current_filter['org_units']) {
318  $org_unit = $this->current_filter['org_units'];
319  $title = ilObjectFactory::getInstanceByRefId($org_unit)->getTitle();
320  $user_units = (string) ilOrgUnitPathStorage::getTextRepresentationOfUsersOrgUnits($user_id);
321  if (strpos($user_units, $title) === false) {
322  continue;
323  }
324  }
325 
326  $filtered_user_ids[] = $user_id;
327  $user_data[$user_id] = array_merge($ud, (array) $lso_user_data[$user_id]);
328 
329  $roles = array();
330  foreach ($local_roles as $role_id => $role_name) {
331  if ($this->rbac_review->isAssigned($user_id, $role_id)) {
332  $roles[] = $role_name;
333  }
334  }
335 
336  $user_data[$user_id]['name'] = $user_data[$user_id]['lastname'] . ', ' . $user_data[$user_id]['firstname'];
337  $user_data[$user_id]['roles_label'] = implode('<br />', $roles);
338  $user_data[$user_id]['roles'] = $this->participants->setRoleOrderPosition($user_id);
339  }
340 
341  // Custom user data fields
342  if ($udf_ids) {
343  $data = ilUserDefinedData::lookupData($ls_participants, $udf_ids);
344  foreach ($data as $usr_id => $fields) {
345  if (!$this->checkAcceptance($usr_id)) {
346  continue;
347  }
348 
349  foreach ($fields as $field_id => $value) {
350  $user_data[$usr_id]['udf_' . $field_id] = $value;
351  }
352  }
353  }
354 
355  $user_data = ilUtil::sortArray(
356  $user_data,
357  'name',
358  $this->getOrderDirection()
359  );
360 
361  return $this->setData($user_data);
362  }
363 
364  public function getSelectableColumns()
365  {
366  $ef = $this->getExportFieldsInfo();
367  $columns = array();
368  $columns = $ef->getSelectableFieldsInfo(
369  $this->getRepositoryObject()->getId()
370  );
371 
372  if ($this->settings->get('user_portfolios')) {
373  $columns['prtf'] = array(
374  'txt' => $this->lng->txt('obj_prtf'),
375  'default' => false
376  );
377  }
378 
379  $columns = array_merge(
380  array(
381  'roles' => array(
382  'txt' => $this->lng->txt('objs_role'),
383  'default' => true
384  )
385  ),
386  array(
387  'org_units' => array(
388  'txt' => $this->lng->txt("org_units"),
389  'default' => false
390  )
391  ),
392  $columns
393  );
394 
395  return $columns;
396  }
397 
398  protected function getExportFieldsInfo()
399  {
401  $this->getRepositoryObject()->getType()
402  );
403  }
404 }
showActionLinks($a_set)
show edit links
addCommandButton($a_cmd, $a_text, $a_onclick='', $a_id="", $a_class=null)
Add Command button.
static sortArray( $array, $a_array_sortby, $a_array_sortorder=0, $a_numeric=false, $a_keep_keys=false)
sortArray
setDefaultOrderField($a_defaultorderfield)
Set Default order field.
settings()
Definition: settings.php:2
Class ilObjLearningSequence.
static _lookupTitle($a_id)
lookup object title
getOrderDirection()
Get order direction.
Class ilAccessHandler.
setId($a_val)
Set id.
static lookupData($a_user_ids, $a_field_ids)
Lookup data.
static _enabledLearningProgress()
check wether learing progress is enabled or not
setSelectAllCheckbox($a_select_all_checkbox, $a_select_all_on_top=false)
Set the name of the checkbox that should be toggled with a select all button.
static _getInstanceByType($a_type)
Get Singleton Instance.
Singleton class that stores all privacy settings.
static _lookupObjId($a_id)
addMultiCommand($a_cmd, $a_text)
Add Command button.
enable($a_module_name)
enables particular modules of table
setPrefix($a_prefix)
getSelectedColumns()
Get selected columns.
setRowTemplate($a_template, $a_template_dir="")
Set row template.
__construct(ilLearningSequenceMembershipGUI $parent_gui, ilObjLearningSequence $ls_object, ilObjUserTracking $obj_user_tracking, ilPrivacySettings $privacy_settings, ilLanguage $lng, ilAccess $access, ilRbacReview $rbac_review, ilSetting $settings)
determineOffsetAndOrder($a_omit_offset=false)
Determine offset and order.
setFormName($a_formname="")
Set Form name.
addColumn( $a_text, $a_sort_field="", $a_width="", $a_is_checkbox_action_column=false, $a_class="", $a_tooltip="", $a_tooltip_with_html=false)
Add a column to the header.
setShowRowsSelector($a_value)
Toggle rows-per-page selector.
static getInstanceByRefId($a_ref_id, $stop_on_error=true)
get an instance of an Ilias object by reference id
language handling
checkAcceptance($a_usr_id)
Check acceptance.
static _lookupActive($a_usr_id)
Check user account active.
getId()
Get element id.
$info
Definition: index.php:5
getLastVisitedStep(int $user_id)
Different to the concept we decide to use the title of the object instead of its actually number in t...
if(! $in) $columns
Definition: Utf8Test.php:45
GUI class for learning sequence membership features.
static getUserListData( $a_order_field, $a_order_dir, $a_offset, $a_limit, $a_string_filter="", $a_activation_filter="", $a_last_login_filter=null, $a_limited_access_filter=false, $a_no_courses_filter=false, $a_course_group_filter=0, $a_role_filter=0, $a_user_folder_filter=null, $a_additional_fields='', $a_user_filter=null, $a_first_letter="", $a_authentication_filter=null)
Get data for user administration list.
class ilRbacReview Contains Review functions of core Rbac.