ILIAS  trunk Revision v11.0_alpha-3011-gc6b235a2e85
class.ilSubscriberTableGUI.php
Go to the documentation of this file.
1<?php
2
19declare(strict_types=1);
20
21use ILIAS\UI\Factory as UIFactory;
22use ILIAS\UI\Renderer as UIRenderer;
24use ILIAS\User\Profile\Data as ProfileData;
25
32{
33 protected static ?array $all_columns = null;
34 protected static bool $has_odf_definitions = false;
35 protected array $subscribers = array();
36 protected bool $show_subject = true;
38
39 private UIRenderer $renderer;
40 private UIFactory $uiFactory;
42
43 public function __construct(
44 object $a_parent_obj,
46 bool $show_content = true,
47 bool $show_subject = true
48 ) {
49 $this->rep_object = $rep_object;
50 $this->setId('crs_sub_' . $this->getRepositoryObject()->getId());
51 parent::__construct($a_parent_obj, 'participants');
52
53 global $DIC;
54 $this->renderer = $DIC->ui()->renderer();
55 $this->uiFactory = $DIC->ui()->factory();
56 $this->profile = $DIC['user']->getProfile();
57
58 $this->lng->loadLanguageModule('grp');
59 $this->lng->loadLanguageModule('crs');
60 $this->setShowSubject($show_subject);
61 $this->setFormName('subscribers');
62 $this->setFormAction($this->ctrl->getFormAction($a_parent_obj, 'participants'));
63
64 $this->addColumn('', 'f', "1%", true);
65 $this->addColumn($this->lng->txt('name'), 'lastname', '20%');
66
67 $all_cols = $this->getSelectableColumns();
68 foreach ($this->getSelectedColumns() as $col) {
69 $this->addColumn(
70 $all_cols[$col]['txt'],
71 $col
72 );
73 }
74
75 if ($this->getShowSubject()) {
76 $this->addColumn($this->lng->txt('application_date'), 'sub_time');
77 $this->addColumn($this->lng->txt('message'), 'subject', '40%');
78 } else {
79 $this->addColumn($this->lng->txt('application_date'), 'sub_time');
80 }
81 $this->addColumn('', 'mail');
82 if ($this->getRepositoryObject()->getType() === "sess") {
83 $this->addMultiCommand('confirmAssignSubscribers', $this->lng->txt('sess_accept_request'));
84 } else {
85 $this->addMultiCommand('confirmAssignSubscribers', $this->lng->txt('assign'));
86 }
87 $this->addMultiCommand('confirmRefuseSubscribers', $this->lng->txt('refuse'));
88 $this->addMultiCommand('sendMailToSelectedUsers', $this->lng->txt('crs_mem_send_mail'));
89
90 // begin-patch clipboard
91 $this->lng->loadLanguageModule('user');
92 $this->addMultiCommand('addToClipboard', $this->lng->txt('clipboard_add_btn'));
93 // end-patch clipboard
94
95 $this->setPrefix('subscribers');
96 $this->setSelectAllCheckbox('subscribers', true);
97 $this->setRowTemplate("tpl.show_subscribers_row.html", "components/ILIAS/Membership");
98
99 if ($show_content) {
100 $this->enable('sort');
101 $this->enable('header');
102 $this->enable('numinfo');
103 $this->enable('select_all');
104 } else {
105 $this->disable('content');
106 $this->disable('header');
107 $this->disable('footer');
108 $this->disable('numinfo');
109 $this->disable('select_all');
110 }
111
112 $this->setExternalSegmentation(true);
113 self::$has_odf_definitions = (bool) ilCourseDefinedFieldDefinition::_hasFields($this->getRepositoryObject()->getId());
114 }
115
116 protected function getRepositoryObject(): ilObject
117 {
118 return $this->rep_object;
119 }
120
121 public function getSelectableColumns(): array
122 {
123 if (self::$all_columns) {
124 return self::$all_columns;
125 }
126
127 if ($this->getRepositoryObject()->getType() === 'sess') {
128 self::$all_columns['login'] = [
129 'txt' => $this->lng->txt('login'),
130 'default' => 1
131 ];
132 return self::$all_columns;
133 }
135 self::$all_columns = $ef->getSelectableFieldsInfo($this->getRepositoryObject()->getId());
136
137 // #25215
138 if (
139 is_array(self::$all_columns) &&
140 array_key_exists('consultation_hour', self::$all_columns)
141 ) {
142 unset(self::$all_columns['consultation_hour']);
143 }
144 return self::$all_columns;
145 }
146
147 protected function fillRow(array $a_set): void
148 {
149 if (!ilObjCourseGrouping::_checkGroupingDependencies($this->getRepositoryObject(), (int) $a_set['usr_id']) and
151 $prefix = $this->getRepositoryObject()->getType();
152 $this->tpl->setVariable(
153 'ALERT_MSG',
154 sprintf(
155 $this->lng->txt($prefix . '_lim_assigned'),
156 ilObject::_lookupTitle(current($ids))
157 )
158 );
159 }
160 $this->tpl->setVariable('VAL_ID', $a_set['usr_id']);
161 $this->tpl->setVariable('VAL_NAME', $a_set['lastname'] . ', ' . $a_set['firstname']);
162
163 foreach ($this->getSelectedColumns() as $field) {
164 switch ($field) {
165 case 'gender':
166 $a_set['gender'] = $a_set['gender'] ? $this->lng->txt('gender_' . $a_set['gender']) : '';
167 $this->tpl->setCurrentBlock('custom_fields');
168 $this->tpl->setVariable('VAL_CUST', $a_set[$field]);
169 $this->tpl->parseCurrentBlock();
170 break;
171
172 case 'birthday':
173 $a_set['birthday'] = $a_set['birthday'] ? ilDatePresentation::formatDate(new ilDate(
174 $a_set['birthday'],
176 )) : $this->lng->txt('no_date');
177 $this->tpl->setCurrentBlock('custom_fields');
178 $this->tpl->setVariable('VAL_CUST', $a_set[$field]);
179 $this->tpl->parseCurrentBlock();
180 break;
181
182 case 'odf_last_update':
183 $this->tpl->setVariable('VAL_CUST', (string) ($a_set['odf_info_txt'] ?? ''));
184 break;
185
186 case 'org_units':
187 $this->tpl->setCurrentBlock('custom_fields');
188 $this->tpl->setVariable(
189 'VAL_CUST',
190 ilOrgUnitPathStorage::getTextRepresentationOfUsersOrgUnits((int) $a_set['usr_id'])
191 );
192 $this->tpl->parseCurrentBlock();
193 break;
194
195 default:
196 $this->tpl->setCurrentBlock('custom_fields');
197 $this->tpl->setVariable('VAL_CUST', isset($a_set[$field]) ? (string) $a_set[$field] : '');
198 $this->tpl->parseCurrentBlock();
199 break;
200 }
201 }
202
203 $this->tpl->setVariable(
204 'VAL_SUBTIME',
206 );
207 $this->showActionLinks($a_set);
208 if ($this->getShowSubject()) {
209 if (strlen($a_set['subject'])) {
210 $this->tpl->setCurrentBlock('subject');
211 $this->tpl->setVariable('VAL_SUBJECT', '"' . $a_set['subject'] . '"');
212 $this->tpl->parseCurrentBlock();
213 } else {
214 $this->tpl->touchBlock('subject');
215 }
216 }
217 }
218
222 public function showActionLinks(array $a_set): void
223 {
224 $this->ctrl->setParameterByClass(get_class($this->getParentObject()), 'member_id', $a_set['usr_id']);
225 $this->ctrl->setParameter($this->parent_obj, 'member_id', $a_set['usr_id']);
226
227 $dropDownItems = array();
228 $dropDownItems[] = $this->uiFactory->button()->shy(
229 $this->lng->txt($this->getRepositoryObject()->getType() . '_mem_send_mail'),
230 $this->ctrl->getLinkTargetByClass(get_class($this->getParentObject()), 'sendMailToSelectedUsers')
231 );
232
233 if (self::$has_odf_definitions) {
234 $this->ctrl->setParameterByClass('ilobjectcustomuserfieldsgui', 'member_id', $a_set['usr_id']);
235 $dropDownItems[] = $this->uiFactory->button()->shy(
236 $this->lng->txt($this->getRepositoryObject()->getType() . '_cdf_edit_member'),
237 $this->ctrl->getLinkTargetByClass('ilobjectcustomuserfieldsgui', 'editMember')
238 );
239 }
240
241 $dropDown = $this->uiFactory->dropdown()->standard($dropDownItems)
242 ->withLabel($this->lng->txt('actions'));
243 $this->tpl->setVariable('ACTION_USER', $this->renderer->render($dropDown));
244 }
245
252 public function readSubscriberData(array $a_subscriber_ids): void
253 {
255 $sub_ids = $sub_data = [];
256 foreach ($a_subscriber_ids as $usr_id) {
257 $sub_ids[] = $usr_id;
258 $sub_data[$usr_id] = $subscriber_data[$usr_id];
259 }
260
262
263 $additional_fields = $this->getSelectedColumns();
264 unset(
265 $additional_fields["firstname"],
266 $additional_fields["lastname"],
267 $additional_fields["last_login"],
268 $additional_fields["access_until"],
269 $additional_fields['org_units']
270 );
271
272 $udf_ids = $usr_data_fields = $odf_ids = array();
273 foreach ($additional_fields as $field) {
274 if (strpos($field, 'udf') === 0) {
275 $udf_ids[] = substr($field, 4);
276 continue;
277 }
278 if (strpos($field, 'odf') === 0) {
279 $odf_ids[] = substr($field, 4);
280 continue;
281 }
282
283 $usr_data_fields[] = $field;
284 }
285
287 $this->getOrderField(),
288 $this->getOrderDirection(),
289 $this->getOffset(),
290 $this->getLimit(),
291 '',
292 '',
293 null,
294 false,
295 false,
296 0,
297 0,
298 null,
299 $usr_data_fields,
300 $sub_ids
301 );
302
303 $usr_ids = [];
304 foreach ((array) $usr_data['set'] as $user) {
305 $usr_ids[] = $user['usr_id'];
306 }
307
308 // merge course data
309 $course_user_data = $this->getParentObject()->readMemberData($usr_ids, array());
310 $a_user_data = array();
311 foreach ((array) $usr_data['set'] as $ud) {
312 $a_user_data[$ud['usr_id']] = array_merge($ud, (array) $course_user_data[$ud['usr_id']]);
313 }
314
315 // Custom user data fields
316 if (is_array($udf_ids)) {
317 $a_user_data = array_reduce(
318 $this->profile->getDataForMultiple($usr_ids),
319 function (array $c, ProfileData $v) use ($udf_ids): array {
320 if (!$this->checkAcceptance($v->getId())) {
321 return $c;
322 }
323
324 foreach ($udf_ids as $field_id) {
325 $c[$v->getId()]['udf_' . $field_id] = $v->getAdditionalFieldByIdentifier($field_id);
326 }
327 },
328 $a_user_data
329 );
330 }
331 // Object specific user data fields
332 if (is_array($odf_ids)) {
334 foreach ($data as $usr_id => $fields) {
335 // #7264: as we get data for all course members filter against user data
336 if (!$this->checkAcceptance($usr_id) || !in_array($usr_id, $usr_ids)) {
337 continue;
338 }
339
340 foreach ($fields as $field_id => $value) {
341 $a_user_data[$usr_id]['odf_' . $field_id] = $value;
342 }
343 }
344
345 // add last edit date
346 foreach (ilObjectCustomUserFieldHistory::lookupEntriesByObjectId($this->getRepositoryObject()->getId()) as $usr_id => $edit_info) {
347 if (!isset($a_user_data[$usr_id])) {
348 continue;
349 }
350
351 if ($usr_id == $edit_info['update_user']) {
352 $a_user_data[$usr_id]['odf_last_update'] = '';
353 $a_user_data[$usr_id]['odf_info_txt'] = $GLOBALS['DIC']['lng']->txt('cdf_edited_by_self');
354 if (ilPrivacySettings::getInstance()->enabledAccessTimesByType($this->getRepositoryObject()->getType())) {
355 $a_user_data[$usr_id]['odf_last_update'] .= ('_' . $edit_info['editing_time']->get(IL_CAL_UNIX));
356 $a_user_data[$usr_id]['odf_info_txt'] .= (', ' . ilDatePresentation::formatDate($edit_info['editing_time']));
357 }
358 } else {
359 $a_user_data[$usr_id]['odf_last_update'] = $edit_info['update_user'];
360 $a_user_data[$usr_id]['odf_last_update'] .= ('_' . $edit_info['editing_time']->get(IL_CAL_UNIX));
361
362 $name = ilObjUser::_lookupName($edit_info['update_user']);
363 $a_user_data[$usr_id]['odf_info_txt'] = ($name['firstname'] . ' ' . $name['lastname'] . ', ' . ilDatePresentation::formatDate($edit_info['editing_time']));
364 }
365 }
366 }
367
368 foreach ($usr_data['set'] as $user) {
369 // Check acceptance
370 if (!$this->checkAcceptance((int) $user['usr_id'])) {
371 continue;
372 }
373 // DONE: accepted
374 foreach ($usr_data_fields as $field) {
375 $a_user_data[$user['usr_id']][$field] = $user[$field] ?: '';
376 }
377 }
378
379 // Waiting list subscription
380 foreach ($sub_data as $usr_id => $usr_data) {
381 if (!in_array($usr_id, $usr_ids)) {
382 continue;
383 }
384 $a_user_data[$usr_id]['sub_time'] = $usr_data['time'];
385 $a_user_data[$usr_id]['subject'] = $usr_data['subject'];
386 }
387
388 $this->setMaxCount(count($sub_ids));
389 $this->setData($a_user_data);
390 }
391
392 protected function checkAcceptance(int $a_usr_id): bool
393 {
394 return true;
395 }
396
397 public function setShowSubject(bool $a_value): void
398 {
399 $this->show_subject = $a_value;
400 }
401
402 public function getShowSubject(): bool
403 {
404 return $this->show_subject;
405 }
406}
renderer()
Builds a Color from either hex- or rgb values.
Definition: Factory.php:31
const IL_CAL_DATE
const IL_CAL_UNIX
static _hasFields(int $a_container_id)
Check if there are any define fields.
static _getValuesByObjId(int $a_obj_id)
static formatDate(ilDateTime $date, bool $a_skip_day=false, bool $a_include_wd=false, bool $include_seconds=false, ?ilObjUser $user=null,)
@classDescription Date and time handling
Class for single dates.
static _getInstanceByType(string $a_type)
Get Singleton Instance.
static _checkGroupingDependencies(ilObject $container_obj, ?int $a_user_id=null)
static _lookupName(int $a_user_id)
Class ilObject Basic functions for all objects.
static _lookupTitle(int $obj_id)
static lookupSubscribersData(int $a_obj_id)
GUI class for course/group subscriptions.
__construct(object $a_parent_obj, ilObject $rep_object, bool $show_content=true, bool $show_subject=true)
getSelectableColumns()
Get selectable columns.
showActionLinks(array $a_set)
Show action links (mail ; edit crs|grp data)
readSubscriberData(array $a_subscriber_ids)
read data @access protected
fillRow(array $a_set)
Standard Version of Fill Row.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
determineOffsetAndOrder(bool $a_omit_offset=false)
setExternalSegmentation(bool $a_val)
setFormName(string $a_name="")
addMultiCommand(string $a_cmd, string $a_text)
setPrefix(string $a_prefix)
set prefix for sort and offset fields (if you have two or more tables on a page that you want to sort...
setFormAction(string $a_form_action, bool $a_multipart=false)
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)
setSelectAllCheckbox(string $a_select_all_checkbox, bool $a_select_all_on_top=false)
setRowTemplate(string $a_template, string $a_template_dir="")
Set row template.
setId(string $a_val)
setData(array $a_data)
Set table data.
enable(string $a_module_name)
disable(string $a_module_name)
setMaxCount(int $a_max_count)
set max.
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.
$c
Definition: deliver.php:25
An entity that renders components to a string output.
Definition: Renderer.php:31
__construct(Container $dic, ilPlugin $plugin)
@inheritDoc
global $DIC
Definition: shib_login.php:26
$GLOBALS["DIC"]
Definition: wac.php:54