19declare(strict_types=1);
38 'interests_help_offered',
39 'interests_help_looking'
50 'time_limit_unlimited',
86 $this->
lng = $DIC[
'lng'];
87 $this->db =
$DIC[
'ilDB'];
89 $local_dic = LocalDIC::dic();
90 $this->profile_fields_repository = $local_dic[ProfileFieldsConfigurationRepository::class];
91 $this->profile_data_repository = $local_dic[ProfileDataRepository::class];
100 $this->udf_filter = array_reduce(
101 array_keys($filter_array),
102 function (array
$c,
string $v) use ($filter_array): array {
103 if ($filter_array[$v] ===
'') {
106 $c[mb_substr($v, 4)] = $filter_array[$v];
128 $this->order_field = $a_order;
138 $this->order_dir = $a_dir;
143 $this->offset = $a_offset;
148 $this->limit = $a_limit;
156 $this->text_filter = $a_filter;
165 $this->activation = $a_activation;
173 $this->last_login = $dt;
181 $this->limited_access = $a_status;
186 $this->no_courses = $a_no_course;
191 $this->no_groups = $a_no_group;
200 $this->crs_grp = $a_cg_id;
209 $this->role = $a_role_id;
218 $this->user_folder = $user_folder_id ?? [];
234 $this->users = $a_filter;
242 $this->first_letter = $a_fll;
250 $this->has_access = $a_access;
259 $this->authentication_method = $a_authentication;
266 public function query(): array
272 $this->additional_fields,
274 if (in_array($v, self::DEFAULT_FIELDS)) {
278 if (in_array($v, self::DEFAULT_MULTI_FIELDS)) {
279 return $c->withAdditionalMultiField($v);
282 if ($v ===
'online_time') {
283 return $c->withAdditionalAdditionalTableSelectField(
'ut_online.online_time')
284 ->withAdditionalJoin(
'LEFT JOIN ut_online ON (usr_data.usr_id = ut_online.usr_id)');
287 if ($v ===
'dpro_agreed_on') {
288 return $c->withAdditionalAdditionalTableSelectField(
'dpro.dpro_agreed_on')
289 ->withAdditionalJoin(
290 'LEFT JOIN (SELECT value AS dpro_agreed_on, usr_id' . PHP_EOL
291 .
'FROM usr_pref WHERE keyword = "dpro_agree_date") AS dpro' . PHP_EOL
292 .
'ON (usr_data.usr_id = dpro.usr_id)'
296 if (str_starts_with($v,
'udf_')) {
297 return $c->withAdditionalUdfField(
298 $this->profile_fields_repository->getByIdentifier(mb_substr($v, 4))
302 return $c->withAdditionalDefaultTableSelectField($v);
304 $this->profile_data_repository->getProfileDataQuery(self::DEFAULT_FIELDS)
306 )->withLimitedUsers($this->users)
309 if ($this->first_letter !==
'') {
310 $query = $query->withAdditionalWhere(
311 "({$this->db->upper($this->db->substr('usr_data.lastname', 1, 1))})"
315 if ($this->text_filter !==
'') {
316 $query = $query->withAdditionalWhere(
317 "({$this->db->like('usr_data.login', ilDBConstants::T_TEXT, '%' . $this->text_filter . '%')} "
318 .
"OR {$this->db->like('usr_data.firstname', ilDBConstants::T_TEXT, '%' . $this->text_filter . '%')} "
319 .
"OR {$this->db->like('usr_data.lastname', ilDBConstants::T_TEXT, '%' . $this->text_filter . '%')} "
320 .
"OR {$this->db->like('usr_data.second_email', ilDBConstants::T_TEXT, '%' . $this->text_filter . '%')} "
321 .
"OR {$this->db->like('usr_data.email', ilDBConstants::T_TEXT, '%' . $this->text_filter . '%')})"
325 if ($this->activation ===
'inactive') {
326 $query = $query->withAdditionalWhere(
327 "usr_data.active = {$this->db->quote(0, ilDBConstants::T_INTEGER)}"
331 if ($this->activation ===
'active') {
332 $query = $query->withAdditionalWhere(
333 "usr_data.active = {$this->db->quote(1, ilDBConstants::T_INTEGER)}"
337 if ($this->last_login instanceof
ilDateTime) {
339 $query = $query->withAdditionalWhere(
340 "usr_data.last_login < {$this->db->quote($this->last_login->get(IL_CAL_DATETIME), ilDBConstants::T_TIMESTAMP)}"
344 if ($this->limited_access) {
345 $query = $query->withAdditionalWhere(
346 "usr_data.time_limit_unlimited= {$this->db->quote(0, ilDBConstants::T_INTEGER)}"
350 if ($this->has_access) {
351 $query = $query->withAdditionalWhere(
352 "(time_limit_unlimited = {$this->db->quote(1, ilDBConstants::T_INTEGER)} "
353 .
"OR (time_limit_from < {$this->db->quote(time(), ilDBConstants::T_INTEGER)} "
354 .
"AND time_limit_until > {$this->db->quote(time(), ilDBConstants::T_INTEGER)}))"
358 if ($this->no_courses) {
359 $query = $query->withAdditionalWhere(
360 'usr_data.usr_id NOT IN ('
361 .
'SELECT DISTINCT ud.usr_id '
362 .
'FROM usr_data ud join rbac_ua ON (ud.usr_id = rbac_ua.usr_id) '
363 .
'JOIN object_data od ON (rbac_ua.rol_id = od.obj_id) '
364 .
'JOIN rbac_fa ON (rbac_ua.rol_id = rbac_fa.rol_id) '
365 .
'JOIN tree ON (rbac_fa.parent = tree.child) '
366 .
'WHERE od.title LIKE "il_crs_%" '
367 .
'AND rbac_fa.assign = "y" '
368 .
'AND tree.tree > 0)'
372 if ($this->no_groups) {
373 $query = $query->withAdditionalWhere(
374 'usr_data.usr_id NOT IN ('
375 .
'SELECT DISTINCT ud.usr_id '
376 .
'FROM usr_data ud join rbac_ua ON (ud.usr_id = rbac_ua.usr_id) '
377 .
'JOIN object_data od ON (rbac_ua.rol_id = od.obj_id) '
378 .
'JOIN rbac_fa ON (rbac_ua.rol_id = rbac_fa.rol_id) '
379 .
'JOIN tree ON (rbac_fa.parent = tree.child) '
380 .
'WHERE od.title LIKE "il_grp_%" '
381 .
'AND rbac_fa.assign = "y" '
382 .
'AND tree.tree > 0)'
386 if ($this->crs_grp > 0) {
388 $query = $query->withAdditionalWhere(
389 'usr_data.usr_id IN ('
390 .
'SELECT DISTINCT ud.usr_id '
391 .
'FROM usr_data ud join rbac_ua ON (ud.usr_id = rbac_ua.usr_id) '
392 .
'JOIN object_data od ON (rbac_ua.rol_id = od.obj_id) '
393 .
"WHERE od.title = {$this->db->quote("il_{$cgtype}_member_{$this->crs_grp}
", ilDBConstants::T_TEXT)})"
397 if ($this->role > 0) {
398 $query = $query->withAdditionalWhere(
399 'usr_data.usr_id IN ('
400 .
'SELECT DISTINCT ud.usr_id '
401 .
'FROM usr_data ud join rbac_ua ON (ud.usr_id = rbac_ua.usr_id) '
402 .
"WHERE rbac_ua.rol_id = {$this->db->quote($this->role, ilDBConstants::T_INTEGER)})"
406 if ($this->user_folder !== []) {
407 $query = $query->withAdditionalWhere(
412 if ($this->authentication_method !==
'') {
413 $query = $query->withAdditionalWhere(
414 "usr_data.auth_mode = {$this->db->quote($this->authentication_method, ilDBConstants::T_TEXT)}"
418 return $this->profile_data_repository->getCountAndRecordsForQuery(
427 $direction = $this->order_dir ===
'desc' ?
'DESC' :
'ASC';
428 switch ($this->order_field) {
431 [
'active',
'time_limit_unlimited',
'time_limit_until'],
439 if (!in_array($this->order_field, array_merge(self::DEFAULT_FIELDS, $this->additional_fields))) {
440 $this->order_field =
'login';
443 if (in_array($this->order_field, self::DEFAULT_MULTI_FIELDS)
444 || str_starts_with($this->order_field,
'udf_')) {
477 string $a_order_field,
481 string $a_string_filter =
"",
482 string $a_activation_filter =
"",
484 bool $a_limited_access_filter =
false,
485 bool $a_no_courses_filter =
false,
486 int $a_course_group_filter = 0,
487 int $a_role_filter = 0,
488 ?array $a_user_folder_filter =
null,
489 ?array $a_additional_fields =
null,
490 ?array $a_user_filter =
null,
491 string $a_first_letter =
"",
492 string $a_authentication_filter =
""
496 $query->setOrderDirection($a_order_dir);
497 $query->setOffset($a_offset);
498 $query->setLimit($a_limit);
499 $query->setTextFilter($a_string_filter);
500 $query->setActionFilter($a_activation_filter);
501 $query->setLastLogin($a_last_login_filter);
502 $query->setLimitedAccessFilter($a_limited_access_filter);
503 $query->setNoCourseFilter($a_no_courses_filter);
504 $query->setCourseGroupFilter($a_course_group_filter);
505 $query->setRoleFilter($a_role_filter);
506 $query->setUserFolder($a_user_folder_filter);
507 $query->setAdditionalFields($a_additional_fields ?? []);
508 $query->setUserFilter($a_user_filter ?? []);
509 $query->setFirstLetterLastname($a_first_letter);
510 $query->setAuthenticationFilter($a_authentication_filter);
511 return $query->query();
withJoinedMultiDataTable()
withMultiDataTableOrder(string $order_field, string $direction)
withDefaultTableOrderFields(array $order_fields, string $direction)
withAdditionalTableOrder(string $order)
@classDescription Date and time handling
static _before(ilDateTime $start, ilDateTime $end, string $a_compare_field='', string $a_tz='')
compare two dates and check start is before end This method does not consider tz offsets.
static _lookupType(int $id, bool $reference=false)
const array DEFAULT_MULTI_FIELDS
setLimitedAccessFilter(bool $a_status)
Enable limited access filter.
setLastLogin(?ilDateTime $dt=null)
Set last login filter.
setCourseGroupFilter(int $a_cg_id)
Set course / group filter object_id of course or group.
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.
getUdfFilter()
Get udf filter.
setActionFilter(string $a_activation)
Set activation filter 'active' or 'inactive' or empty.
const DEFAULT_ORDER_FIELD
const array DEFAULT_FIELDS
setUdfFilter(array $filter_array)
Set udf filter.
addOrderToQuery(DataQuery $query)
setUserFilter(array $a_filter)
Array with user ids to query against.
setTextFilter(string $a_filter)
Text (like) filter in login, firstname, lastname or email.
addUdfFilterToQuery(DataQuery $query)
setFirstLetterLastname(string $a_fll)
set first letter lastname filter
string $authentication_method
setUserFolder(?array $user_folder_id)
Set user folder filter reference id of user folder or category (local user administration)
ProfileDataRepository $profile_data_repository
setAdditionalFields(array $additional_fields)
Set additional fields (columns in usr_data or 'online_time')
setRoleFilter(int $a_role_id)
Set role filter obj_id of role.
setAuthenticationFilter(string $a_authentication)
Set authentication filter.
ProfileFieldsConfigurationRepository $profile_fields_repository
setAccessFilter(bool $a_access)
set filter for user that are limited but has access
setNoCourseFilter(bool $a_no_course)
setOrderDirection(string $a_dir)
Set order direction 'asc' or 'desc' Default is 'asc'.
setOrderField(string $a_order)
Set order field (column in usr_data) Default order is 'login'.
setNoGroupFilter(bool $a_no_group)
__construct(Container $dic, ilPlugin $plugin)
@inheritDoc