ILIAS  trunk Revision v12.0_alpha-1540-g00f839d5fa1
class.ilParticipant.php
Go to the documentation of this file.
1<?php
2
19declare(strict_types=1);
20
27abstract class ilParticipant
28{
29 protected const MEMBERSHIP_ADMIN = 1;
30 protected const MEMBERSHIP_TUTOR = 2;
31 protected const MEMBERSHIP_MEMBER = 3;
32
33 private int $obj_id = 0;
34 private int $usr_id = 0;
35 protected string $type = '';
36 private int $ref_id = 0;
37
38 private string $component = '';
39
40 private array $roles = [];
41 private array $role_data = [];
42 private bool $participants = false;
43 private bool $admins = false;
44 private bool $tutors = false;
45 private bool $members = false;
46
47 private ?int $numMembers = null;
48 private array $member_roles = [];
49 private array $participants_status = array();
50
52 protected ilDBInterface $db;
57
58 protected function __construct(string $a_component_name, int $a_obj_id, int $a_usr_id)
59 {
60 global $DIC;
61
62 $this->obj_id = $a_obj_id;
63 $this->usr_id = $a_usr_id;
64 $this->type = ilObject::_lookupType($a_obj_id);
65 $ref_ids = ilObject::_getAllReferences($this->obj_id);
66 $this->ref_id = current($ref_ids);
67 $this->component = $a_component_name;
68
69 $this->recommended_content_manager = new ilRecommendedContentManager();
70 $this->db = $DIC->database();
71 $this->rbacReview = $DIC->rbac()->review();
72 $this->rbacAdmin = $DIC->rbac()->admin();
73 $this->objectDataCache = $DIC['ilObjDataCache'];
74 $this->eventHandler = $DIC->event();
75
76 $this->readParticipant();
77 $this->readParticipantStatus();
78 }
79
80 public static function updateMemberRoles(int $a_obj_id, int $a_usr_id, int $a_role_id, int $a_status): void
81 {
82 global $DIC;
83
84 $ilDB = $DIC->database();
85
86 $a_membership_role_type = self::getMembershipRoleType($a_role_id);
87 switch ($a_membership_role_type) {
89 $update_fields = array('admin' => array('integer', $a_status ? 1 : 0));
90 $update_string = ('admin = ' . $ilDB->quote($a_status ? 1 : 0, 'integer'));
91 break;
92
94 $update_fields = array('tutor' => array('integer', $a_status ? 1 : 0));
95 $update_string = ('tutor = ' . $ilDB->quote($a_status ? 1 : 0, 'integer'));
96 break;
97
99 default:
100 $current_status = self::lookupStatusByMembershipRoleType($a_obj_id, $a_usr_id, $a_membership_role_type);
101
102 if ($a_status) {
103 $new_status = $current_status + 1;
104 }
105 if (!$a_status) {
106 $new_status = $current_status - 1;
107 if ($new_status < 0) {
108 $new_status = 0;
109 }
110 }
111
112 $update_fields = array('member' => array('integer', $new_status));
113 $update_string = ('member = ' . $ilDB->quote($new_status, 'integer'));
114 break;
115 }
116
117 $query = 'SELECT count(*) num FROM obj_members ' .
118 'WHERE obj_id = ' . $ilDB->quote($a_obj_id, 'integer') . ' ' .
119 'AND usr_id = ' . $ilDB->quote($a_usr_id, 'integer');
120 $res = $ilDB->query($query);
121
122 $found = false;
123 while ($row = $res->fetchRow(ilDBConstants::FETCHMODE_OBJECT)) {
124 if ($row->num) {
125 $found = true;
126 }
127 }
128 if (!$found) {
129 $ilDB->replace(
130 'obj_members',
131 array(
132 'obj_id' => array('integer', $a_obj_id),
133 'usr_id' => array('integer', $a_usr_id)
134 ),
135 $update_fields
136 );
137 } else {
138 $query = 'UPDATE obj_members SET ' .
139 $update_string . ' ' .
140 'WHERE obj_id = ' . $ilDB->quote($a_obj_id, 'integer') . ' ' .
141 'AND usr_id = ' . $ilDB->quote($a_usr_id, 'integer');
142
143 $ilDB->manipulate($query);
144 }
145
146 $query = 'DELETE from obj_members ' .
147 'WHERE obj_id = ' . $ilDB->quote($a_obj_id, 'integer') . ' ' .
148 'AND usr_id = ' . $ilDB->quote($a_usr_id, 'integer') . ' ' .
149 'AND admin = ' . $ilDB->quote(0, 'integer') . ' ' .
150 'AND tutor = ' . $ilDB->quote(0, 'integer') . ' ' .
151 'AND member = ' . $ilDB->quote(0, 'integer');
152 $ilDB->manipulate($query);
153 }
154
155 public static function getMembershipRoleType(int $a_role_id): int
156 {
157 $title = ilObject::_lookupTitle($a_role_id);
158 switch (substr($title, 0, 8)) {
159 case 'il_crs_a':
160 case 'il_grp_a':
162
163 case 'il_crs_t':
165
166 case 'il_crs_m':
167 default:
169 }
170 }
171
172 public static function lookupStatusByMembershipRoleType(
173 int $a_obj_id,
174 int $a_usr_id,
175 int $a_membership_role_type
176 ): int {
177 global $DIC;
178
179 $ilDB = $DIC->database();
180 $query = 'SELECT * FROM obj_members ' .
181 'WHERE obj_id = ' . $ilDB->quote($a_obj_id, 'integer') . ' ' .
182 'AND usr_id = ' . $ilDB->quote($a_usr_id, ilDBConstants::T_INTEGER) . ' ';
183 $res = $ilDB->query($query);
184 while ($row = $res->fetchRow(ilDBConstants::FETCHMODE_OBJECT)) {
185 switch ($a_membership_role_type) {
187 return (int) $row->admin;
188
190 return (int) $row->tutor;
191
193 return (int) $row->member;
194 }
195 }
196 return 0;
197 }
198
203 protected function getComponent(): string
204 {
205 return $this->component;
206 }
207
208 public function getUserId(): int
209 {
210 return $this->usr_id;
211 }
212
213 public function isBlocked(): bool
214 {
215 return (bool) ($this->participants_status[$this->getUserId()]['blocked'] ?? false);
216 }
217
221 public function isContact(): bool
222 {
223 return (bool) ($this->participants_status[$this->getUserId()]['contact'] ?? false);
224 }
225
226 public function isAssigned(): bool
227 {
228 return $this->participants;
229 }
230
231 public function isMember(): bool
232 {
233 return $this->members;
234 }
235
236 public function isAdmin(): bool
237 {
238 return $this->admins;
239 }
240
241 public function isTutor(): bool
242 {
243 return $this->tutors;
244 }
245
246 public function isParticipant(): bool
247 {
248 return $this->participants;
249 }
250
251 public function getNumberOfMembers(): int
252 {
253 if ($this->numMembers === null) {
254 $this->numMembers = $this->rbacReview->getNumberOfAssignedUsers($this->member_roles);
255 }
256 return $this->numMembers;
257 }
258
259 protected function readParticipant(): void
260 {
261 $this->roles = $this->rbacReview->getRolesOfRoleFolder($this->ref_id, false);
262 $this->member_roles = [];
263 foreach ($this->roles as $role_id) {
264 $title = $this->objectDataCache->lookupTitle($role_id);
265 switch (substr($title, 0, 8)) {
266 case 'il_crs_m':
267 $this->member_roles[] = $role_id;
268 $this->role_data[ilParticipants::IL_CRS_MEMBER] = $role_id;
269 if ($this->rbacReview->isAssigned($this->getUserId(), $role_id)) {
270 $this->participants = true;
271 $this->members = true;
272 }
273 break;
274
275 case 'il_crs_a':
276 $this->role_data[ilParticipants::IL_CRS_ADMIN] = $role_id;
277 if ($this->rbacReview->isAssigned($this->getUserId(), $role_id)) {
278 $this->participants = true;
279 $this->admins = true;
280 }
281 break;
282
283 case 'il_crs_t':
284 $this->role_data[ilParticipants::IL_CRS_TUTOR] = $role_id;
285 if ($this->rbacReview->isAssigned($this->getUserId(), $role_id)) {
286 $this->participants = true;
287 $this->tutors = true;
288 }
289 break;
290
291 case 'il_grp_a':
292 $this->role_data[ilParticipants::IL_GRP_ADMIN] = $role_id;
293 if ($this->rbacReview->isAssigned($this->getUserId(), $role_id)) {
294 $this->participants = true;
295 $this->admins = true;
296 }
297 break;
298
299 case 'il_grp_m':
300 $this->member_roles[] = $role_id;
301 $this->role_data[ilParticipants::IL_GRP_MEMBER] = $role_id;
302 if ($this->rbacReview->isAssigned($this->getUserId(), $role_id)) {
303 $this->participants = true;
304 $this->members = true;
305 }
306 break;
307
308 default:
309
310 $this->member_roles[] = $role_id;
311 if ($this->rbacReview->isAssigned($this->getUserId(), $role_id)) {
312 $this->participants = true;
313 $this->members = true;
314 }
315 break;
316 }
317 }
318 }
319
320 protected function readParticipantStatus(): void
321 {
322 $query = "SELECT * FROM obj_members " .
323 "WHERE obj_id = " . $this->db->quote($this->obj_id, 'integer') . " " .
324 'AND usr_id = ' . $this->db->quote($this->getUserId(), 'integer');
325
326 $res = $this->db->query($query);
327 $this->participants_status = array();
328 while ($row = $res->fetchRow(ilDBConstants::FETCHMODE_OBJECT)) {
329 $this->participants_status[$this->getUserId()]['blocked'] = (bool) $row->blocked;
330 $this->participants_status[$this->getUserId()]['notification'] = (bool) $row->notification;
331 $this->participants_status[$this->getUserId()]['passed'] = (bool) $row->passed;
332 $this->participants_status[$this->getUserId()]['contact'] = (bool) $row->contact;
333 }
334 }
335
336 public function add(int $a_usr_id, int $a_role): bool
337 {
338 if ($this->rbacReview->isAssignedToAtLeastOneGivenRole($a_usr_id, $this->roles)) {
339 return false;
340 }
341
342 switch ($a_role) {
345 $this->admins = true;
346 break;
347
349 $this->tutors = true;
350 break;
351
354 $this->members = true;
355 break;
356 }
357
358 $this->rbacAdmin->assignUser($this->role_data[$a_role], $a_usr_id);
359 $this->addRecommendation($a_usr_id);
360
361 // Delete subscription request
362 $this->deleteSubscriber($a_usr_id);
363
364 ilWaitingList::deleteUserEntry($a_usr_id, $this->obj_id);
365
366 $this->eventHandler->raise(
367 $this->getComponent(),
368 "addParticipant",
369 array(
370 'obj_id' => $this->obj_id,
371 'usr_id' => $a_usr_id,
372 'role_id' => $a_role
373 )
374 );
375 return true;
376 }
377
378 public function delete(int $a_usr_id): void
379 {
380 $this->recommended_content_manager->removeObjectRecommendation($a_usr_id, $this->ref_id);
381 foreach ($this->roles as $role_id) {
382 $this->rbacAdmin->deassignUser($role_id, $a_usr_id);
383 }
384
385 $query = "DELETE FROM obj_members " .
386 "WHERE usr_id = " . $this->db->quote($a_usr_id, 'integer') . " " .
387 "AND obj_id = " . $this->db->quote($this->obj_id, 'integer');
388 $res = $this->db->manipulate($query);
389
390 $this->eventHandler->raise(
391 $this->getComponent(),
392 "deleteParticipant",
393 array(
394 'obj_id' => $this->obj_id,
395 'usr_id' => $a_usr_id
396 )
397 );
398 }
399
400 public function deleteSubscriber(int $a_usr_id): void
401 {
402 $query = "DELETE FROM il_subscribers " .
403 "WHERE usr_id = " . $this->db->quote($a_usr_id, 'integer') . " " .
404 "AND obj_id = " . $this->db->quote($this->obj_id, 'integer') . " ";
405 $res = $this->db->manipulate($query);
406 }
407
408 public function addRecommendation($a_usr_id): void
409 {
410 // deactivated for now, see discussion at
411 // https://docu.ilias.de/goto_docu_wiki_wpage_5620_1357.html
412 //$this->recommended_content_manager->addObjectRecommendation($a_usr_id, $this->ref_id);
413 }
414
415 public function updateContact(int $a_usr_id, bool $a_contact): void
416 {
417 $this->db->manipulate(
418 'UPDATE obj_members SET ' .
419 'contact = ' . $this->db->quote($a_contact, 'integer') . ' ' .
420 'WHERE obj_id = ' . $this->db->quote($this->obj_id, 'integer') . ' ' .
421 'AND usr_id = ' . $this->db->quote($a_usr_id, 'integer')
422 );
423 $this->participants_status[$a_usr_id]['contact'] = $a_contact;
424 }
425
426 public function updateNotification(int $a_usr_id, bool $a_notification): void
427 {
428 $this->participants_status[$a_usr_id]['notification'] = $a_notification;
429
430 $query = "SELECT * FROM obj_members " .
431 "WHERE obj_id = " . $this->db->quote($this->obj_id, 'integer') . " " .
432 "AND usr_id = " . $this->db->quote($a_usr_id, 'integer');
433 $res = $this->db->query($query);
434 if ($res->numRows()) {
435 $query = "UPDATE obj_members SET " .
436 "notification = " . $this->db->quote((int) $a_notification, 'integer') . " " .
437 "WHERE obj_id = " . $this->db->quote($this->obj_id, 'integer') . " " .
438 "AND usr_id = " . $this->db->quote($a_usr_id, 'integer');
439 } else {
440 $query = "INSERT INTO obj_members (notification,obj_id,usr_id,passed,blocked) " .
441 "VALUES ( " .
442 $this->db->quote((int) $a_notification, 'integer') . ", " .
443 $this->db->quote($this->obj_id, 'integer') . ", " .
444 $this->db->quote($a_usr_id, 'integer') . ", " .
445 $this->db->quote(0, 'integer') . ", " .
446 $this->db->quote(0, 'integer') .
447 ") ON DUPLICATE KEY UPDATE notification = VALUES(notification)";
448 }
449 $this->db->manipulate($query);
450 }
451
452 public function checkLastAdmin(array $a_usr_ids): bool
453 {
454 $admin_role_id =
455 $this->type === 'crs' ?
456 $this->role_data[ilParticipants::IL_CRS_ADMIN] :
457 $this->role_data[ilParticipants::IL_GRP_ADMIN];
458
459 $query = "
460 SELECT COUNT(rolesusers.usr_id) cnt
461
462 FROM object_data rdata
463
464 LEFT JOIN rbac_ua rolesusers
465 ON rolesusers.rol_id = rdata.obj_id
466
467 WHERE rdata.obj_id = %s
468 ";
469
470 $query .= ' AND ' . $this->db->in('rolesusers.usr_id', $a_usr_ids, true, 'integer');
471 $res = $this->db->queryF($query, array('integer'), array($admin_role_id));
472
473 $data = $this->db->fetchAssoc($res);
474 return $data['cnt'] > 0;
475 }
476}
Global event handler.
const FETCHMODE_OBJECT
class ilObjectDataCache
static _lookupType(int $id, bool $reference=false)
static _getAllReferences(int $id)
get all reference ids for object ID
static _lookupTitle(int $obj_id)
Base class for course and group participant.
checkLastAdmin(array $a_usr_ids)
static getMembershipRoleType(int $a_role_id)
ilRbacAdmin $rbacAdmin
ilDBInterface $db
addRecommendation($a_usr_id)
updateNotification(int $a_usr_id, bool $a_notification)
add(int $a_usr_id, int $a_role)
getComponent()
Get component name Used for event handling.
ilAppEventHandler $eventHandler
updateContact(int $a_usr_id, bool $a_contact)
ilObjectDataCache $objectDataCache
static lookupStatusByMembershipRoleType(int $a_obj_id, int $a_usr_id, int $a_membership_role_type)
isContact()
Check if user is contact for current object.
deleteSubscriber(int $a_usr_id)
ilRecommendedContentManager $recommended_content_manager
static updateMemberRoles(int $a_obj_id, int $a_usr_id, int $a_role_id, int $a_status)
__construct(string $a_component_name, int $a_obj_id, int $a_usr_id)
ilRbacReview $rbacReview
Class ilRbacAdmin Core functions for role based access control.
class ilRbacReview Contains Review functions of core Rbac.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static deleteUserEntry(int $a_usr_id, int $a_obj_id)
Interface ilDBInterface.
$res
Definition: ltiservices.php:69
global $DIC
Definition: shib_login.php:26