diff --git a/admin/classes/task_log_table.php b/admin/classes/task_log_table.php index 673e9a18ca4..c02458d9426 100644 --- a/admin/classes/task_log_table.php +++ b/admin/classes/task_log_table.php @@ -124,8 +124,9 @@ class task_log_table extends \table_sql { $sort = "ORDER BY $sort"; } - $extrafields = get_extra_user_fields(\context_system::instance()); - $userfields = \user_picture::fields('u', $extrafields, 'userid2', 'user'); + // TODO Does not support custom user profile fields (MDL-70456). + $userfieldsapi = \core\user_fields::for_identity(\context_system::instance(), false)->with_userpic(); + $userfields = $userfieldsapi->get_sql('u', false, 'user', 'userid2', false)->selects; $where = ''; if (!empty($this->sql->where)) { diff --git a/admin/roles/assign.php b/admin/roles/assign.php index eada1e9cc6b..17e6b65132e 100644 --- a/admin/roles/assign.php +++ b/admin/roles/assign.php @@ -271,7 +271,8 @@ if ($roleid) { foreach ($assignableroles as $roleid => $notused) { $roleusers = ''; if (0 < $assigncounts[$roleid] && $assigncounts[$roleid] <= MAX_USERS_TO_LIST_PER_ROLE) { - $userfields = 'u.id, u.username, ' . get_all_user_name_fields(true, 'u'); + $userfieldsapi = \core\user_fields::for_name(); + $userfields = 'u.id, u.username' . $userfieldsapi->get_sql('u')->selects; $roleusers = get_role_users($roleid, $context, false, $userfields); if (!empty($roleusers)) { $strroleusers = array(); diff --git a/admin/tool/cohortroles/classes/output/cohort_role_assignments_table.php b/admin/tool/cohortroles/classes/output/cohort_role_assignments_table.php index 496a4acca3d..630f8a883c7 100644 --- a/admin/tool/cohortroles/classes/output/cohort_role_assignments_table.php +++ b/admin/tool/cohortroles/classes/output/cohort_role_assignments_table.php @@ -126,7 +126,8 @@ class cohort_role_assignments_table extends table_sql { * Setup the headers for the table. */ protected function define_table_columns() { - $extrafields = get_extra_user_fields($this->context); + // TODO Does not support custom user profile fields (MDL-70456). + $extrafields = \core\user_fields::get_identity_fields($this->context, false); // Define headers and columns. $cols = array( @@ -170,14 +171,12 @@ class cohort_role_assignments_table extends table_sql { protected function get_sql_and_params($count = false) { $fields = 'uca.id, uca.cohortid, uca.userid, uca.roleid, '; $fields .= 'c.name as cohortname, c.idnumber as cohortidnumber, c.contextid as cohortcontextid, '; - $fields .= 'c.visible as cohortvisible, c.description as cohortdescription, c.theme as cohorttheme, '; + $fields .= 'c.visible as cohortvisible, c.description as cohortdescription, c.theme as cohorttheme'; // Add extra user fields that we need for the graded user. - $extrafields = get_extra_user_fields($this->context); - foreach ($extrafields as $field) { - $fields .= 'u.' . $field . ', '; - } - $fields .= get_all_user_name_fields(true, 'u'); + // TODO Does not support custom user profile fields (MDL-70456). + $userfieldsapi = \core\user_fields::for_identity($this->context, false)->with_name(); + $fields .= $userfieldsapi->get_sql('u')->selects; if ($count) { $select = "COUNT(1)"; diff --git a/admin/tool/dataprivacy/classes/api.php b/admin/tool/dataprivacy/classes/api.php index 906dcb5efba..ceaee01a9bb 100644 --- a/admin/tool/dataprivacy/classes/api.php +++ b/admin/tool/dataprivacy/classes/api.php @@ -189,7 +189,8 @@ class api { $dpos = []; $context = context_system::instance(); foreach ($dporoles as $roleid) { - $allnames = get_all_user_name_fields(true, 'u'); + $userfieldsapi = \core\user_fields::for_name(); + $allnames = $userfieldsapi->get_sql('u', false, '', '', false)->selects; $fields = 'u.id, u.confirmed, u.username, '. $allnames . ', ' . 'u.maildisplay, u.mailformat, u.maildigest, u.email, u.emailstop, u.city, '. 'u.country, u.picture, u.idnumber, u.department, u.institution, '. diff --git a/admin/tool/dataprivacy/classes/external.php b/admin/tool/dataprivacy/classes/external.php index 7306eb20d9d..c2ab73195dd 100644 --- a/admin/tool/dataprivacy/classes/external.php +++ b/admin/tool/dataprivacy/classes/external.php @@ -700,13 +700,15 @@ class external extends external_api { self::validate_context($context); require_capability('tool/dataprivacy:managedatarequests', $context); - $allusernames = get_all_user_name_fields(true); + $userfieldsapi = \core\user_fields::for_name(); + $allusernames = $userfieldsapi->get_sql('', false, '', '', false)->selects; // Exclude admins and guest user. $excludedusers = array_keys(get_admins()) + [guest_user()->id]; $sort = 'lastname ASC, firstname ASC'; $fields = 'id,' . $allusernames; - $extrafields = get_extra_user_fields($context); + // TODO Does not support custom user profile fields (MDL-70456). + $extrafields = \core\user_fields::get_identity_fields($context, false); if (!empty($extrafields)) { $fields .= ',' . implode(',', $extrafields); } diff --git a/admin/tool/dataprivacy/classes/local/helper.php b/admin/tool/dataprivacy/classes/local/helper.php index 14d68f72a1b..b34cb8f11a5 100644 --- a/admin/tool/dataprivacy/classes/local/helper.php +++ b/admin/tool/dataprivacy/classes/local/helper.php @@ -187,7 +187,8 @@ class helper { global $DB; // Get users that the user has role assignments to. - $allusernames = get_all_user_name_fields(true, 'u'); + $userfieldsapi = \core\user_fields::for_name(); + $allusernames = $userfieldsapi->get_sql('u', false, '', '', false)->selects; $sql = "SELECT u.id, $allusernames FROM {role_assignments} ra, {context} c, {user} u WHERE ra.userid = :userid diff --git a/admin/tool/dataprivacy/createdatarequest_form.php b/admin/tool/dataprivacy/createdatarequest_form.php index c708a8857ef..39c3e3c34d0 100644 --- a/admin/tool/dataprivacy/createdatarequest_form.php +++ b/admin/tool/dataprivacy/createdatarequest_form.php @@ -62,7 +62,8 @@ class tool_dataprivacy_data_request_form extends \core\form\persistent { 'valuehtmlcallback' => function($value) { global $OUTPUT; - $allusernames = get_all_user_name_fields(true); + $userfieldsapi = \core\user_fields::for_name(); + $allusernames = $userfieldsapi->get_sql('', false, '', '', false)->selects; $fields = 'id, email, ' . $allusernames; $user = \core_user::get_user($value, $fields); $useroptiondata = [ diff --git a/admin/tool/lp/classes/external.php b/admin/tool/lp/classes/external.php index 597cb0abc05..0264bd0e5cc 100644 --- a/admin/tool/lp/classes/external.php +++ b/admin/tool/lp/classes/external.php @@ -879,8 +879,9 @@ class external extends external_api { $USER->id, SQL_PARAMS_NAMED); // TODO Does not support custom user profile fields (MDL-70456). - $extrasearchfields = \core\user_fields::get_identity_fields($context, false); - $fields = \user_picture::fields('u', $extrasearchfields); + $userfieldsapi = \core\user_fields::for_identity($context, false)->with_userpic(); + $fields = $userfieldsapi->get_sql('u', false, '', '', false)->selects; + $extrasearchfields = $userfieldsapi->get_required_fields([\core\user_fields::PURPOSE_IDENTITY]); list($wheresql, $whereparams) = users_search_sql($query, 'u', true, $extrasearchfields); list($sortsql, $sortparams) = users_order_by_sql('u', $query, $context); diff --git a/admin/tool/lp/classes/output/template_plans_table.php b/admin/tool/lp/classes/output/template_plans_table.php index 422e62af9ea..ba171163a33 100644 --- a/admin/tool/lp/classes/output/template_plans_table.php +++ b/admin/tool/lp/classes/output/template_plans_table.php @@ -92,7 +92,8 @@ class template_plans_table extends table_sql { * Setup the headers for the table. */ protected function define_table_columns() { - $extrafields = get_extra_user_fields($this->context); + // TODO Does not support custom user profile fields (MDL-70456). + $extrafields = \core\user_fields::get_identity_fields($this->context, false); // Define headers and columns. $cols = array( @@ -132,14 +133,12 @@ class template_plans_table extends table_sql { * @return array containing sql to use and an array of params. */ protected function get_sql_and_params($count = false) { - $fields = 'p.id, p.userid, p.name, '; + $fields = 'p.id, p.userid, p.name'; // Add extra user fields that we need for the graded user. - $extrafields = get_extra_user_fields($this->context); - foreach ($extrafields as $field) { - $fields .= 'u.' . $field . ', '; - } - $fields .= get_all_user_name_fields(true, 'u'); + // TODO Does not support custom user profile fields (MDL-70456). + $userfieldsapi = \core\user_fields::for_identity($this->context, false)->with_name(); + $fields .= $userfieldsapi->get_sql('u')->selects; if ($count) { $select = "COUNT(1)"; diff --git a/admin/tool/policy/classes/acceptances_table.php b/admin/tool/policy/classes/acceptances_table.php index b12cae1fa7f..b4492bcb4b8 100644 --- a/admin/tool/policy/classes/acceptances_table.php +++ b/admin/tool/policy/classes/acceptances_table.php @@ -91,8 +91,10 @@ class acceptances_table extends \table_sql { } } - $extrafields = get_extra_user_fields(\context_system::instance()); - $userfields = \user_picture::fields('u', $extrafields); + // TODO Does not support custom user profile fields (MDL-70456). + $userfieldsapi = \core\user_fields::for_identity(\context_system::instance(), false)->with_userpic(); + $userfields = $userfieldsapi->get_sql('u', false, '', '', false)->selects; + $extrafields = $userfieldsapi->get_required_fields([\core\user_fields::PURPOSE_IDENTITY]); $this->set_sql("$userfields", "{user} u", @@ -103,7 +105,7 @@ class acceptances_table extends \table_sql { } $this->add_column_header('fullname', get_string('fullnameuser', 'core')); foreach ($extrafields as $field) { - $this->add_column_header($field, get_user_field_name($field)); + $this->add_column_header($field, \core\user_fields::get_display_name($field)); } if (!$this->is_downloading() && !has_capability('tool/policy:acceptbehalf', \context_system::instance())) { @@ -168,7 +170,8 @@ class acceptances_table extends \table_sql { * Helper configuration method. */ protected function configure_for_single_version() { - $userfieldsmod = get_all_user_name_fields(true, 'm', null, 'mod'); + $userfieldsapi = \core\user_fields::for_name(); + $userfieldsmod = $userfieldsapi->get_sql('m', false, 'mod', '', false)->selects; $v = key($this->versionids); $this->sql->fields .= ", $userfieldsmod, a{$v}.status AS status{$v}, a{$v}.note, ". "a{$v}.timemodified, a{$v}.usermodified AS usermodified{$v}"; @@ -643,4 +646,4 @@ class acceptances_table extends \table_sql { } return parent::other_cols($column, $row); } -} \ No newline at end of file +} diff --git a/admin/tool/policy/classes/api.php b/admin/tool/policy/classes/api.php index 46a01c80411..5366daa5152 100644 --- a/admin/tool/policy/classes/api.php +++ b/admin/tool/policy/classes/api.php @@ -343,10 +343,10 @@ class api { global $DB; $ctxfields = context_helper::get_preload_record_columns_sql('c'); - $namefields = get_all_user_name_fields(true, 'u'); - $pixfields = user_picture::fields('u', $extrafields); + $userfieldsapi = \core\user_fields::for_name()->with_userpic()->including(...($extrafields ?? [])); + $userfields = $userfieldsapi->get_sql('u')->selects; - $sql = "SELECT $ctxfields, $namefields, $pixfields + $sql = "SELECT $ctxfields $userfields FROM {role_assignments} ra JOIN {context} c ON c.contextlevel = ".CONTEXT_USER." AND ra.contextid = c.id JOIN {user} u ON c.instanceid = u.id @@ -682,7 +682,8 @@ class api { $vsql = ' AND a.policyversionid ' . $vsql; } - $userfieldsmod = get_all_user_name_fields(true, 'm', null, 'mod'); + $userfieldsapi = \core\user_fields::for_name(); + $userfieldsmod = $userfieldsapi->get_sql('m', false, 'mod', '', false)->selects; $sql = "SELECT u.id AS mainuserid, a.policyversionid, a.status, a.lang, a.timemodified, a.usermodified, a.note, u.policyagreed, $userfieldsmod FROM {user} u diff --git a/admin/tool/policy/classes/form/accept_policy.php b/admin/tool/policy/classes/form/accept_policy.php index d385b2b33a9..6821daac8c5 100644 --- a/admin/tool/policy/classes/form/accept_policy.php +++ b/admin/tool/policy/classes/form/accept_policy.php @@ -128,7 +128,8 @@ class accept_policy extends \moodleform { $usernames = []; list($sql, $params) = $DB->get_in_or_equal($userids, SQL_PARAMS_NAMED); $params['usercontextlevel'] = CONTEXT_USER; - $users = $DB->get_records_sql("SELECT u.id, " . get_all_user_name_fields(true, 'u') . ", " . + $userfieldsapi = \core\user_fields::for_name(); + $users = $DB->get_records_sql("SELECT u.id" . $userfieldsapi->get_sql('u')->selects . ", " . \context_helper::get_preload_record_columns_sql('ctx') . " FROM {user} u JOIN {context} ctx ON ctx.contextlevel=:usercontextlevel AND ctx.instanceid = u.id WHERE u.id " . $sql, $params); diff --git a/admin/tool/uploaduser/classes/process.php b/admin/tool/uploaduser/classes/process.php index 5321f0e5fab..cde592919ae 100644 --- a/admin/tool/uploaduser/classes/process.php +++ b/admin/tool/uploaduser/classes/process.php @@ -155,7 +155,7 @@ class process { 'interests', ); // Include all name fields. - $this->standardfields = array_merge($this->standardfields, get_all_user_name_fields()); + $this->standardfields = array_merge($this->standardfields, \core\user_fields::get_name_fields()); } /** diff --git a/admin/user.php b/admin/user.php index a06b2edc047..0f0eec9582b 100644 --- a/admin/user.php +++ b/admin/user.php @@ -183,13 +183,15 @@ // These columns are always shown in the users list. $requiredcolumns = array('city', 'country', 'lastaccess'); // Extra columns containing the extra user fields, excluding the required columns (city and country, to be specific). - $extracolumns = get_extra_user_fields($context, $requiredcolumns); - // Get all user name fields as an array. - $allusernamefields = get_all_user_name_fields(false, null, null, null, true); + // TODO Does not support custom user profile fields (MDL-70456). + $userfields = \core\user_fields::for_identity($context, false)->excluding(...$requiredcolumns); + $extracolumns = $userfields->get_required_fields(); + // Get all user name fields as an array, but with firstname and lastname first. + $allusernamefields = \core\user_fields::get_name_fields(true); $columns = array_merge($allusernamefields, $extracolumns, $requiredcolumns); foreach ($columns as $column) { - $string[$column] = get_user_field_name($column); + $string[$column] = \core\user_fields::get_display_name($column); if ($sort != $column) { $columnicon = ""; if ($column == "lastaccess") { diff --git a/admin/user/user_bulk_cohortadd.php b/admin/user/user_bulk_cohortadd.php index f5e39475835..ab05021b6a8 100644 --- a/admin/user/user_bulk_cohortadd.php +++ b/admin/user/user_bulk_cohortadd.php @@ -64,7 +64,8 @@ if (count($cohorts) < 2) { } $countries = get_string_manager()->get_list_of_countries(true); -$namefields = get_all_user_name_fields(true); +$userfieldsapi = \core\user_fields::for_name(); +$namefields = $userfieldsapi->get_sql('', false, '', '', false)->selects; foreach ($users as $key => $id) { $user = $DB->get_record('user', array('id' => $id), 'id, ' . $namefields . ', username, email, country, lastaccess, city, deleted'); diff --git a/admin/user/user_bulk_display.php b/admin/user/user_bulk_display.php index ae6cd8a5395..146f4c7dd5d 100644 --- a/admin/user/user_bulk_display.php +++ b/admin/user/user_bulk_display.php @@ -24,7 +24,8 @@ echo $OUTPUT->header(); $countries = get_string_manager()->get_list_of_countries(true); -$namefields = get_all_user_name_fields(true); +$userfieldsapi = \core\user_fields::for_name(); +$namefields = $userfieldsapi->get_sql('', false, '', '', false)->selects; foreach ($users as $key => $id) { $user = $DB->get_record('user', array('id'=>$id), 'id, ' . $namefields . ', username, email, country, lastaccess, city'); $user->fullname = fullname($user, true); diff --git a/admin/webservice/forms.php b/admin/webservice/forms.php index 08ff31a2c3d..c958661e347 100644 --- a/admin/webservice/forms.php +++ b/admin/webservice/forms.php @@ -241,7 +241,8 @@ class web_service_token_form extends moodleform { if ($usertotal < 500) { list($sort, $params) = users_order_by_sql('u'); // User searchable selector - return users who are confirmed, not deleted, not suspended and not a guest. - $sql = 'SELECT u.id, ' . get_all_user_name_fields(true, 'u') . ' + $userfieldsapi = \core\user_fields::for_name(); + $sql = 'SELECT u.id' . $userfieldsapi->get_sql('u')->selects . ' FROM {user} u WHERE u.deleted = 0 AND u.confirmed = 1 diff --git a/availability/condition/profile/classes/condition.php b/availability/condition/profile/classes/condition.php index 106f74cac63..ce65bb0224f 100644 --- a/availability/condition/profile/classes/condition.php +++ b/availability/condition/profile/classes/condition.php @@ -197,7 +197,7 @@ class condition extends \core_availability\condition { $this->customfield); } } else { - $translatedfieldname = get_user_field_name($this->standardfield); + $translatedfieldname = \core\user_fields::get_display_name($this->standardfield); } $context = \context_course::instance($course->id); $a = new \stdClass(); diff --git a/availability/condition/profile/classes/frontend.php b/availability/condition/profile/classes/frontend.php index 373c9a1984a..e5026e57738 100644 --- a/availability/condition/profile/classes/frontend.php +++ b/availability/condition/profile/classes/frontend.php @@ -44,23 +44,23 @@ class frontend extends \core_availability\frontend { \section_info $section = null) { // Standard user fields. $standardfields = array( - 'firstname' => get_user_field_name('firstname'), - 'lastname' => get_user_field_name('lastname'), - 'email' => get_user_field_name('email'), - 'city' => get_user_field_name('city'), - 'country' => get_user_field_name('country'), - 'url' => get_user_field_name('url'), - 'icq' => get_user_field_name('icq'), - 'skype' => get_user_field_name('skype'), - 'aim' => get_user_field_name('aim'), - 'yahoo' => get_user_field_name('yahoo'), - 'msn' => get_user_field_name('msn'), - 'idnumber' => get_user_field_name('idnumber'), - 'institution' => get_user_field_name('institution'), - 'department' => get_user_field_name('department'), - 'phone1' => get_user_field_name('phone1'), - 'phone2' => get_user_field_name('phone2'), - 'address' => get_user_field_name('address') + 'firstname' => \core\user_fields::get_display_name('firstname'), + 'lastname' => \core\user_fields::get_display_name('lastname'), + 'email' => \core\user_fields::get_display_name('email'), + 'city' => \core\user_fields::get_display_name('city'), + 'country' => \core\user_fields::get_display_name('country'), + 'url' => \core\user_fields::get_display_name('url'), + 'icq' => \core\user_fields::get_display_name('icq'), + 'skype' => \core\user_fields::get_display_name('skype'), + 'aim' => \core\user_fields::get_display_name('aim'), + 'yahoo' => \core\user_fields::get_display_name('yahoo'), + 'msn' => \core\user_fields::get_display_name('msn'), + 'idnumber' => \core\user_fields::get_display_name('idnumber'), + 'institution' => \core\user_fields::get_display_name('institution'), + 'department' => \core\user_fields::get_display_name('department'), + 'phone1' => \core\user_fields::get_display_name('phone1'), + 'phone2' => \core\user_fields::get_display_name('phone2'), + 'address' => \core\user_fields::get_display_name('address') ); \core_collator::asort($standardfields); diff --git a/backup/moodle2/backup_stepslib.php b/backup/moodle2/backup_stepslib.php index 2f47e5c9e58..55e35cfe578 100644 --- a/backup/moodle2/backup_stepslib.php +++ b/backup/moodle2/backup_stepslib.php @@ -1368,7 +1368,7 @@ class backup_users_structure_step extends backup_structure_step { 'phone2', 'institution', 'department', 'address', 'city', 'country', 'lastip', 'picture', 'url', 'description', 'descriptionformat', 'imagealt', 'auth'); - $anonfields = array_merge($anonfields, get_all_user_name_fields()); + $anonfields = array_merge($anonfields, \core\user_fields::get_name_fields()); // Add anonymized fields to $userfields with custom final element foreach ($anonfields as $field) { diff --git a/badges/classes/output/external_badge.php b/badges/classes/output/external_badge.php index e992d9dbf72..f56bde0f870 100644 --- a/badges/classes/output/external_badge.php +++ b/badges/classes/output/external_badge.php @@ -58,7 +58,8 @@ class external_badge implements renderable { global $DB; // At this point a user has connected a backpack. So, we are going to get // their backpack email rather than their account email. - $namefields = get_all_user_name_fields(true, 'u'); + $userfieldsapi = \core\user_fields::for_name(); + $namefields = $userfieldsapi->get_sql('u', false, '', '', false)->selects; $user = $DB->get_record_sql("SELECT {$namefields}, b.email FROM {user} u INNER JOIN {badge_backpack} b ON u.id = b.userid WHERE b.userid = :userid", array('userid' => $recipient), IGNORE_MISSING); diff --git a/badges/classes/output/issued_badge.php b/badges/classes/output/issued_badge.php index bc70d3bbbf9..c3ce9a9d3c3 100644 --- a/badges/classes/output/issued_badge.php +++ b/badges/classes/output/issued_badge.php @@ -76,7 +76,8 @@ class issued_badge implements renderable { array('hash' => $hash), IGNORE_MISSING); if ($rec) { // Get a recipient from database. - $namefields = get_all_user_name_fields(true, 'u'); + $userfieldsapi = \core\user_fields::for_name(); + $namefields = $userfieldsapi->get_sql('u', false, '', '', false)->selects; $user = $DB->get_record_sql("SELECT u.id, $namefields, u.deleted, u.email FROM {user} u WHERE u.id = :userid", array('userid' => $rec->userid)); $this->recipient = $user; diff --git a/badges/criteria/award_criteria_profile.php b/badges/criteria/award_criteria_profile.php index da76bc87474..bd887db96d1 100644 --- a/badges/criteria/award_criteria_profile.php +++ b/badges/criteria/award_criteria_profile.php @@ -88,7 +88,7 @@ class award_criteria_profile extends award_criteria { if (in_array($field, $existing)) { $checked = true; } - $this->config_options($mform, array('id' => $field, 'checked' => $checked, 'name' => get_user_field_name($field), 'error' => false)); + $this->config_options($mform, array('id' => $field, 'checked' => $checked, 'name' => \core\user_fields::get_display_name($field), 'error' => false)); $none = false; } } @@ -138,7 +138,7 @@ class award_criteria_profile extends award_criteria { if (is_numeric($p['field'])) { $str = $DB->get_field('user_info_field', 'name', array('id' => $p['field'])); } else { - $str = get_user_field_name($p['field']); + $str = \core\user_fields::get_display_name($p['field']); } if (!$str) { $output[] = $OUTPUT->error_text(get_string('error:nosuchfield', 'badges')); diff --git a/badges/recipients.php b/badges/recipients.php index 0dce38df78c..7f1e75f5c31 100644 --- a/badges/recipients.php +++ b/badges/recipients.php @@ -87,7 +87,8 @@ if ($badge->has_manual_award_criteria() && has_capability('moodle/badges:awardba echo $OUTPUT->box($OUTPUT->single_button($url, get_string('award', 'badges')), 'clearfix mdl-align'); } -$namefields = get_all_user_name_fields(true, 'u'); +$userfieldsapi = \core\user_fields::for_name(); +$namefields = $userfieldsapi->get_sql('u', false, '', '', false)->selects; $sql = "SELECT b.userid, b.dateissued, b.uniquehash, $namefields FROM {badge_issued} b INNER JOIN {user} u ON b.userid = u.id diff --git a/blocks/activity_results/block_activity_results.php b/blocks/activity_results/block_activity_results.php index fd33925156d..7c19e4ca4d8 100644 --- a/blocks/activity_results/block_activity_results.php +++ b/blocks/activity_results/block_activity_results.php @@ -508,12 +508,12 @@ class block_activity_results extends block_base { // Now grab all the users from the database. $userids = array_merge(array_keys($best), array_keys($worst)); - $fields = array_merge(array('id', 'idnumber'), get_all_user_name_fields()); + $fields = array_merge(array('id', 'idnumber'), \core\user_fields::get_name_fields()); $fields = implode(',', $fields); $users = $DB->get_records_list('user', 'id', $userids, '', $fields); // If configured to view user idnumber, ensure current user can see it. - $extrafields = get_extra_user_fields($this->context); + $extrafields = \core\user_fields::for_identity($this->context)->get_required_fields(); $canviewidnumber = (array_search('idnumber', $extrafields) !== false); // Ready for output! diff --git a/blocks/mentees/block_mentees.php b/blocks/mentees/block_mentees.php index ff326308ef4..9ad847ce23c 100644 --- a/blocks/mentees/block_mentees.php +++ b/blocks/mentees/block_mentees.php @@ -50,7 +50,8 @@ class block_mentees extends block_base { $this->content = new stdClass(); // get all the mentees, i.e. users you have a direct assignment to - $allusernames = get_all_user_name_fields(true, 'u'); + $userfieldsapi = \core\user_fields::for_name(); + $allusernames = $userfieldsapi->get_sql('u', false, '', '', false)->selects; if ($usercontexts = $DB->get_records_sql("SELECT c.instanceid, c.instanceid, $allusernames FROM {role_assignments} ra, {context} c, {user} u WHERE ra.userid = ? diff --git a/blocks/online_users/classes/fetcher.php b/blocks/online_users/classes/fetcher.php index a63e0ec73dc..c6777d2d850 100644 --- a/blocks/online_users/classes/fetcher.php +++ b/blocks/online_users/classes/fetcher.php @@ -86,7 +86,8 @@ class fetcher { } $params = array(); - $userfields = \user_picture::fields('u', array('username', 'deleted')); + $userfieldsapi = \core\user_fields::for_userpic()->including('username', 'deleted'); + $userfields = $userfieldsapi->get_sql('u', false, '', '', false)->selects; // Add this to the SQL to show only group users. if ($currentgroup !== null) { diff --git a/blog/locallib.php b/blog/locallib.php index 40af88d431e..c6d111cea76 100644 --- a/blog/locallib.php +++ b/blog/locallib.php @@ -646,8 +646,8 @@ class blog_listing { if (!$userid) { $userid = $USER->id; } - - $allnamefields = \user_picture::fields('u', null, 'useridalias'); + $userfieldsapi = \core\user_fields::for_userpic(); + $allnamefields = $userfieldsapi->get_sql('u', false, '', 'useridalias', false)->selects; // The query used to locate blog entries is complicated. It will be built from the following components: $requiredfields = "p.*, $allnamefields"; // The SELECT clause. $tables = array('p' => 'post', 'u' => 'user'); // Components of the FROM clause (table_id => table_name). diff --git a/blog/rsslib.php b/blog/rsslib.php index 37d1968e702..878f7a71cbf 100644 --- a/blog/rsslib.php +++ b/blog/rsslib.php @@ -234,7 +234,9 @@ function blog_rss_get_feed($context, $args) { switch ($type) { case 'user': - $info = fullname($DB->get_record('user', array('id' => $id), get_all_user_name_fields(true))); + $userfieldsapi = \core\user_fields::for_name(); + $info = fullname($DB->get_record('user', array('id' => $id), + $userfieldsapi->get_sql('', false, '', '', false)->selects)); break; case 'course': $info = $DB->get_field('course', 'fullname', array('id' => $id)); diff --git a/comment/lib.php b/comment/lib.php index 65d81e30cbd..f9d5cffbb72 100644 --- a/comment/lib.php +++ b/comment/lib.php @@ -551,7 +551,8 @@ class comment { $params = array(); $perpage = (!empty($CFG->commentsperpage))?$CFG->commentsperpage:15; $start = $page * $perpage; - $ufields = user_picture::fields('u'); + $userfieldsapi = \core\user_fields::for_userpic(); + $ufields = $userfieldsapi->get_sql('u', false, '', '', false)->selects; list($componentwhere, $component) = $this->get_component_select_sql('c'); if ($component) { diff --git a/comment/locallib.php b/comment/locallib.php index 512ff49e80c..0fb00f95a39 100644 --- a/comment/locallib.php +++ b/comment/locallib.php @@ -61,7 +61,8 @@ class comment_manager { } $comments = array(); - $usernamefields = get_all_user_name_fields(true, 'u'); + $userfieldsapi = \core\user_fields::for_name(); + $usernamefields = $userfieldsapi->get_sql('u', false, '', '', false)->selects; $sql = "SELECT c.id, c.contextid, c.itemid, c.component, c.commentarea, c.userid, c.content, $usernamefields, c.timecreated FROM {comments} c JOIN {user} u @@ -75,7 +76,7 @@ class comment_manager { $item->time = userdate($item->timecreated); $item->content = format_text($item->content, FORMAT_MOODLE, $formatoptions); // Unset fields not related to the comment - foreach (get_all_user_name_fields() as $namefield) { + foreach (\core\user_fields::get_name_fields() as $namefield) { unset($item->$namefield); } unset($item->timecreated); diff --git a/course/classes/category.php b/course/classes/category.php index 187f85123ed..e538368e02e 100644 --- a/course/classes/category.php +++ b/course/classes/category.php @@ -1033,7 +1033,8 @@ class core_course_category implements renderable, cacheable_object, IteratorAggr list($sql2, $params2) = $DB->get_in_or_equal($managerroles, SQL_PARAMS_NAMED, 'rid'); list($sort, $sortparams) = users_order_by_sql('u'); $notdeleted = array('notdeleted' => 0); - $allnames = get_all_user_name_fields(true, 'u'); + $userfieldsapi = \core\user_fields::for_name(); + $allnames = $userfieldsapi->get_sql('u', false, '', '', false)->selects; $sql = "SELECT ra.contextid, ra.id AS raid, r.id AS roleid, r.name AS rolename, r.shortname AS roleshortname, rn.name AS rolecoursealias, u.id, u.username, $allnames diff --git a/course/recent_form.php b/course/recent_form.php index d3056ea9fa5..b4c870dbb65 100644 --- a/course/recent_form.php +++ b/course/recent_form.php @@ -77,9 +77,12 @@ class recent_form extends moodleform { $options[0] = get_string('allparticipants'); $options[$CFG->siteguest] = get_string('guestuser'); + $userfieldsapi = \core\user_fields::for_userpic(); + $ufields = $userfieldsapi->get_sql('u', false, '', '', false)->selects; + if (isset($groupoptions[0])) { // can see all enrolled users - if ($enrolled = get_enrolled_users($context, null, 0, user_picture::fields('u'))) { + if ($enrolled = get_enrolled_users($context, null, 0, $ufields)) { foreach ($enrolled as $euser) { $options[$euser->id] = fullname($euser, $viewfullnames); } @@ -87,7 +90,7 @@ class recent_form extends moodleform { } else { // can see users from some groups only foreach ($groupoptions as $groupid=>$unused) { - if ($enrolled = get_enrolled_users($context, null, $groupid, user_picture::fields('u'))) { + if ($enrolled = get_enrolled_users($context, null, $groupid, $ufields)) { foreach ($enrolled as $euser) { if (!array_key_exists($euser->id, $options)) { $options[$euser->id] = fullname($euser, $viewfullnames); diff --git a/enrol/ajax.php b/enrol/ajax.php index 4134c397280..1bd9cc4465c 100644 --- a/enrol/ajax.php +++ b/enrol/ajax.php @@ -94,7 +94,8 @@ switch ($action) { $search = optional_param('search', '', PARAM_RAW); $page = optional_param('page', 0, PARAM_INT); $outcome->response = $manager->search_other_users($search, $searchanywhere, $page); - $extrafields = get_extra_user_fields($context); + // TODO Does not support custom user profile fields (MDL-70456). + $extrafields = \core\user_fields::get_identity_fields($context, false); $useroptions = array(); // User is not enrolled, either link to site profile or do not link at all. if (has_capability('moodle/user:viewdetails', context_system::instance())) { diff --git a/enrol/externallib.php b/enrol/externallib.php index 8281f3cc6aa..e2cfb216587 100644 --- a/enrol/externallib.php +++ b/enrol/externallib.php @@ -560,7 +560,8 @@ class core_enrol_external extends external_api { // Add also extra user fields. $requiredfields = array_merge( ['id', 'fullname', 'profileimageurl', 'profileimageurlsmall'], - get_extra_user_fields($context) + // TODO Does not support custom user profile fields (MDL-70456). + \core\user_fields::get_identity_fields($context, false) ); foreach ($users['users'] as $id => $user) { // Note: We pass the course here to validate that the current user can at least view user details in this course. @@ -652,7 +653,8 @@ class core_enrol_external extends external_api { // Add also extra user fields. $requiredfields = array_merge( ['id', 'fullname', 'profileimageurl', 'profileimageurlsmall'], - get_extra_user_fields($context) + // TODO Does not support custom user profile fields (MDL-70456). + \core\user_fields::get_identity_fields($context, false) ); foreach ($users['users'] as $user) { if ($userdetails = user_get_user_details($user, $course, $requiredfields)) { diff --git a/enrol/locallib.php b/enrol/locallib.php index 0a46f0f02ef..cd6f9fd8788 100644 --- a/enrol/locallib.php +++ b/enrol/locallib.php @@ -238,7 +238,8 @@ class course_enrolment_manager { list($instancessql, $params, $filter) = $this->get_instance_sql(); list($filtersql, $moreparams) = $this->get_filter_sql(); $params += $moreparams; - $extrafields = get_extra_user_fields($this->get_context()); + // TODO Does not support custom user profile fields (MDL-70456). + $extrafields = \core\user_fields::get_identity_fields($this->get_context(), false); $extrafields[] = 'lastaccess'; $ufields = user_picture::fields('u', $extrafields); $sql = "SELECT DISTINCT $ufields, COALESCE(ul.timeaccess, 0) AS lastcourseaccess @@ -268,7 +269,8 @@ class course_enrolment_manager { global $DB; // Search condition. - $extrafields = get_extra_user_fields($this->get_context()); + // TODO Does not support custom user profile fields (MDL-70456). + $extrafields = \core\user_fields::get_identity_fields($this->get_context(), false); list($sql, $params) = users_search_sql($this->searchfilter, 'u', true, $extrafields); // Role condition. @@ -341,7 +343,8 @@ class course_enrolment_manager { list($ctxcondition, $params) = $DB->get_in_or_equal($this->context->get_parent_context_ids(true), SQL_PARAMS_NAMED, 'ctx'); $params['courseid'] = $this->course->id; $params['cid'] = $this->course->id; - $extrafields = get_extra_user_fields($this->get_context()); + // TODO Does not support custom user profile fields (MDL-70456). + $extrafields = \core\user_fields::get_identity_fields($this->get_context(), false); $ufields = user_picture::fields('u', $extrafields); $sql = "SELECT ra.id as raid, ra.contextid, ra.component, ctx.contextlevel, ra.roleid, $ufields, coalesce(u.lastaccess,0) AS lastaccess @@ -379,8 +382,9 @@ class course_enrolment_manager { $tests = array("u.id <> :guestid", 'u.deleted = 0', 'u.confirmed = 1'); $params = array('guestid' => $CFG->siteguest); if (!empty($search)) { - $conditions = get_extra_user_fields($this->get_context()); - foreach (get_all_user_name_fields() as $field) { + // TODO Does not support custom user profile fields (MDL-70456). + $conditions = \core\user_fields::get_identity_fields($this->get_context(), false); + foreach (\core\user_fields::get_name_fields() as $field) { $conditions[] = 'u.'.$field; } $conditions[] = $DB->sql_fullname('u.firstname', 'u.lastname'); @@ -399,7 +403,9 @@ class course_enrolment_manager { } $wherecondition = implode(' AND ', $tests); - $extrafields = get_extra_user_fields($this->get_context(), array('username', 'lastaccess')); + // TODO Does not support custom user profile fields (MDL-70456). + $userfieldsapi = \core\user_fields::for_identity($this->get_context(), false)->excluding('username', 'lastaccess'); + $extrafields = $userfieldsapi->get_required_fields(); $extrafields[] = 'username'; $extrafields[] = 'lastaccess'; $extrafields[] = 'maildisplay'; @@ -1046,7 +1052,8 @@ class course_enrolment_manager { $context = $this->get_context(); $now = time(); - $extrafields = get_extra_user_fields($context); + // TODO Does not support custom user profile fields (MDL-70456). + $extrafields = \core\user_fields::get_identity_fields($context, false); $users = array(); foreach ($userroles as $userrole) { @@ -1124,7 +1131,8 @@ class course_enrolment_manager { $canmanagegroups = has_capability('moodle/course:managegroups', $context); $url = new moodle_url($pageurl, $this->get_url_params()); - $extrafields = get_extra_user_fields($context); + // TODO Does not support custom user profile fields (MDL-70456). + $extrafields = \core\user_fields::get_identity_fields($context, false); $enabledplugins = $this->get_enrolment_plugins(true); @@ -1301,7 +1309,8 @@ class course_enrolment_manager { list($instancesql, $instanceparams) = $DB->get_in_or_equal(array_keys($instances), SQL_PARAMS_NAMED, 'instanceid0000'); } - $userfields = user_picture::fields('u'); + $userfieldsapi = \core\user_fields::for_userpic(); + $userfields = $userfieldsapi->get_sql('u', false, '', '', false)->selects; list($idsql, $idparams) = $DB->get_in_or_equal($userids, SQL_PARAMS_NAMED, 'userid0000'); list($sort, $sortparams) = users_order_by_sql('u'); diff --git a/enrol/manual/classes/enrol_users_form.php b/enrol/manual/classes/enrol_users_form.php index 257a5c2a995..8fde2485872 100644 --- a/enrol/manual/classes/enrol_users_form.php +++ b/enrol/manual/classes/enrol_users_form.php @@ -93,7 +93,8 @@ class enrol_manual_enrol_users_form extends moodleform { 'courseid' => $course->id, 'enrolid' => $instance->id, 'perpage' => $CFG->maxusersperpage, - 'userfields' => implode(',', get_extra_user_fields($context)) + // TODO Does not support custom user profile fields (MDL-70456). + 'userfields' => implode(',', \core\user_fields::get_identity_fields($context, false)) ); $mform->addElement('autocomplete', 'userlist', get_string('selectusers', 'enrol_manual'), array(), $options); diff --git a/enrol/otherusers.php b/enrol/otherusers.php index ede4a35613a..82846e03dda 100644 --- a/enrol/otherusers.php +++ b/enrol/otherusers.php @@ -54,9 +54,10 @@ $userdetails = array ( 'firstname' => get_string('firstname'), 'lastname' => get_string('lastname'), ); -$extrafields = get_extra_user_fields($context); +// TODO Does not support custom user profile fields (MDL-70456). +$extrafields = \core\user_fields::get_identity_fields($context, false); foreach ($extrafields as $field) { - $userdetails[$field] = get_user_field_name($field); + $userdetails[$field] = \core\user_fields::get_display_name($field); } $fields = array( diff --git a/enrol/self/lib.php b/enrol/self/lib.php index 4807f49e0a7..9131f408d85 100644 --- a/enrol/self/lib.php +++ b/enrol/self/lib.php @@ -1021,7 +1021,8 @@ class enrol_self_plugin extends enrol_plugin { // We only use the first user. $i = 0; do { - $allnames = get_all_user_name_fields(true, 'u'); + $userfieldsapi = \core\user_fields::for_name(); + $allnames = $userfieldsapi->get_sql('u', false, '', '', false)->selects; $rusers = get_role_users($croles[$i], $context, true, 'u.id, u.confirmed, u.username, '. $allnames . ', u.email, r.sortorder, ra.id', 'r.sortorder, ra.id ASC, ' . $sort, null, '', '', '', '', $sortparams); $i++; diff --git a/enrol/self/locallib.php b/enrol/self/locallib.php index 850555e2990..e360616f792 100644 --- a/enrol/self/locallib.php +++ b/enrol/self/locallib.php @@ -82,7 +82,9 @@ class enrol_self_enrol_form extends moodleform { $mform->addElement('password', 'enrolpassword', get_string('password', 'enrol_self'), array('id' => 'enrolpassword_'.$instance->id)); $context = context_course::instance($this->instance->courseid); - $keyholders = get_users_by_capability($context, 'enrol/self:holdkey', user_picture::fields('u')); + $userfieldsapi = \core\user_fields::for_userpic(); + $ufields = $userfieldsapi->get_sql('u', false, '', '', false)->selects; + $keyholders = get_users_by_capability($context, 'enrol/self:holdkey', $ufields); $keyholdercount = 0; foreach ($keyholders as $keyholder) { $keyholdercount++; diff --git a/grade/report/grader/ajax_callbacks.php b/grade/report/grader/ajax_callbacks.php index 8260320ed94..a7e7ee81216 100644 --- a/grade/report/grader/ajax_callbacks.php +++ b/grade/report/grader/ajax_callbacks.php @@ -91,7 +91,8 @@ switch ($action) { } if ($errorstr) { - $user = $DB->get_record('user', array('id' => $userid), 'id, ' . get_all_user_name_fields(true)); + $userfieldsapi = \core\user_fields::for_name(); + $user = $DB->get_record('user', array('id' => $userid), 'id' . $userfieldsapi->get_sql()->selects); $gradestr = new stdClass(); $gradestr->username = fullname($user); $gradestr->itemname = $grade_item->get_name(); diff --git a/grade/report/grader/lib.php b/grade/report/grader/lib.php index 86f968b099b..4409d500963 100644 --- a/grade/report/grader/lib.php +++ b/grade/report/grader/lib.php @@ -293,7 +293,8 @@ class grade_report_grader extends grade_report { } if ($errorstr) { - $userfields = 'id, ' . get_all_user_name_fields(true); + $userfieldsapi = \core\user_fields::for_name(); + $userfields = 'id, ' . $userfieldsapi->get_sql('', false, '', '', false)->selects; $user = $DB->get_record('user', array('id' => $userid), $userfields); $gradestr = new stdClass(); $gradestr->username = fullname($user, $viewfullnames); @@ -437,7 +438,9 @@ class grade_report_grader extends grade_report { list($enrolledsql, $enrolledparams) = get_enrolled_sql($this->context, '', 0, $showonlyactiveenrol); // Fields we need from the user table. - $userfields = user_picture::fields('u', get_extra_user_fields($this->context)); + // TODO Does not support custom user profile fields (MDL-70456). + $userfieldsapi = \core\user_fields::for_identity($this->context, false)->with_userpic(); + $userfields = $userfieldsapi->get_sql('u', false, '', '', false)->selects; // We want to query both the current context and parent contexts. list($relatedctxsql, $relatedctxparams) = $DB->get_in_or_equal($this->context->get_parent_context_ids(true), SQL_PARAMS_NAMED, 'relatedctx'); @@ -657,7 +660,8 @@ class grade_report_grader extends grade_report { $strfeedback = $this->get_lang_string("feedback"); $strgrade = $this->get_lang_string('grade'); - $extrafields = get_extra_user_fields($this->context); + // TODO Does not support custom user profile fields (MDL-70456). + $extrafields = \core\user_fields::get_identity_fields($this->context, false); $arrows = $this->get_sort_arrows($extrafields); @@ -1942,7 +1946,7 @@ class grade_report_grader extends grade_report { } $arrows['studentname'] = ''; - $requirednames = order_in_string(get_all_user_name_fields(), $nameformat); + $requirednames = order_in_string(\core\user_fields::get_name_fields(), $nameformat); if (!empty($requirednames)) { foreach ($requirednames as $name) { $arrows['studentname'] .= html_writer::link( @@ -1959,7 +1963,7 @@ class grade_report_grader extends grade_report { foreach ($extrafields as $field) { $fieldlink = html_writer::link(new moodle_url($this->baseurl, - array('sortitemid'=>$field)), get_user_field_name($field)); + array('sortitemid'=>$field)), \core\user_fields::get_display_name($field)); $arrows[$field] = $fieldlink; if ($field == $this->sortitemid) { diff --git a/grade/report/history/classes/helper.php b/grade/report/history/classes/helper.php index 00f4c6d429f..050e6c4fa21 100644 --- a/grade/report/history/classes/helper.php +++ b/grade/report/history/classes/helper.php @@ -131,7 +131,8 @@ class helper { global $DB, $USER; // Fields we need from the user table. - $extrafields = get_extra_user_fields($context); + // TODO Does not support custom user profile fields (MDL-70456). + $extrafields = \core\user_fields::get_identity_fields($context, false); $params = array(); if (!empty($search)) { list($filtersql, $params) = users_search_sql($search, 'u', true, $extrafields); @@ -140,7 +141,8 @@ class helper { $filtersql = ''; } - $ufields = \user_picture::fields('u', $extrafields).',u.username'; + $userfieldsapi = \core\user_fields::for_userpic()->including(...(array_merge($extrafields, ['username']))); + $ufields = $userfieldsapi->get_sql('u', false, '', '', false)->selects; if ($count) { $select = "SELECT COUNT(DISTINCT u.id) "; $orderby = ""; @@ -201,7 +203,8 @@ class helper { $groupwheresql = " AND gm.groupid $insql "; } - $ufields = get_all_user_name_fields(true, 'u'); + $userfieldsapi = \core\user_fields::for_name(); + $ufields = $userfieldsapi->get_sql('u', false, '', '', false)->selects; $sql = "SELECT u.id, $ufields FROM {user} u JOIN {grade_grades_history} ggh ON ggh.usermodified = u.id diff --git a/grade/report/history/classes/output/tablelog.php b/grade/report/history/classes/output/tablelog.php index 5cc89df88f1..5cd19fbe9ee 100644 --- a/grade/report/history/classes/output/tablelog.php +++ b/grade/report/history/classes/output/tablelog.php @@ -140,7 +140,8 @@ class tablelog extends \table_sql implements \renderable { * Setup the headers for the html table. */ protected function define_table_columns() { - $extrafields = get_extra_user_fields($this->context); + // TODO Does not support custom user profile fields (MDL-70456). + $extrafields = \core\user_fields::get_identity_fields($this->context, false); // Define headers and columns. $cols = array( @@ -394,17 +395,19 @@ class tablelog extends \table_sql implements \renderable { gi.itemtype, gi.itemmodule, gi.iteminstance, gi.itemnumber, '; // Add extra user fields that we need for the graded user. - $extrafields = get_extra_user_fields($this->context); + // TODO Does not support custom user profile fields (MDL-70456). + $extrafields = \core\user_fields::get_identity_fields($this->context, false); foreach ($extrafields as $field) { $fields .= 'u.' . $field . ', '; } - $gradeduserfields = get_all_user_name_fields(true, 'u'); + $userfieldsapi = \core\user_fields::for_name(); + $gradeduserfields = $userfieldsapi->get_sql('u', false, '', '', false)->selects; $fields .= $gradeduserfields . ', '; $groupby = $fields; // Add extra user fields that we need for the grader user. - $fields .= get_all_user_name_fields(true, 'ug', '', 'grader'); - $groupby .= get_all_user_name_fields(true, 'ug'); + $fields .= $userfieldsapi->get_sql('ug', false, 'grader', '', false)->selects; + $groupby .= $userfieldsapi->get_sql('ug', false, '', '', false)->selects; // Filtering on revised grades only. $revisedonly = !empty($this->filters->revisedonly); diff --git a/grade/report/history/users_ajax.php b/grade/report/history/users_ajax.php index 387a1aab186..af43ee0a3d2 100644 --- a/grade/report/history/users_ajax.php +++ b/grade/report/history/users_ajax.php @@ -51,7 +51,8 @@ $users = \gradereport_history\helper::get_users($context, $search, $page, 25); $outcome->response = array('users' => array()); $outcome->response['totalusers'] = \gradereport_history\helper::get_users_count($context, $search);; -$extrafields = get_extra_user_fields($context); +// TODO Does not support custom user profile fields (MDL-70456). +$extrafields = \core\user_fields::get_identity_fields($context, false); $useroptions = array('link' => false, 'visibletoscreenreaders' => false); // Format the user record. diff --git a/group/autogroup.php b/group/autogroup.php index 9d69597b264..87df71ecdaf 100644 --- a/group/autogroup.php +++ b/group/autogroup.php @@ -99,7 +99,8 @@ if ($editform->is_cancelled()) { // Display only active users if the option was selected or they do not have the capability to view suspended users. $onlyactive = !empty($data->includeonlyactiveenrol) || !has_capability('moodle/course:viewsuspendedusers', $context); - $extrafields = get_extra_user_fields($context); + // TODO Does not support custom user profile fields (MDL-70456). + $extrafields = \core\user_fields::get_identity_fields($context, false); $users = groups_get_potential_members($data->courseid, $data->roleid, $source, $orderby, !empty($data->notingroup), $onlyactive, $extrafields); $usercnt = count($users); diff --git a/group/index.php b/group/index.php index e2aa22b35e7..b61e87d07a0 100644 --- a/group/index.php +++ b/group/index.php @@ -81,9 +81,12 @@ switch ($action) { case 'ajax_getmembersingroup': $roles = array(); - $extrafields = get_extra_user_fields($context); + // TODO Does not support custom user profile fields (MDL-70456). + $userfieldsapi = \core\user_fields::for_identity($context, false)->with_userpic(); + $userfields = $userfieldsapi->get_sql('u', false, '', '', false)->selects; + $extrafields = $userfieldsapi->get_required_fields([\core\user_fields::PURPOSE_IDENTITY]); if ($groupmemberroles = groups_get_members_by_role($groupids[0], $courseid, - 'u.id, ' . user_picture::fields('u', $extrafields))) { + 'u.id, ' . $userfields)) { $viewfullnames = has_capability('moodle/site:viewfullnames', $context); @@ -202,9 +205,12 @@ if ($groups) { // Get list of group members to render if there is a single selected group. $members = array(); if ($singlegroup) { - $extrafields = get_extra_user_fields($context); + // TODO Does not support custom user profile fields (MDL-70456). + $userfieldsapi = \core\user_fields::for_identity($context, false)->with_userpic(); + $userfields = $userfieldsapi->get_sql('u', false, '', '', false)->selects; + $extrafields = $userfieldsapi->get_required_fields([\core\user_fields::PURPOSE_IDENTITY]); if ($groupmemberroles = groups_get_members_by_role(reset($groupids), $courseid, - 'u.id, ' . user_picture::fields('u', $extrafields))) { + 'u.id, ' . $userfields)) { $viewfullnames = has_capability('moodle/site:viewfullnames', $context); diff --git a/group/lib.php b/group/lib.php index 98330166fe5..ebeab85b3b6 100644 --- a/group/lib.php +++ b/group/lib.php @@ -848,7 +848,8 @@ function groups_get_potential_members($courseid, $roleid = null, $source = null, } } - $allusernamefields = user_picture::fields('u', $extrafields); + $userfieldsapi = \core\user_fields::for_userpic()->including(...$extrafields); + $allusernamefields = $userfieldsapi->get_sql('u', false, '', '', false)->selects; $sql = "SELECT DISTINCT u.id, u.username, $allusernamefields, u.idnumber FROM {user} u JOIN ($esql) e ON e.id = u.id diff --git a/group/overview.php b/group/overview.php index fcbf697da24..ff73970c4c7 100644 --- a/group/overview.php +++ b/group/overview.php @@ -110,8 +110,11 @@ if ($groupingid) { list($sort, $sortparams) = users_order_by_sql('u'); -$extrafields = get_extra_user_fields($context); -$allnames = 'u.id, ' . user_picture::fields('u', $extrafields); +// TODO Does not support custom user profile fields (MDL-70456). +$userfieldsapi = \core\user_fields::for_identity($context, false)->with_userpic(); +$userfields = $userfieldsapi->get_sql('u', false, '', '', false)->selects; +$extrafields = $userfieldsapi->get_required_fields([\core\user_fields::PURPOSE_IDENTITY]); +$allnames = 'u.id, ' . $userfields; $sql = "SELECT g.id AS groupid, gg.groupingid, u.id AS userid, $allnames, u.idnumber, u.username FROM {groups} g diff --git a/lib/accesslib.php b/lib/accesslib.php index 39f110e2553..7699a691e7b 100644 --- a/lib/accesslib.php +++ b/lib/accesslib.php @@ -3923,7 +3923,8 @@ function get_role_users($roleid, context $context, $parent = false, $fields = '' global $DB; if (empty($fields)) { - $allnames = get_all_user_name_fields(true, 'u'); + $userfieldsapi = \core\user_fields::for_name(); + $allnames = $userfieldsapi->get_sql('u', false, '', '', false)->selects; $fields = 'u.id, u.confirmed, u.username, '. $allnames . ', ' . 'u.maildisplay, u.mailformat, u.maildigest, u.email, u.emailstop, u.city, '. 'u.country, u.picture, u.idnumber, u.department, u.institution, '. diff --git a/lib/adminlib.php b/lib/adminlib.php index c3ead083eaa..923f9daab3a 100644 --- a/lib/adminlib.php +++ b/lib/adminlib.php @@ -4311,7 +4311,8 @@ class admin_setting_users_with_capability extends admin_setting_configmultiselec 'This is unexpected, and a problem because there is no way to pass these ' . 'parameters to get_users_by_capability. See MDL-34657.'); } - $userfields = 'u.id, u.username, ' . get_all_user_name_fields(true, 'u'); + $userfieldsapi = \core\user_fields::for_name(); + $userfields = 'u.id, u.username, ' . $userfieldsapi->get_sql('u', false, '', '', false)->selects; $users = get_users_by_capability(context_system::instance(), $this->capability, $userfields, $sort); $this->choices = array( '$@NONE@$' => get_string('nobody'), diff --git a/lib/authlib.php b/lib/authlib.php index d1604e6a18a..26099d3f807 100644 --- a/lib/authlib.php +++ b/lib/authlib.php @@ -1102,7 +1102,7 @@ function signup_setup_new_user($user) { $user->secret = random_string(15); $user->auth = $CFG->registerauth; // Initialize alternate name fields to empty strings. - $namefields = array_diff(get_all_user_name_fields(), useredit_get_required_name_fields()); + $namefields = array_diff(\core\user_fields::get_name_fields(), useredit_get_required_name_fields()); foreach ($namefields as $namefield) { $user->$namefield = ''; } diff --git a/lib/badgeslib.php b/lib/badgeslib.php index d67c1deeeb6..3923aa9d1b1 100644 --- a/lib/badgeslib.php +++ b/lib/badgeslib.php @@ -145,7 +145,7 @@ function badges_notify_badge_award(badge $badge, $userid, $issued, $filepathhash $userfrom = new stdClass(); $userfrom->id = $admin->id; $userfrom->email = !empty($CFG->badges_defaultissuercontact) ? $CFG->badges_defaultissuercontact : $admin->email; - foreach (get_all_user_name_fields() as $addname) { + foreach (\core\user_fields::get_name_fields() as $addname) { $userfrom->$addname = !empty($CFG->badges_defaultissuername) ? '' : $admin->$addname; } $userfrom->firstname = !empty($CFG->badges_defaultissuername) ? $CFG->badges_defaultissuername : $admin->firstname; diff --git a/lib/classes/check/access/riskadmin.php b/lib/classes/check/access/riskadmin.php index 7c0729cfaad..77bdec273d6 100644 --- a/lib/classes/check/access/riskadmin.php +++ b/lib/classes/check/access/riskadmin.php @@ -66,7 +66,8 @@ class riskadmin extends check { */ public function get_result(): result { global $DB, $CFG; - $userfields = \user_picture::fields('u'); + $userfieldsapi = \core\user_fields::for_userpic(); + $userfields = $userfieldsapi->get_sql('u', false, '', '', false)->selects; $sql = "SELECT $userfields FROM {user} u WHERE u.id IN ($CFG->siteadmins)"; diff --git a/lib/classes/check/access/riskbackup_result.php b/lib/classes/check/access/riskbackup_result.php index a234072c8d9..ee4e75bbf80 100644 --- a/lib/classes/check/access/riskbackup_result.php +++ b/lib/classes/check/access/riskbackup_result.php @@ -165,7 +165,8 @@ class riskbackup_result extends \core\check\result { 'context1' => CONTEXT_COURSE, 'context2' => CONTEXT_COURSE, ]; - $userfields = \user_picture::fields('u'); + $userfieldsapi = \core\user_fields::for_userpic(); + $userfields = $userfieldsapi->get_sql('u', false, '', '', false)->selects; $rs = $DB->get_recordset_sql(" SELECT DISTINCT $userfields, ra.contextid, diff --git a/lib/classes/check/access/riskxss_result.php b/lib/classes/check/access/riskxss_result.php index 7097db6de21..2041825cab0 100644 --- a/lib/classes/check/access/riskxss_result.php +++ b/lib/classes/check/access/riskxss_result.php @@ -90,7 +90,8 @@ class riskxss_result extends \core\check\result { global $CFG, $DB; - $userfields = \user_picture::fields('u'); + $userfieldsapi = \core\user_fields::for_userpic(); + $userfields = $userfieldsapi->get_sql('u', false, '', '', false)->selects; $users = $DB->get_records_sql("SELECT DISTINCT $userfields $this->sqlfrom", $this->params); foreach ($users as $uid => $user) { $url = "$CFG->wwwroot/user/view.php?id=$user->id"; diff --git a/lib/classes/task/send_failed_login_notifications_task.php b/lib/classes/task/send_failed_login_notifications_task.php index 7af752e995b..019e0ba625f 100644 --- a/lib/classes/task/send_failed_login_notifications_task.php +++ b/lib/classes/task/send_failed_login_notifications_task.php @@ -115,7 +115,8 @@ class send_failed_login_notifications_task extends scheduled_task { // Now, select all the login error logged records belonging to the ips and infos // since lastnotifyfailure, that we have stored in the cache_flags table. - $namefields = get_all_user_name_fields(true, 'u'); + $userfieldsapi = \core\user_fields::for_name(); + $namefields = $userfieldsapi->get_sql('u', false, '', '', false)->selects; $sql = "SELECT * FROM ( SELECT l.*, u.username, $namefields FROM {" . $logtable . "} l diff --git a/lib/classes/task/send_new_user_passwords_task.php b/lib/classes/task/send_new_user_passwords_task.php index bdf55be6781..ded1fb2caa9 100644 --- a/lib/classes/task/send_new_user_passwords_task.php +++ b/lib/classes/task/send_new_user_passwords_task.php @@ -47,7 +47,8 @@ class send_new_user_passwords_task extends scheduled_task { // Generate new password emails for users - ppl expect these generated asap. if ($DB->count_records('user_preferences', array('name' => 'create_password', 'value' => '1'))) { mtrace('Creating passwords for new users...'); - $usernamefields = get_all_user_name_fields(true, 'u'); + $userfieldsapi = \core\user_fields::for_name(); + $usernamefields = $userfieldsapi->get_sql('u', false, '', '', false)->selects; $newusers = $DB->get_recordset_sql("SELECT u.id as id, u.email, u.auth, u.deleted, u.suspended, u.emailstop, u.mnethostid, u.mailformat, $usernamefields, u.username, u.lang, diff --git a/lib/classes/user.php b/lib/classes/user.php index d5c00bb978e..eb15369318c 100644 --- a/lib/classes/user.php +++ b/lib/classes/user.php @@ -252,20 +252,10 @@ class core_user { $extraparams = []; // TODO Does not support custom user profile fields (MDL-70456). - $extra = \core\user_fields::get_identity_fields(null, false); - - // We need the username just to skip guests. - $extrafieldlist = $extra; - if (!in_array('username', $extra)) { - $extrafieldlist[] = 'username'; - } - // The deleted flag will always be false because users_search_sql excludes deleted users, - // but it must be present or it causes PHP warnings in some functions below. - if (!in_array('deleted', $extra)) { - $extrafieldlist[] = 'deleted'; - } - $selectfields = \user_picture::fields('u', - array_merge(get_all_user_name_fields(), $extrafieldlist)); + $userfieldsapi = \core\user_fields::for_identity(null, false)->with_userpic()->with_name() + ->including('username', 'deleted'); + $selectfields = $userfieldsapi->get_sql('u', false, '', '', false)->selects; + $extra = $userfieldsapi->get_required_fields([\core\user_fields::PURPOSE_IDENTITY]); $index = 1; foreach ($extra as $fieldname) { diff --git a/lib/completionlib.php b/lib/completionlib.php index 2258259f865..61fce2f2f46 100644 --- a/lib/completionlib.php +++ b/lib/completionlib.php @@ -1190,11 +1190,10 @@ class completion_info { context_course::instance($this->course->id), 'moodle/course:isincompletionreports', $groupid, true); - $allusernames = get_all_user_name_fields(true, 'u'); - $sql = 'SELECT u.id, u.idnumber, ' . $allusernames; - if ($extracontext) { - $sql .= get_extra_user_fields_sql($extracontext, 'u', '', array('idnumber')); - } + // TODO Does not support custom user profile fields (MDL-70456). + $userfieldsapi = \core\user_fields::for_identity($extracontext, false)->with_name(); + $allusernames = $userfieldsapi->get_sql('u')->selects; + $sql = 'SELECT u.id, u.idnumber ' . $allusernames; $sql .= ' FROM (' . $enrolledsql . ') eu JOIN {user} u ON u.id = eu.id'; if ($where) { diff --git a/lib/datalib.php b/lib/datalib.php index 613f82f68e7..68d89f89f8a 100644 --- a/lib/datalib.php +++ b/lib/datalib.php @@ -368,7 +368,8 @@ function users_order_by_sql($usertablealias = '', $search = null, context $conte $params[$paramkey] = $search; $paramkey++; - $fieldstocheck = array_merge(array('firstname', 'lastname'), get_extra_user_fields($context)); + // TODO Does not support custom user profile fields (MDL-70456). + $fieldstocheck = array_merge(array('firstname', 'lastname'), \core\user_fields::get_identity_fields($context, false)); foreach ($fieldstocheck as $key => $field) { $exactconditions[] = 'LOWER(' . $tableprefix . $field . ') = LOWER(:' . $paramkey . ')'; $params[$paramkey] = $search; @@ -512,14 +513,11 @@ function get_users_listing($sort='lastaccess', $dir='ASC', $page=0, $recordsperp // If a context is specified, get extra user fields that the current user // is supposed to see. - $extrafields = ''; - if ($extracontext) { - $extrafields = get_extra_user_fields_sql($extracontext, '', '', - array('id', 'username', 'email', 'firstname', 'lastname', 'city', 'country', - 'lastaccess', 'confirmed', 'mnethostid')); - } - $namefields = get_all_user_name_fields(true); - $extrafields = "$extrafields, $namefields"; + // TODO Does not support custom user profile fields (MDL-70456). + $userfieldsapi = \core\user_fields::for_identity($extracontext, false)->with_name() + ->excluding('id', 'username', 'email', 'firstname', 'lastname', 'city', 'country', + 'lastaccess', 'confirmed', 'mnethostid'); + $extrafields = $userfields->get_sql()->selects; // warning: will return UNCONFIRMED USERS return $DB->get_records_sql("SELECT id, username, email, city, country, lastaccess, confirmed, mnethostid, suspended $extrafields diff --git a/lib/deprecatedlib.php b/lib/deprecatedlib.php index 8cf3efa61b1..8492e23b4fd 100644 --- a/lib/deprecatedlib.php +++ b/lib/deprecatedlib.php @@ -3083,8 +3083,10 @@ function user_get_participants_sql($courseid, $groupid = 0, $accesssince = 0, $r $joins = array('FROM {user} u'); $wheres = array(); - $userfields = get_extra_user_fields($context); - $userfieldssql = user_picture::fields('u', $userfields); + // TODO Does not support custom user profile fields (MDL-70456). + $userfields = \core\user_fields::get_identity_fields($context, false); + $userfieldsapi = \core\user_fields::for_userpic()->including(...$userfields); + $userfieldssql = $userfieldsapi->get_sql('u', false, '', '', false)->selects; if ($isfrontpage) { $select = "SELECT $userfieldssql, u.lastaccess"; diff --git a/lib/grouplib.php b/lib/grouplib.php index 6aa89065f46..8b7d8533fff 100644 --- a/lib/grouplib.php +++ b/lib/grouplib.php @@ -1321,7 +1321,8 @@ function groups_user_groups_visible($course, $userid, $cm = null) { function groups_get_groups_members($groupsids, $extrafields=null, $sort='lastname ASC') { global $DB; - $userfields = user_picture::fields('u', $extrafields); + $userfieldsapi = \core\user_fields::for_userpic()->including(...($extrafields ?? [])); + $userfields = $userfieldsapi->get_sql('u', false, '', '', false)->selects; list($insql, $params) = $DB->get_in_or_equal($groupsids); return $DB->get_records_sql("SELECT $userfields diff --git a/lib/moodlelib.php b/lib/moodlelib.php index 1c474c88be0..f6fea8ee107 100644 --- a/lib/moodlelib.php +++ b/lib/moodlelib.php @@ -3540,7 +3540,7 @@ function fullname($user, $override=false) { } // Get all of the name fields. - $allnames = get_all_user_name_fields(); + $allnames = \core\user_fields::get_name_fields(); if ($CFG->debugdeveloper) { foreach ($allnames as $allname) { if (!property_exists($user, $allname)) { @@ -3645,7 +3645,10 @@ function fullname($user, $override=false) { * @return object User name fields. */ function username_load_fields_from_object($addtoobject, $secondobject, $prefix = null, $additionalfields = null) { - $fields = get_all_user_name_fields(false, null, $prefix); + $fields = \core\user_fields::get_name_fields(); + foreach ($fields as &$field) { + $field = $prefix . $field; + } if ($additionalfields) { // Additional fields can specify their own 'alias' such as 'id' => 'userid'. This checks to see if // the key is a number and then sets the key to the array value. diff --git a/lib/outputcomponents.php b/lib/outputcomponents.php index 8ca4a3f52ce..a3d3b1f3c86 100644 --- a/lib/outputcomponents.php +++ b/lib/outputcomponents.php @@ -230,7 +230,8 @@ class user_picture implements renderable { } if ($needrec) { - $this->user = $DB->get_record('user', array('id'=>$user->id), self::fields(), MUST_EXIST); + $this->user = $DB->get_record('user', array('id'=>$user->id), + implode(',', \core\user_fields::get_picture_fields()), MUST_EXIST); } else { $this->user = clone($user); } diff --git a/lib/tablelib.php b/lib/tablelib.php index be904c2d766..37b8ee5538c 100644 --- a/lib/tablelib.php +++ b/lib/tablelib.php @@ -608,7 +608,7 @@ class flexible_table { if (isset($this->columns[$column])) { continue; // This column is OK. } - if (in_array($column, get_all_user_name_fields()) && + if (in_array($column, \core\user_fields::get_name_fields()) && isset($this->columns['fullname'])) { continue; // This column is OK. } @@ -1235,7 +1235,7 @@ class flexible_table { $nameformat = get_string('fullnamedisplay'); } - $requirednames = order_in_string(get_all_user_name_fields(), $nameformat); + $requirednames = order_in_string(\core\user_fields::get_name_fields(), $nameformat); if (!empty($requirednames)) { if ($this->is_sortable($column)) { @@ -1315,7 +1315,7 @@ class flexible_table { $sortdata = array_merge([$sortby => $sortorder], $sortdata); } - $usernamefields = get_all_user_name_fields(); + $usernamefields = \core\user_fields::get_name_fields(); $sortdata = array_filter($sortdata, function($sortby) use ($usernamefields) { $isvalidsort = $sortby && $this->is_sortable($sortby); $isvalidsort = $isvalidsort && empty($this->prefs['collapse'][$sortby]); diff --git a/lib/tests/moodlelib_test.php b/lib/tests/moodlelib_test.php index a21ee933c8f..89751b40f79 100644 --- a/lib/tests/moodlelib_test.php +++ b/lib/tests/moodlelib_test.php @@ -3788,7 +3788,7 @@ class core_moodlelib_testcase extends advanced_testcase { // User information for showing a picture. $user = new stdClass(); - $additionalfields = explode(',', user_picture::fields()); + $additionalfields = explode(',', implode(',', \core\user_fields::get_picture_fields())); $user = username_load_fields_from_object($user, $userinfo, null, $additionalfields); $user->id = $userinfo->userid; $expectedarray = new stdClass(); @@ -3817,7 +3817,7 @@ class core_moodlelib_testcase extends advanced_testcase { // Return an object with user picture information. $user = new stdClass(); - $additionalfields = explode(',', user_picture::fields()); + $additionalfields = explode(',', implode(',', \core\user_fields::get_picture_fields())); $user = username_load_fields_from_object($user, $userinfo, 'author', $additionalfields); $user->id = $userinfo->userid; $expectedarray = new stdClass(); diff --git a/lib/tests/outputcomponents_test.php b/lib/tests/outputcomponents_test.php index 0ff1c55c392..00ecbe9a559 100644 --- a/lib/tests/outputcomponents_test.php +++ b/lib/tests/outputcomponents_test.php @@ -33,6 +33,11 @@ require_once($CFG->libdir . '/outputcomponents.php'); */ class core_outputcomponents_testcase extends advanced_testcase { + /** + * Tests user_picture::fields. + * + * @deprecated since Moodle 3.11 MDL-45242 + */ public function test_fields_aliasing() { $fields = user_picture::fields(); $fields = array_map('trim', explode(',', $fields)); @@ -60,10 +65,16 @@ class core_outputcomponents_testcase extends advanced_testcase { $this->assertContains($expected, $returned, "Expected pattern '$expected' not returned"); } $this->assertContains("custom1 AS prefixcustom1", $returned, "Expected pattern 'custom1 AS prefixcustom1' not returned"); + + // Deprecation warnings for user_picture::fields. + $this->assertDebuggingCalledCount(2); } + /** + * Tests user_picture::unalias. + */ public function test_fields_unaliasing() { - $fields = user_picture::fields(); + $fields = implode(',', \core\user_fields::get_picture_fields()); $fields = array_map('trim', explode(',', $fields)); $fakerecord = new stdClass(); @@ -86,8 +97,11 @@ class core_outputcomponents_testcase extends advanced_testcase { $this->assertSame('Value of custom1', $returned->custom1); } + /** + * Tests user_picture::unalias with null values. + */ public function test_fields_unaliasing_null() { - $fields = user_picture::fields(); + $fields = implode(',', \core\user_fields::get_picture_fields()); $fields = array_map('trim', explode(',', $fields)); $fakerecord = new stdClass(); diff --git a/message/classes/api.php b/message/classes/api.php index af3a7ec63e8..dcc69c05f25 100644 --- a/message/classes/api.php +++ b/message/classes/api.php @@ -111,8 +111,9 @@ class api { global $DB; // Get the user fields we want. - $ufields = \user_picture::fields('u', array('lastaccess'), 'userfrom_id', 'userfrom_'); - $ufields2 = \user_picture::fields('u2', array('lastaccess'), 'userto_id', 'userto_'); + $userfieldsapi = \core\user_fields::for_userpic()->including('lastaccess'); + $ufields = $userfieldsapi->get_sql('u', false, 'userfrom_', '', false)->selects; + $ufields2 = $userfieldsapi->get_sql('u2', false, 'userto_', '', false)->selects; // Add the uniqueid column to make each row unique and avoid SQL errors. $uniqueidsql = $DB->sql_concat('m.id', "'_'", 'm.useridfrom', "'_'", 'mcm.userid'); @@ -1022,7 +1023,8 @@ class api { debugging('\core_message\api::get_contacts_with_unread_message_count is deprecated and no longer used', DEBUG_DEVELOPER); - $userfields = \user_picture::fields('u', array('lastaccess')); + $userfieldsapi = \core\user_fields::for_userpic()->including('lastaccess'); + $userfields = $userfieldsapi->get_sql('u', false, '', '', false)->selects; $unreadcountssql = "SELECT $userfields, count(m.id) as messagecount FROM {message_contacts} mc INNER JOIN {user} u @@ -1063,7 +1065,8 @@ class api { debugging('\core_message\api::get_non_contacts_with_unread_message_count is deprecated and no longer used', DEBUG_DEVELOPER); - $userfields = \user_picture::fields('u', array('lastaccess')); + $userfieldsapi = \core\user_fields::for_userpic()->including('lastaccess'); + $userfields = $userfieldsapi->get_sql('u', false, '', '', false)->selects; $unreadcountssql = "SELECT $userfields, count(m.id) as messagecount FROM {user} u INNER JOIN {messages} m @@ -1885,7 +1888,8 @@ class api { public static function get_blocked_users($userid) { global $DB; - $userfields = \user_picture::fields('u', array('lastaccess')); + $userfieldsapi = \core\user_fields::for_userpic()->including('lastaccess'); + $userfields = $userfieldsapi->get_sql('u', false, '', '', false)->selects; $blockeduserssql = "SELECT $userfields FROM {message_users_blocked} mub INNER JOIN {user} u diff --git a/message/classes/helper.php b/message/classes/helper.php index 5074c0e9472..4517185bf9b 100644 --- a/message/classes/helper.php +++ b/message/classes/helper.php @@ -429,7 +429,8 @@ class helper { } list($useridsql, $usersparams) = $DB->get_in_or_equal($userids); - $userfields = \user_picture::fields('u', array('lastaccess')); + $userfieldsapi = \core\user_fields::for_userpic()->including('lastaccess'); + $userfields = $userfieldsapi->get_sql('u', false, '', '', false)->selects; $userssql = "SELECT $userfields, u.deleted, mc.id AS contactid, mub.id AS blockedid FROM {user} u LEFT JOIN {message_contacts} mc diff --git a/message/lib.php b/message/lib.php index 03a7a09680c..3333f1874a3 100644 --- a/message/lib.php +++ b/message/lib.php @@ -183,7 +183,8 @@ function message_search_users($courseids, $searchtext, $sort='', $exceptions='') } $fullname = $DB->sql_fullname(); - $ufields = user_picture::fields('u'); + $userfieldsapi = \core\user_fields::for_userpic(); + $ufields = $userfieldsapi->get_sql('u', false, '', '', false)->selects; if (!empty($sort)) { $order = ' ORDER BY '. $sort; @@ -549,11 +550,12 @@ function message_get_messages($useridto, $useridfrom = 0, $notifications = -1, $ global $DB; // If the 'useridto' value is empty then we are going to retrieve messages sent by the useridfrom to any user. + $userfieldsapi = \core\user_fields::for_name(); if (empty($useridto)) { - $userfields = get_all_user_name_fields(true, 'u', '', 'userto'); + $userfields = $userfieldsapi->get_sql('u', false, 'userto', '', false)->selects; $messageuseridtosql = 'u.id as useridto'; } else { - $userfields = get_all_user_name_fields(true, 'u', '', 'userfrom'); + $userfields = $userfieldsapi->get_sql('u', false, 'userfrom', '', false)->selects; $messageuseridtosql = "$useridto as useridto"; } diff --git a/message/output/email/classes/task/send_email_task.php b/message/output/email/classes/task/send_email_task.php index d21f3155da4..07ff2648dca 100644 --- a/message/output/email/classes/task/send_email_task.php +++ b/message/output/email/classes/task/send_email_task.php @@ -161,7 +161,8 @@ class send_email_task extends scheduled_task { protected function get_users_messages_for_conversation(int $conversationid, int $userid) : moodle_recordset { global $DB; - $usernamefields = \user_picture::fields('u'); + $userfieldsapi = \core\user_fields::for_userpic(); + $usernamefields = $userfieldsapi->get_sql('u', false, '', '', false)->selects; $sql = "SELECT $usernamefields, m.* FROM {messages} m JOIN {user} u diff --git a/mod/assign/extensionform.php b/mod/assign/extensionform.php index ca8e196a979..5f94b8cde06 100644 --- a/mod/assign/extensionform.php +++ b/mod/assign/extensionform.php @@ -58,7 +58,8 @@ class mod_assign_extension_form extends moodleform { $usercount = 0; $usershtml = ''; - $extrauserfields = get_extra_user_fields($assign->get_context()); + // TODO Does not support custom user profile fields (MDL-70456). + $extrauserfields = \core\user_fields::get_identity_fields($assign->get_context(), false); foreach ($userlist as $userid) { if ($usercount >= 5) { $usershtml .= get_string('moreusers', 'assign', count($userlist) - 5); diff --git a/mod/assign/feedback/file/locallib.php b/mod/assign/feedback/file/locallib.php index e0afc11f136..f42198935b0 100644 --- a/mod/assign/feedback/file/locallib.php +++ b/mod/assign/feedback/file/locallib.php @@ -474,7 +474,8 @@ class assign_feedback_file extends assign_feedback_plugin { $this->assignment->get_course_context()), $this->assignment->is_blind_marking(), $this->assignment->get_uniqueid_for_user($user->id), - get_extra_user_fields($this->assignment->get_context())); + // TODO Does not support custom user profile fields (MDL-70456). + \core\user_fields::get_identity_fields($this->assignment->get_context(), false)); $usershtml .= $this->assignment->get_renderer()->render($usersummary); $usercount += 1; } diff --git a/mod/assign/gradingtable.php b/mod/assign/gradingtable.php index 82e2f2fdb0e..77260037e40 100644 --- a/mod/assign/gradingtable.php +++ b/mod/assign/gradingtable.php @@ -134,9 +134,11 @@ class assign_grading_table extends table_sql implements renderable { $params['assignmentid3'] = (int)$this->assignment->get_instance()->id; $params['newstatus'] = ASSIGN_SUBMISSION_STATUS_NEW; - $extrauserfields = get_extra_user_fields($this->assignment->get_context()); - - $fields = user_picture::fields('u', $extrauserfields) . ', '; + // TODO Does not support custom user profile fields (MDL-70456). + $userfieldsapi = \core\user_fields::for_identity($this->assignment->get_context(), false)->with_userpic(); + $userfields = $userfieldsapi->get_sql('u', false, '', '', false)->selects; + $extrauserfields = $userfieldsapi->get_required_fields([\core\user_fields::PURPOSE_IDENTITY]); + $fields = $userfields . ', '; $fields .= 'u.id as userid, '; $fields .= 's.status as status, '; $fields .= 's.id as submissionid, '; @@ -406,7 +408,7 @@ class assign_grading_table extends table_sql implements renderable { foreach ($extrauserfields as $extrafield) { $columns[] = $extrafield; - $headers[] = get_user_field_name($extrafield); + $headers[] = \core\user_fields::get_display_name($extrafield); } } else { // Record ID. diff --git a/mod/assign/lib.php b/mod/assign/lib.php index c3d172e2819..7dd73acfa93 100644 --- a/mod/assign/lib.php +++ b/mod/assign/lib.php @@ -589,7 +589,8 @@ function assign_print_recent_activity($course, $viewfullnames, $timestart) { // Do not use log table if possible, it may be huge. $dbparams = array($timestart, $course->id, 'assign', ASSIGN_SUBMISSION_STATUS_SUBMITTED); - $namefields = user_picture::fields('u', null, 'userid'); + $userfieldsapi = \core\user_fields::for_userpic(); + $namefields = $userfieldsapi->get_sql('u', false, '', 'userid', false)->selects;; if (!$submissions = $DB->get_records_sql("SELECT asb.id, asb.timemodified, cm.id AS cmid, um.id as recordid, $namefields FROM {assign_submission} asb @@ -746,7 +747,8 @@ function assign_get_recent_mod_activity(&$activities, $params['timestart'] = $timestart; $params['submitted'] = ASSIGN_SUBMISSION_STATUS_SUBMITTED; - $userfields = user_picture::fields('u', null, 'userid'); + $userfieldsapi = \core\user_fields::for_userpic(); + $userfields = $userfieldsapi->get_sql('u', false, '', 'userid', false)->selects; if (!$submissions = $DB->get_records_sql('SELECT asb.id, asb.timemodified, ' . $userfields . @@ -833,7 +835,7 @@ function assign_get_recent_mod_activity(&$activities, $activity->grade = $grades->items[0]->grades[$submission->userid]->str_long_grade; } - $userfields = explode(',', user_picture::fields()); + $userfields = explode(',', implode(',', \core\user_fields::get_picture_fields())); foreach ($userfields as $userfield) { if ($userfield == 'id') { // Aliased in SQL above. diff --git a/mod/assign/locallib.php b/mod/assign/locallib.php index 3fea27b7747..de1b93e216a 100644 --- a/mod/assign/locallib.php +++ b/mod/assign/locallib.php @@ -2065,9 +2065,9 @@ class assign { */ private function get_grading_sort_sql() { $usersort = flexible_table::get_sort_for_table('mod_assign_grading'); - $extrauserfields = get_extra_user_fields($this->get_context()); - - $userfields = explode(',', user_picture::fields('', $extrauserfields)); + // TODO Does not support custom user profile fields (MDL-70456). + $userfieldsapi = \core\user_fields::for_identity($this->context, false)->with_userpic(); + $userfields = $userfieldsapi->get_required_fields(); $orderfields = explode(',', $usersort); $validlist = []; @@ -4148,7 +4148,8 @@ class assign { $viewfullnames, $this->is_blind_marking(), $this->get_uniqueid_for_user($user->id), - get_extra_user_fields($this->get_context()), + // TODO Does not support custom user profile fields (MDL-70456). + \core\user_fields::get_identity_fields($this->get_context(), false), !$this->is_active_user($userid)); $o .= $this->get_renderer()->render($usersummary); } @@ -4997,7 +4998,8 @@ class assign { $usershtml = ''; $usercount = 0; - $extrauserfields = get_extra_user_fields($this->get_context()); + // TODO Does not support custom user profile fields (MDL-70456). + $extrauserfields = \core\user_fields::get_identity_fields($this->get_context(), false); $viewfullnames = has_capability('moodle/site:viewfullnames', $this->get_context()); foreach ($userlist as $userid) { if ($usercount >= 5) { @@ -5061,7 +5063,8 @@ class assign { $usershtml = ''; $usercount = 0; - $extrauserfields = get_extra_user_fields($this->get_context()); + // TODO Does not support custom user profile fields (MDL-70456). + $extrauserfields = \core\user_fields::get_identity_fields($this->get_context(), false); $viewfullnames = has_capability('moodle/site:viewfullnames', $this->get_context()); foreach ($userlist as $userid) { if ($usercount >= 5) { diff --git a/mod/assign/override_form.php b/mod/assign/override_form.php index a317285c2f3..3a4d4cbada0 100644 --- a/mod/assign/override_form.php +++ b/mod/assign/override_form.php @@ -156,12 +156,13 @@ class assign_override_form extends moodleform { list($sort) = users_order_by_sql('u'); // Get the list of appropriate users, depending on whether and how groups are used. + $userfieldsapi = \core\user_fields::for_name(); if ($accessallgroups) { $users = get_enrolled_users($this->context, '', 0, - 'u.id, u.email, ' . get_all_user_name_fields(true, 'u'), $sort); + 'u.id, u.email, ' . $userfieldsapi->get_sql('u', false, '', '', false)->selects, $sort); } else if ($groups = groups_get_activity_allowed_groups($cm)) { $enrolledjoin = get_enrolled_join($this->context, 'u.id'); - $userfields = 'u.id, u.email, ' . get_all_user_name_fields(true, 'u'); + $userfields = 'u.id, u.email, ' . $userfieldsapi->get_sql('u', false, '', '', false)->selects; list($ingroupsql, $ingroupparams) = $DB->get_in_or_equal(array_keys($groups), SQL_PARAMS_NAMED); $params = $enrolledjoin->params + $ingroupparams; $sql = "SELECT $userfields @@ -185,7 +186,8 @@ class assign_override_form extends moodleform { } $userchoices = array(); - $canviewemail = in_array('email', get_extra_user_fields($this->context)); + // TODO Does not support custom user profile fields (MDL-70456). + $canviewemail = in_array('email', \core\user_fields::get_identity_fields($this->context, false)); foreach ($users as $id => $user) { if (empty($invalidusers[$id]) || (!empty($override) && $id == $override->userid)) { diff --git a/mod/assign/overridedelete.php b/mod/assign/overridedelete.php index b96999a9be9..60630337920 100644 --- a/mod/assign/overridedelete.php +++ b/mod/assign/overridedelete.php @@ -90,7 +90,8 @@ if ($override->groupid) { $group = $DB->get_record('groups', array('id' => $override->groupid), 'id, name'); $confirmstr = get_string("overridedeletegroupsure", "assign", $group->name); } else { - $namefields = get_all_user_name_fields(true); + $userfieldsapi = \core\user_fields::for_name(); + $namefields = $userfieldsapi->get_sql('', false, '', '', false)->selects; $user = $DB->get_record('user', array('id' => $override->userid), 'id, ' . $namefields); $confirmstr = get_string("overridedeleteusersure", "assign", fullname($user)); diff --git a/mod/assign/overrides.php b/mod/assign/overrides.php index effc9df7e19..aa07023ec7f 100644 --- a/mod/assign/overrides.php +++ b/mod/assign/overrides.php @@ -121,8 +121,9 @@ if ($groupmode) { list($sort, $params) = users_order_by_sql('u'); $params['assignid'] = $assign->id; + $userfieldsapi = \core\user_fields::for_name(); if ($accessallgroups) { - $sql = 'SELECT o.*, ' . get_all_user_name_fields(true, 'u') . ' + $sql = 'SELECT o.*, ' . $userfieldsapi->get_sql('u', false, '', '', false)->selects . ' FROM {assign_overrides} o JOIN {user} u ON o.userid = u.id WHERE o.assignid = :assignid @@ -133,7 +134,7 @@ if ($groupmode) { list($insql, $inparams) = $DB->get_in_or_equal(array_keys($groups), SQL_PARAMS_NAMED); $params += $inparams; - $sql = 'SELECT o.*, ' . get_all_user_name_fields(true, 'u') . ' + $sql = 'SELECT o.*, ' . $userfieldsapi->get_sql('u', false, '', '', false)->selects . ' FROM {assign_overrides} o JOIN {user} u ON o.userid = u.id JOIN {groups_members} gm ON u.id = gm.userid diff --git a/mod/chat/lib.php b/mod/chat/lib.php index 478fe8be7b5..9a2b1bf0793 100644 --- a/mod/chat/lib.php +++ b/mod/chat/lib.php @@ -372,7 +372,8 @@ function chat_print_recent_activity($course, $viewfullnames, $timestart) { $groupselect = ""; } - $userfields = user_picture::fields('u'); + $userfieldsapi = \core\user_fields::for_userpic(); + $userfields = $userfieldsapi->get_sql('u', false, '', '', false)->selects; if (!$users = $DB->get_records_sql("SELECT $userfields FROM {course_modules} cm JOIN {chat} ch ON ch.id = cm.instance @@ -513,7 +514,8 @@ function chat_get_users($chatid, $groupid=0, $groupingid=0) { $groupingjoin = ''; } - $ufields = user_picture::fields('u'); + $userfieldsapi = \core\user_fields::for_userpic(); + $ufields = $userfieldsapi->get_sql('u', false, '', '', false)->selects; return $DB->get_records_sql("SELECT DISTINCT $ufields, c.lastmessageping, c.firstping FROM {chat_users} c JOIN {user} u ON u.id = c.userid $groupingjoin @@ -905,7 +907,7 @@ function chat_format_message($message, $courseid, $currentuser, $chatlastrow=nul if (isset($users[$message->userid])) { $user = $users[$message->userid]; - } else if ($user = $DB->get_record('user', array('id' => $message->userid), user_picture::fields())) { + } else if ($user = $DB->get_record('user', array('id' => $message->userid), implode(',', \core\user_fields::get_picture_fields()))) { $users[$message->userid] = $user; } else { return null; @@ -936,7 +938,7 @@ function chat_format_message_theme ($message, $chatuser, $currentuser, $grouping if (isset($users[$message->userid])) { $sender = $users[$message->userid]; - } else if ($sender = $DB->get_record('user', array('id' => $message->userid), user_picture::fields())) { + } else if ($sender = $DB->get_record('user', array('id' => $message->userid), implode(',', \core\user_fields::get_picture_fields()))) { $users[$message->userid] = $sender; } else { return null; diff --git a/mod/choice/lib.php b/mod/choice/lib.php index 4096c8b62a4..f4b9585547f 100644 --- a/mod/choice/lib.php +++ b/mod/choice/lib.php @@ -798,9 +798,11 @@ function choice_get_response_data($choice, $cm, $groupmode, $onlyactive) { /// First get all the users who have access here /// To start with we assume they are all "unanswered" then move them later - $extrafields = get_extra_user_fields($context); + // TODO Does not support custom user profile fields (MDL-70456). + $userfieldsapi = \core\user_fields::for_identity($context, false)->with_userpic(); + $userfields = $userfieldsapi->get_sql('u', false, '', '', false)->selects; $allresponses[0] = get_enrolled_users($context, 'mod/choice:choose', $currentgroup, - user_picture::fields('u', $extrafields), null, 0, 0, $onlyactive); + $userfields, null, 0, 0, $onlyactive); /// Get all the recorded responses for this choice $rawresponses = $DB->get_records('choice_answers', array('choiceid' => $choice->id)); diff --git a/mod/choice/report.php b/mod/choice/report.php index 9c9ea4c55c9..b78a93d2c04 100644 --- a/mod/choice/report.php +++ b/mod/choice/report.php @@ -95,7 +95,8 @@ $users = choice_get_response_data($choice, $cm, $groupmode, $onlyactive); - $extrafields = get_extra_user_fields($context); + // TODO Does not support custom user profile fields (MDL-70456). + $extrafields = \core\user_fields::get_identity_fields($context, false); if ($download == "ods" && has_capability('mod/choice:downloadresponses', $context)) { require_once("$CFG->libdir/odslib.class.php"); @@ -118,7 +119,7 @@ // Add headers for extra user fields. foreach ($extrafields as $field) { - $myxls->write_string(0, $i++, get_user_field_name($field)); + $myxls->write_string(0, $i++, \core\user_fields::get_display_name($field)); } $myxls->write_string(0, $i++, get_string("group")); @@ -179,7 +180,7 @@ // Add headers for extra user fields. foreach ($extrafields as $field) { - $myxls->write_string(0, $i++, get_user_field_name($field)); + $myxls->write_string(0, $i++, \core\user_fields::get_display_name($field)); } $myxls->write_string(0, $i++, get_string("group")); @@ -235,7 +236,7 @@ // Add headers for extra user fields. foreach ($extrafields as $field) { - echo get_user_field_name($field) . "\t"; + echo \core\user_fields::get_display_name($field) . "\t"; } echo get_string("group"). "\t"; diff --git a/mod/data/lib.php b/mod/data/lib.php index b26423a97a8..18c706399b5 100644 --- a/mod/data/lib.php +++ b/mod/data/lib.php @@ -4118,9 +4118,8 @@ function data_get_recordids($alias, $searcharray, $dataid, $recordids) { function data_get_advanced_search_sql($sort, $data, $recordids, $selectdata, $sortorder) { global $DB; - $namefields = user_picture::fields('u'); - // Remove the id from the string. This already exists in the sql statement. - $namefields = str_replace('u.id,', '', $namefields); + $userfieldsapi = \core\user_fields::for_userpic()->excluding('id'); + $namefields = $userfieldsapi->get_sql('u', false, '', '', false)->selects; if ($sort == 0) { $nestselectsql = 'SELECT r.id, r.approved, r.timecreated, r.timemodified, r.userid, ' . $namefields . ' diff --git a/mod/data/locallib.php b/mod/data/locallib.php index c91540845d6..9e99e42c953 100644 --- a/mod/data/locallib.php +++ b/mod/data/locallib.php @@ -1112,9 +1112,8 @@ function data_search_entries($data, $cm, $context, $mode, $currentgroup, $search $advparams = array(); // This is used for the initial reduction of advanced search results with required entries. $entrysql = ''; - $namefields = user_picture::fields('u'); - // Remove the id from the string. This already exists in the sql statement. - $namefields = str_replace('u.id,', '', $namefields); + $userfieldsapi = \core\user_fields::for_userpic()->excluding('id'); + $namefields = $userfieldsapi->get_sql('u', false, '', '', false)->selects; // Find the field we are sorting on. if ($sort <= 0 or !$sortfield = data_get_field_from_id($sort, $data)) { diff --git a/mod/data/preset.php b/mod/data/preset.php index d76becd15ad..df23f319bcf 100644 --- a/mod/data/preset.php +++ b/mod/data/preset.php @@ -62,7 +62,8 @@ $presets = data_get_available_presets($context); $strdelete = get_string('deleted', 'data'); foreach ($presets as &$preset) { if (!empty($preset->userid)) { - $namefields = get_all_user_name_fields(true); + $userfieldsapi = \core\user_fields::for_name(); + $namefields = $userfieldsapi->get_sql('', false, '', '', false)->selects; $presetuser = $DB->get_record('user', array('id' => $preset->userid), 'id, ' . $namefields, MUST_EXIST); $preset->description = $preset->name.' ('.fullname($presetuser, true).')'; } else { diff --git a/mod/data/view.php b/mod/data/view.php index 5f7800e1cef..bde4875c1f3 100644 --- a/mod/data/view.php +++ b/mod/data/view.php @@ -294,9 +294,8 @@ echo $OUTPUT->notification(get_string('recorddeleted','data'), 'notifysuccess'); } } else { // Print a confirmation page - $allnamefields = user_picture::fields('u'); - // Remove the id from the string. This already exists in the sql statement. - $allnamefields = str_replace('u.id,', '', $allnamefields); + $userfieldsapi = \core\user_fields::for_userpic()->excluding('id'); + $allnamefields = $userfieldsapi->get_sql('u', false, '', '', false)->selects; $dbparams = array($delete); if ($deleterecord = $DB->get_record_sql("SELECT dr.*, $allnamefields FROM {data_records} dr @@ -332,9 +331,8 @@ $validrecords = array(); $recordids = array(); foreach ($multidelete as $value) { - $allnamefields = user_picture::fields('u'); - // Remove the id from the string. This already exists in the sql statement. - $allnamefields = str_replace('u.id,', '', $allnamefields); + $userfieldsapi = \core\user_fields::for_userpic()->excluding('id'); + $allnamefields = $userfieldsapi->get_sql('u', false, '', '', false)->selects; $dbparams = array('id' => $value); if ($deleterecord = $DB->get_record_sql("SELECT dr.*, $allnamefields FROM {data_records} dr diff --git a/mod/feedback/classes/responses_table.php b/mod/feedback/classes/responses_table.php index 84d477b5ac9..66ab1083141 100644 --- a/mod/feedback/classes/responses_table.php +++ b/mod/feedback/classes/responses_table.php @@ -120,8 +120,10 @@ class mod_feedback_responses_table extends table_sql { get_string('groups') ); - $extrafields = get_extra_user_fields($this->get_context()); - $ufields = user_picture::fields('u', $extrafields, $this->useridfield); + // TODO Does not support custom user profile fields (MDL-70456). + $userfieldsapi = \core\user_fields::for_identity($this->get_context(), false)->with_userpic(); + $ufields = $userfieldsapi->get_sql('u', false, '', $this->useridfield, false)->selects; + $extrafields = $userfieldsapi->get_required_fields([\core\user_fields::PURPOSE_IDENTITY]); $fields = 'c.id, c.timemodified as completed_timemodified, c.courseid, '.$ufields; $from = '{feedback_completed} c ' . 'JOIN {user} u ON u.id = c.userid AND u.deleted = :notdeleted'; @@ -141,7 +143,7 @@ class mod_feedback_responses_table extends table_sql { foreach ($extrafields as $field) { $fields .= ", u.{$field}"; $tablecolumns[] = $field; - $tableheaders[] = get_user_field_name($field); + $tableheaders[] = \core\user_fields::get_display_name($field); } } diff --git a/mod/feedback/lib.php b/mod/feedback/lib.php index 621bb385b43..2d0d52c7f33 100644 --- a/mod/feedback/lib.php +++ b/mod/feedback/lib.php @@ -388,7 +388,8 @@ function feedback_get_recent_mod_activity(&$activities, &$index, $sqlargs = array(); - $userfields = user_picture::fields('u', null, 'useridagain'); + $userfieldsapi = \core\user_fields::for_userpic(); + $userfields = $userfieldsapi->get_sql('u', false, '', 'useridagain', false)->selects; $sql = " SELECT fk . * , fc . * , $userfields FROM {feedback_completed} fc JOIN {feedback} fk ON fk.id = fc.feedback @@ -985,7 +986,8 @@ function feedback_get_incomplete_users(cm_info $cm, //first get all user who can complete this feedback $cap = 'mod/feedback:complete'; - $allnames = get_all_user_name_fields(true, 'u'); + $userfieldsapi = \core\user_fields::for_name(); + $allnames = $userfieldsapi->get_sql('u', false, '', '', false)->selects; $fields = 'u.id, ' . $allnames . ', u.picture, u.email, u.imagealt'; if (!$allusers = get_users_by_capability($context, $cap, @@ -1122,7 +1124,8 @@ function feedback_get_complete_users($cm, $sortsql = ''; } - $ufields = user_picture::fields('u'); + $userfieldsapi = \core\user_fields::for_userpic(); + $ufields = $userfieldsapi->get_sql('u', false, '', '', false)->selects; $sql = 'SELECT DISTINCT '.$ufields.', c.timemodified as completed_timemodified FROM {user} u, {feedback_completed} c '.$fromgroup.' WHERE '.$where.' anonymous_response = :anon diff --git a/mod/forum/classes/form/export_form.php b/mod/forum/classes/form/export_form.php index fb571f94263..93647c699d6 100644 --- a/mod/forum/classes/form/export_form.php +++ b/mod/forum/classes/form/export_form.php @@ -57,7 +57,8 @@ class export_form extends \moodleform { 'valuehtmlcallback' => function($value) { global $OUTPUT; - $allusernames = get_all_user_name_fields(true); + $userfieldsapi = \core\user_fields::for_name(); + $allusernames = $userfieldsapi->get_sql('', false, '', '', false)->selects; $fields = 'id, ' . $allusernames; $user = \core_user::get_user($value, $fields); $useroptiondata = [ diff --git a/mod/forum/classes/local/vaults/discussion_list.php b/mod/forum/classes/local/vaults/discussion_list.php index 07bc0dbfb85..ac8cd0307e5 100644 --- a/mod/forum/classes/local/vaults/discussion_list.php +++ b/mod/forum/classes/local/vaults/discussion_list.php @@ -131,8 +131,11 @@ class discussion_list extends db_table_vault { // - Most recent editor. $thistable = new dml_table(self::TABLE, $alias, $alias); $posttable = new dml_table('forum_posts', 'fp', 'p_'); - $firstauthorfields = \user_picture::fields('fa', ['deleted'], self::FIRST_AUTHOR_ID_ALIAS, self::FIRST_AUTHOR_ALIAS); - $latestuserfields = \user_picture::fields('la', ['deleted'], self::LATEST_AUTHOR_ID_ALIAS, self::LATEST_AUTHOR_ALIAS); + $userfieldsapi = \core\user_fields::for_userpic()->including('deleted'); + $firstauthorfields = $userfieldsapi->get_sql('fa', false, + self::FIRST_AUTHOR_ALIAS, self::FIRST_AUTHOR_ID_ALIAS, false)->selects; + $latestuserfields = $userfieldsapi->get_sql('la', false, + self::LATEST_AUTHOR_ALIAS, self::LATEST_AUTHOR_ID_ALIAS, false)->selects; $fields = implode(', ', [ $thistable->get_field_select(), @@ -271,7 +274,7 @@ class discussion_list extends db_table_vault { $nameformat = get_string('fullnamedisplay', '', (object)['firstname' => 'firstname', 'lastname' => 'lastname']); } // Fetch all the available user name fields. - $availablefields = order_in_string(get_all_user_name_fields(), $nameformat); + $availablefields = order_in_string(\core\user_fields::get_name_fields(), $nameformat); // We'll default to the first name if there's no available name field. $returnfield = 'firstname'; if (!empty($availablefields)) { diff --git a/mod/forum/classes/subscriptions.php b/mod/forum/classes/subscriptions.php index af3f57e1e6f..7982357ef7e 100644 --- a/mod/forum/classes/subscriptions.php +++ b/mod/forum/classes/subscriptions.php @@ -393,7 +393,8 @@ class subscriptions { global $CFG, $DB; if (empty($fields)) { - $allnames = get_all_user_name_fields(true, 'u'); + $userfieldsapi = \core\user_fields::for_name(); + $allnames = $userfieldsapi->get_sql('u', false, '', '', false)->selects; $fields ="u.id, u.username, $allnames, diff --git a/mod/forum/deprecatedlib.php b/mod/forum/deprecatedlib.php index 330f05bbf25..5a4e6aad02a 100644 --- a/mod/forum/deprecatedlib.php +++ b/mod/forum/deprecatedlib.php @@ -839,7 +839,7 @@ function forum_print_post($post, $discussion, $forum, &$cm, $course, $ownpost=fa // Build an object that represents the posting user $postuser = new stdClass; - $postuserfields = explode(',', user_picture::fields()); + $postuserfields = explode(',', implode(',', \core\user_fields::get_picture_fields())); $postuser = username_load_fields_from_object($postuser, $post, null, $postuserfields); $postuser->id = $post->userid; $postuser->fullname = fullname($postuser, $cm->cache->caps['moodle/site:viewfullnames']); diff --git a/mod/forum/externallib.php b/mod/forum/externallib.php index 1a6e1a319e2..0df7c0f8ae4 100644 --- a/mod/forum/externallib.php +++ b/mod/forum/externallib.php @@ -674,7 +674,7 @@ class mod_forum_external extends external_api { $discussion->usermodifiedfullname = null; $discussion->usermodifiedpictureurl = null; } else { - $picturefields = explode(',', user_picture::fields()); + $picturefields = explode(',', implode(',', \core\user_fields::get_picture_fields())); // Load user objects from the results of the query. $user = new stdclass(); diff --git a/mod/forum/lib.php b/mod/forum/lib.php index 579c9414cb2..7384a3b5b04 100644 --- a/mod/forum/lib.php +++ b/mod/forum/lib.php @@ -644,7 +644,8 @@ function forum_print_recent_activity($course, $viewfullnames, $timestart) { // do not use log table if possible, it may be huge and is expensive to join with other tables - $allnamefields = user_picture::fields('u', null, 'duserid'); + $userfieldsapi = \core\user_fields::for_userpic(); + $allnamefields = $userfieldsapi->get_sql('u', false, '', 'duserid', false)->selects; if (!$posts = $DB->get_records_sql("SELECT p.*, f.course, f.type AS forumtype, f.name AS forumname, f.intro, f.introformat, f.duedate, f.cutoffdate, f.assessed AS forumassessed, f.assesstimestart, f.assesstimefinish, @@ -971,7 +972,8 @@ function forum_scale_used_anywhere(int $scaleid): bool { function forum_get_post_full($postid) { global $CFG, $DB; - $allnames = get_all_user_name_fields(true, 'u'); + $userfieldsapi = \core\user_fields::for_name(); + $allnames = $userfieldsapi->get_sql('u', false, '', '', false)->selects; return $DB->get_record_sql("SELECT p.*, d.forum, $allnames, u.email, u.picture, u.imagealt FROM {forum_posts} p JOIN {forum_discussions} d ON p.discussion = d.id @@ -1000,7 +1002,8 @@ function forum_get_all_discussion_posts($discussionid, $sort, $tracking = false) $params[] = $USER->id; } - $allnames = get_all_user_name_fields(true, 'u'); + $userfieldsapi = \core\user_fields::for_name(); + $allnames = $userfieldsapi->get_sql('u', false, '', '', false)->selects; $params[] = $discussionid; if (!$posts = $DB->get_records_sql("SELECT p.*, $allnames, u.email, u.picture, u.imagealt $tr_sel FROM {forum_posts} p @@ -1298,7 +1301,8 @@ function forum_search_posts($searchterms, $courseid=0, $limitfrom=0, $limitnum=5 FROM $fromsql WHERE $selectsql"; - $allnames = get_all_user_name_fields(true, 'u'); + $userfieldsapi = \core\user_fields::for_name(); + $allnames = $userfieldsapi->get_sql('u', false, '', '', false)->selects; $searchsql = "SELECT p.*, d.forum, $allnames, @@ -1338,7 +1342,8 @@ function forum_get_user_posts($forumid, $userid) { } } - $allnames = get_all_user_name_fields(true, 'u'); + $userfieldsapi = \core\user_fields::for_name(); + $allnames = $userfieldsapi->get_sql('u', false, '', '', false)->selects; return $DB->get_records_sql("SELECT p.*, d.forum, $allnames, u.email, u.picture, u.imagealt FROM {forum} f JOIN {forum_discussions} d ON d.forum = f.id @@ -1429,7 +1434,8 @@ function forum_count_user_posts($forumid, $userid) { function forum_get_post_from_log($log) { global $CFG, $DB; - $allnames = get_all_user_name_fields(true, 'u'); + $userfieldsapi = \core\user_fields::for_name(); + $allnames = $userfieldsapi->get_sql('u', false, '', '', false)->selects; if ($log->action == "add post") { return $DB->get_record_sql("SELECT p.*, f.type AS forumtype, d.forum, d.groupid, $allnames, u.email, u.picture @@ -1757,11 +1763,13 @@ function forum_get_discussions($cm, $forumsort="", $fullpost=true, $unused=-1, $ $postdata = "p.*"; } + $userfieldsapi = \core\user_fields::for_name(); + if (empty($userlastmodified)) { // We don't need to know this $umfields = ""; $umtable = ""; } else { - $umfields = ', ' . get_all_user_name_fields(true, 'um', null, 'um') . ', um.email AS umemail, um.picture AS umpicture, + $umfields = $userfieldsapi->get_sql('um', false, 'um')->selects . ', um.email AS umemail, um.picture AS umpicture, um.imagealt AS umimagealt'; $umtable = " LEFT JOIN {user} um ON (d.usermodified = um.id)"; } @@ -1775,7 +1783,7 @@ function forum_get_discussions($cm, $forumsort="", $fullpost=true, $unused=-1, $ $discussionfields = "d.id as discussionid, d.course, d.forum, d.name, d.firstpost, d.groupid, d.assessed," . " d.timemodified, d.usermodified, d.timestart, d.timeend, d.pinned, d.timelocked"; - $allnames = get_all_user_name_fields(true, 'u'); + $allnames = $userfieldsapi->get_sql('u', false, '', '', false)->selects; $sql = "SELECT $postdata, $discussionfields, $allnames, u.email, u.picture, u.imagealt $umfields FROM {forum_discussions} d @@ -2431,7 +2439,7 @@ function forum_print_discussion_header(&$post, $forum, $group = -1, $datestring // Picture $postuser = new stdClass(); - $postuserfields = explode(',', user_picture::fields()); + $postuserfields = explode(',', implode(',', \core\user_fields::get_picture_fields())); $postuser = username_load_fields_from_object($postuser, $post, null, $postuserfields); $postuser->id = $post->userid; echo '