From 3df91d98f42811662f05272d2012d4aa190c5bd8 Mon Sep 17 00:00:00 2001 From: Paul Holden Date: Tue, 15 Apr 2025 15:26:49 +0100 Subject: [PATCH] MDL-82132 user: re-factor code for generating dummy user fullname. --- lib/classes/user.php | 22 +++++++++++++--- lib/tests/user_test.php | 26 +++++++++++++++++++ reportbuilder/classes/local/entities/user.php | 5 ++-- user/classes/fields.php | 6 ++--- user/upgrade.txt | 5 ++++ 5 files changed, 54 insertions(+), 10 deletions(-) diff --git a/lib/classes/user.php b/lib/classes/user.php index 06dbd91fa1d..7c9169426a3 100644 --- a/lib/classes/user.php +++ b/lib/classes/user.php @@ -1401,6 +1401,22 @@ class core_user { return $displayname; } + /** + * Return fullname of a dummy user comprised of configured name fields only + * + * @param context|null $context + * @param array $options + * @return string + */ + public static function get_dummy_fullname(?context $context = null, array $options = []): string { + + // Create a dummy user object containing all name fields. + $namefields = \core_user\fields::get_name_fields(); + $user = (object) array_combine($namefields, $namefields); + + return static::get_fullname($user, $context, $options); + } + /** * Return profile url depending on context. * @@ -1471,10 +1487,10 @@ class core_user { public static function get_initials(stdClass $user): string { // Get the available name fields. $namefields = \core_user\fields::get_name_fields(); - // Build a dummy user to determine the name format. - $dummyuser = array_combine($namefields, $namefields); + // Determine the name format by using fullname() and passing the dummy user. - $nameformat = fullname((object) $dummyuser); + $nameformat = static::get_dummy_fullname(); + // Fetch all the available username fields. $availablefields = order_in_string($namefields, $nameformat); // We only want the first and last name fields. diff --git a/lib/tests/user_test.php b/lib/tests/user_test.php index 980eebd38c4..082341808af 100644 --- a/lib/tests/user_test.php +++ b/lib/tests/user_test.php @@ -875,6 +875,32 @@ final class user_test extends \advanced_testcase { $this->assertEquals('John Doe', \core_user::get_fullname($user, $context, $options)); } + /** + * Test retrieving dummy user fullname + * + * @covers \core_user::get_dummy_fullname + */ + public function test_get_dummy_fullname(): void { + $context = \context_system::instance(); + + // Show real name as the force names config are not set. + $this->assertEquals('firstname lastname', \core_user::get_dummy_fullname($context)); + + // With override, still show real name. + $options = ['override' => true]; + $this->assertEquals('firstname lastname', \core_user::get_dummy_fullname($context, $options)); + + // Set the alternative names config. + set_config('alternativefullnameformat', 'alternatename lastname firstname'); + + // Show default name format. + $this->assertEquals('firstname lastname', \core_user::get_dummy_fullname($context)); + + // With override, show alternative name format. + $options = ['override' => true]; + $this->assertEquals('alternatename lastname firstname', \core_user::get_dummy_fullname($context, $options)); + } + /** * Test for function to get user details. * diff --git a/reportbuilder/classes/local/entities/user.php b/reportbuilder/classes/local/entities/user.php index ff1d6016114..9363754c48e 100644 --- a/reportbuilder/classes/local/entities/user.php +++ b/reportbuilder/classes/local/entities/user.php @@ -23,6 +23,7 @@ use context_system; use context_user; use core\context; use core_component; +use core_user; use html_writer; use lang_string; use moodle_url; @@ -399,10 +400,8 @@ class user extends base { $namefields = fields::get_name_fields(true); - // Create a dummy user object containing all name fields. - $dummyuser = (object) array_combine($namefields, $namefields); $viewfullnames = has_capability('moodle/site:viewfullnames', context_system::instance()); - $dummyfullname = fullname($dummyuser, $viewfullnames); + $dummyfullname = core_user::get_dummy_fullname(null, ['override' => $viewfullnames]); // Extract any name fields from the fullname format in the order that they appear. $matchednames = array_values(order_in_string($namefields, $dummyfullname)); diff --git a/user/classes/fields.php b/user/classes/fields.php index c4154d83308..4da49487e38 100644 --- a/user/classes/fields.php +++ b/user/classes/fields.php @@ -17,6 +17,7 @@ namespace core_user; use core_text; +use core_user; /** * Class for retrieving information about user fields that are needed for displaying user identity. @@ -585,10 +586,7 @@ class fields { $unique = self::$uniqueidentifier++; $namefields = self::get_name_fields(); - - // Create a dummy user object containing all name fields. - $dummyuser = (object) array_combine($namefields, $namefields); - $dummyfullname = fullname($dummyuser, $override); + $dummyfullname = core_user::get_dummy_fullname(null, ['override' => $override]); // Extract any name fields from the fullname format in the order that they appear. $matchednames = array_values(order_in_string($namefields, $dummyfullname)); diff --git a/user/upgrade.txt b/user/upgrade.txt index 884fb003539..6c551730c56 100644 --- a/user/upgrade.txt +++ b/user/upgrade.txt @@ -1,5 +1,10 @@ This files describes API changes for code that uses the user API. +=== 4.4.9 === + +* New method `\core_user::get_dummy_fullname(...)` for returning dummy user fullname comprised of configured name + fields only + === 4.4.4 === * The user profile field `display_name()` method now accepts an optional `$escape` parameter to define whether to