19declare(strict_types=1);
65 "time_limit_unlimited",
77 $this->
lng = $DIC[
'lng'];
78 $this->profile_fields_repository = LocalDIC::dic()[ProfileFieldsConfigurationRepository::class];
87 $field_names = array_reduce(
88 $this->profile_fields_repository->get(),
89 function (array
$c, ProfileField $v): array {
90 if (!$v->isCustom()) {
93 $c[] = $v->getLabel($this->lng);
100 foreach ($filter_array as $udf_name => $udf_value) {
101 [, $udf_id] = explode(
'_', $udf_name);
102 if (in_array($udf_id, $field_names)) {
103 $valid_udfs[$udf_name] = $udf_value;
106 $this->udf_filter = $valid_udfs;
124 $this->order_field = $a_order;
134 $this->order_dir = $a_dir;
139 $this->offset = $a_offset;
144 $this->limit = $a_limit;
152 $this->text_filter = $a_filter;
161 $this->activation = $a_activation;
169 $this->last_login = $dt;
177 $this->limited_access = $a_status;
182 $this->no_courses = $a_no_course;
187 $this->no_groups = $a_no_group;
196 $this->crs_grp = $a_cg_id;
205 $this->role = $a_role_id;
214 $this->user_folder = $a_fold_id;
222 $this->additional_fields = $a_add;
230 $this->users = $a_filter;
238 $this->first_letter = $a_fll;
246 $this->has_access = $a_access;
255 $this->authentication_method = $a_authentication;
274 if (is_array($this->additional_fields)) {
275 foreach ($this->additional_fields as
$f) {
276 if (!in_array(
$f, $this->default_fields)) {
277 if (
$f ===
"online_time") {
278 $this->default_fields[] =
"ut_online.online_time";
279 $join =
" LEFT JOIN ut_online ON (usr_data.usr_id = ut_online.usr_id) ";
280 } elseif (
$f ===
'dpro_agreed_on') {
281 $this->default_fields[] =
'dpro.dpro_agreed_on';
282 $join =
' LEFT JOIN (SELECT value AS dpro_agreed_on, usr_id FROM usr_pref WHERE keyword = "dpro_agree_date") AS dpro' .
283 ' ON (usr_data.usr_id = dpro.usr_id)';
284 } elseif (substr(
$f, 0, 4) ===
"udf_") {
285 $udf_fields[] = (
int) substr(
$f, 4);
287 $this->default_fields[] =
$f;
296 foreach ($udf_fields as
$id) {
297 $join .=
" LEFT JOIN udf_clob ud_" .
$id .
" ON (ud_" .
$id .
".field_id=" .
$ilDB->quote(
$id) .
" AND ud_" .
$id .
".usr_id = usr_data.usr_id) ";
301 $count_query =
"SELECT count(usr_data.usr_id) cnt" .
304 $all_multi_fields = [
"interests_general",
"interests_help_offered",
"interests_help_looking"];
308 foreach ($this->default_fields as $idx => $field) {
313 if (in_array($field, $all_multi_fields)) {
314 $multi_fields[] = $field;
315 } elseif (strpos($field,
".") ===
false) {
316 $sql_fields[] =
"usr_data." . $field;
318 $sql_fields[] = $field;
323 foreach ($udf_fields as
$id) {
324 $sql_fields[] =
"ud_" .
$id .
".value udf_" .
$id;
328 $query =
"SELECT " . implode(
",", $sql_fields) .
332 $count_query .=
" " . $join;
338 $count_query .=
" WHERE 1 = 1 ";
340 if ($this->users && is_array(($this->users))) {
341 $query .=
' AND ' .
$ilDB->in(
'usr_data.usr_id', $this->users,
false,
'integer');
342 $count_user_filter =
$ilDB->in(
'usr_data.usr_id', $this->users,
false,
'integer');
345 $count_query .=
" AND " . $count_user_filter .
" ";
348 if ($this->first_letter !=
"") {
349 $add = $where .
" (" .
$ilDB->upper(
$ilDB->substr(
"usr_data.lastname", 1, 1)) .
" = " .
$ilDB->upper(
$ilDB->quote($this->first_letter,
"text")) .
") ";
351 $count_query .= $add;
355 if ($this->text_filter !=
"") {
356 $add = $where .
" (" .
$ilDB->like(
"usr_data.login",
"text",
"%" . $this->text_filter .
"%") .
" " .
357 "OR " .
$ilDB->like(
"usr_data.firstname",
"text",
"%" . $this->text_filter .
"%") .
" " .
358 "OR " .
$ilDB->like(
"usr_data.lastname",
"text",
"%" . $this->text_filter .
"%") .
" " .
359 "OR " .
$ilDB->like(
"usr_data.second_email",
"text",
"%" . $this->text_filter .
"%") .
" " .
360 "OR " .
$ilDB->like(
"usr_data.email",
"text",
"%" . $this->text_filter .
"%") .
") ";
362 $count_query .= $add;
366 if ($this->activation !=
"") {
367 if ($this->activation ===
"inactive") {
368 $add = $where .
" usr_data.active = " .
$ilDB->quote(0,
"integer") .
" ";
370 $add = $where .
" usr_data.active = " .
$ilDB->quote(1,
"integer") .
" ";
373 $count_query .= $add;
377 if ($this->last_login instanceof
ilDateTime) {
379 $add = $where .
" usr_data.last_login < " .
382 $count_query .= $add;
386 if ($this->limited_access) {
387 $add = $where .
" usr_data.time_limit_unlimited= " .
$ilDB->quote(0,
"integer");
389 $count_query .= $add;
396 $udf_id = explode(
'_', $k)[1];
397 $add =
"{$where} ud_{$udf_id}.value = {$ilDB->quote($f, 'text')}";
398 if ($udf_def[$udf_id][
'field_type'] === UDF_TYPE_TEXT) {
399 $add =
"{$where} {$ilDB->like("ud_{$udf_id}.value
", 'text', "%{
$f}%
")}";
402 $count_query .= $add;
407 if ($this->has_access) {
408 $unlimited =
"time_limit_unlimited = " .
$ilDB->quote(1,
'integer');
409 $from =
"time_limit_from < " .
$ilDB->quote(time(),
'integer');
410 $until =
"time_limit_until > " .
$ilDB->quote(time(),
'integer');
412 $add = $where .
' (' . $unlimited .
' OR (' . $from .
' AND ' . $until .
'))';
414 $count_query .= $add;
417 if ($this->no_courses) {
418 $add = $where .
" usr_data.usr_id NOT IN (" .
419 "SELECT DISTINCT ud.usr_id " .
420 "FROM usr_data ud join rbac_ua ON (ud.usr_id = rbac_ua.usr_id) " .
421 "JOIN object_data od ON (rbac_ua.rol_id = od.obj_id) " .
422 "JOIN rbac_fa ON (rbac_ua.rol_id = rbac_fa.rol_id) " .
423 "JOIN tree ON (rbac_fa.parent = tree.child) " .
424 "WHERE od.title LIKE 'il_crs_%' " .
425 "AND rbac_fa.assign = 'y' " .
426 "AND tree.tree > 0)";
428 $count_query .= $add;
431 if ($this->no_groups) {
432 $add = $where .
" usr_data.usr_id NOT IN (" .
433 "SELECT DISTINCT ud.usr_id " .
434 "FROM usr_data ud join rbac_ua ON (ud.usr_id = rbac_ua.usr_id) " .
435 "JOIN object_data od ON (rbac_ua.rol_id = od.obj_id) " .
436 "JOIN rbac_fa ON (rbac_ua.rol_id = rbac_fa.rol_id) " .
437 "JOIN tree ON (rbac_fa.parent = tree.child) " .
438 "WHERE od.title LIKE 'il_grp_%' " .
439 "AND rbac_fa.assign = 'y' " .
440 "AND tree.tree > 0)";
442 $count_query .= $add;
445 if ($this->crs_grp > 0) {
447 $add = $where .
" usr_data.usr_id IN (" .
448 "SELECT DISTINCT ud.usr_id " .
449 "FROM usr_data ud join rbac_ua ON (ud.usr_id = rbac_ua.usr_id) " .
450 "JOIN object_data od ON (rbac_ua.rol_id = od.obj_id) " .
451 "WHERE od.title = " .
$ilDB->quote(
"il_" . $cgtype .
"_member_" . $this->crs_grp,
"text") .
")";
453 $count_query .= $add;
456 if ($this->role > 0) {
457 $add = $where .
" usr_data.usr_id IN (" .
458 "SELECT DISTINCT ud.usr_id " .
459 "FROM usr_data ud join rbac_ua ON (ud.usr_id = rbac_ua.usr_id) " .
460 "WHERE rbac_ua.rol_id = " .
$ilDB->quote($this->role,
"integer") .
")";
462 $count_query .= $add;
466 if ($this->user_folder) {
467 $add = $where .
" " .
$ilDB->in(
'usr_data.time_limit_owner', $this->user_folder,
false,
'integer');
469 $count_query .= $add;
473 if ($this->authentication_method !=
"") {
474 $add = $where .
" usr_data.auth_mode = " .
$ilDB->quote($this->authentication_method,
"text") .
" ";
476 $count_query .= $add;
481 switch ($this->order_field) {
483 if ($this->order_dir ===
"desc") {
484 $query .=
" ORDER BY usr_data.active DESC, usr_data.time_limit_unlimited DESC, usr_data.time_limit_until DESC";
486 $query .=
" ORDER BY usr_data.active ASC, usr_data.time_limit_unlimited ASC, usr_data.time_limit_until ASC";
491 if ($this->order_dir ===
"desc") {
492 $query .=
" ORDER BY ut_online.online_time DESC";
494 $query .=
" ORDER BY ut_online.online_time ASC";
499 if ($this->order_dir !==
"asc" && $this->order_dir !==
"desc") {
500 $this->order_dir =
"asc";
502 if (substr($this->order_field, 0, 4) ===
"udf_") {
505 $query .=
" ORDER BY ud_" . ((
int) substr($this->order_field, 4)) .
".value " . strtoupper($this->order_dir);
507 $query .=
' ORDER BY ' . self::DEFAULT_ORDER_FIELD .
' ' . strtoupper($this->order_dir);
510 if (!in_array($this->order_field, $this->default_fields)) {
511 $this->order_field =
"login";
513 $query .=
" ORDER BY usr_data." . $this->order_field .
" " . strtoupper($this->order_dir);
519 $set =
$ilDB->query($count_query);
521 if ($rec =
$ilDB->fetchAssoc($set)) {
535 if (count($multi_fields)) {
540 $set =
$ilDB->query($query);
543 while ($rec =
$ilDB->fetchAssoc($set)) {
545 if (count($multi_fields)) {
546 $usr_ids[] = (
int) $rec[
"usr_id"];
551 if (count($multi_fields) && count($usr_ids)) {
553 $set =
$ilDB->query(
"SELECT * FROM usr_profile_data" .
554 " WHERE " .
$ilDB->in(
"usr_id", $usr_ids,
"",
"integer"));
555 while ($row =
$ilDB->fetchAssoc($set)) {
556 $usr_multi[(
int) $row[
"usr_id"]][$row[
"field_id"]][] = $row[
"value"];
558 foreach ($result as $idx => $item) {
559 if (isset($usr_multi[$item[
"usr_id"]])) {
560 $result[$idx] = array_merge($item, $usr_multi[(
int) $item[
"usr_id"]]);
564 return [
"cnt" => $cnt,
"set" => $result];
573 string $a_order_field,
577 string $a_string_filter =
"",
578 string $a_activation_filter =
"",
580 bool $a_limited_access_filter =
false,
581 bool $a_no_courses_filter =
false,
582 int $a_course_group_filter = 0,
583 int $a_role_filter = 0,
584 ?array $a_user_folder_filter =
null,
585 ?array $a_additional_fields =
null,
586 ?array $a_user_filter =
null,
587 string $a_first_letter =
"",
588 string $a_authentication_filter =
""
592 $query->setOrderDirection($a_order_dir);
593 $query->setOffset($a_offset);
594 $query->setLimit($a_limit);
595 $query->setTextFilter($a_string_filter);
596 $query->setActionFilter($a_activation_filter);
597 $query->setLastLogin($a_last_login_filter);
598 $query->setLimitedAccessFilter($a_limited_access_filter);
599 $query->setNoCourseFilter($a_no_courses_filter);
600 $query->setCourseGroupFilter($a_course_group_filter);
601 $query->setRoleFilter($a_role_filter);
602 $query->setUserFolder($a_user_folder_filter);
603 $query->setAdditionalFields($a_additional_fields ?? []);
604 $query->setUserFilter($a_user_filter ?? []);
605 $query->setFirstLetterLastname($a_first_letter);
606 $query->setAuthenticationFilter($a_authentication_filter);
607 return $query->query();
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
@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)
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.
setUserFolder(?array $a_fold_id)
Set user folder filter reference id of user folder or category (local user administration)
setActionFilter(string $a_activation)
Set activation filter 'active' or 'inactive' or empty.
const DEFAULT_ORDER_FIELD
setUdfFilter(array $filter_array)
Set udf filter.
setUserFilter(array $a_filter)
Array with user ids to query against.
setAdditionalFields(array $a_add)
Set additional fields (columns in usr_data or 'online_time')
setTextFilter(string $a_filter)
Text (like) filter in login, firstname, lastname or email.
setFirstLetterLastname(string $a_fll)
set first letter lastname filter
string $authentication_method
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