diff --git a/reportbuilder/classes/local/filters/user.php b/reportbuilder/classes/local/filters/user.php index b794bbd72b2..033f6bbf6ca 100644 --- a/reportbuilder/classes/local/filters/user.php +++ b/reportbuilder/classes/local/filters/user.php @@ -18,6 +18,8 @@ declare(strict_types=1); namespace core_reportbuilder\local\filters; +use context_system; +use core_user; use lang_string; use MoodleQuickForm; use core_reportbuilder\local\helpers\database; @@ -39,6 +41,9 @@ class user extends base { /** @var int Filter for current user */ public const USER_CURRENT = 1; + /** @var int Filter for selected user */ + public const USER_SELECT = 2; + /** * Return an array of operators available for this filter * @@ -48,6 +53,7 @@ class user extends base { $operators = [ self::USER_ANY => new lang_string('userany', 'core_reportbuilder'), self::USER_CURRENT => new lang_string('usercurrent', 'core_reportbuilder'), + self::USER_SELECT => new lang_string('select'), ]; return $this->filter->restrict_limited_operators($operators); @@ -65,6 +71,18 @@ class user extends base { $mform->setType("{$this->name}_operator", PARAM_INT); $mform->setDefault("{$this->name}_operator", self::USER_ANY); + + $options = [ + 'ajax' => 'core_user/form_user_selector', + 'multiple' => true, + 'valuehtmlcallback' => static function($userid): string { + $user = core_user::get_user($userid); + return fullname($user, has_capability('moodle/site:viewfullnames', context_system::instance())); + } + ]; + $mform->addElement('autocomplete', "{$this->name}_value", get_string('user'), [], $options) + ->setHiddenLabel(true); + $mform->hideIf("{$this->name}_value", "{$this->name}_operator", 'neq', self::USER_SELECT); } /** @@ -74,18 +92,26 @@ class user extends base { * @return array */ public function get_sql_filter(array $values): array { - global $USER; + global $DB, $USER; $fieldsql = $this->filter->get_field_sql(); $params = $this->filter->get_field_params(); $operator = $values["{$this->name}_operator"] ?? self::USER_ANY; + $userids = $values["{$this->name}_value"] ?? []; + switch ($operator) { case self::USER_CURRENT: $paramuserid = database::generate_param_name(); $sql = "{$fieldsql} = :{$paramuserid}"; $params[$paramuserid] = $USER->id; break; + case self::USER_SELECT: + $paramuserid = database::generate_param_name(); + [$useridselect, $useridparams] = $DB->get_in_or_equal($userids, SQL_PARAMS_NAMED, "{$paramuserid}_", true, null); + $sql = "{$fieldsql} {$useridselect}"; + $params = array_merge($params, $useridparams); + break; default: // Invalid or inactive filter. return ['', []]; diff --git a/reportbuilder/tests/local/filters/user_test.php b/reportbuilder/tests/local/filters/user_test.php index 17dc3442656..a9cc75590bf 100644 --- a/reportbuilder/tests/local/filters/user_test.php +++ b/reportbuilder/tests/local/filters/user_test.php @@ -79,4 +79,33 @@ class user_test extends advanced_testcase { $usernames = $DB->get_fieldset_select('user', 'username', $select, $params); $this->assertEqualsCanonicalizing($expectedusernames, $usernames); } + + /** + * Test getting filter SQL using specific user selection operator/value + */ + public function test_get_sql_filter_select_user(): void { + global $DB; + + $this->resetAfterTest(); + + $user01 = $this->getDataGenerator()->create_user(['username' => 'user01']); + $user02 = $this->getDataGenerator()->create_user(['username' => 'user02']); + + $filter = new filter( + user::class, + 'test', + new lang_string('yes'), + 'testentity', + 'id' + ); + + // Create instance of our filter, passing given operator/value matching second user. + [$select, $params] = user::create($filter)->get_sql_filter([ + $filter->get_unique_identifier() . '_operator' => user::USER_SELECT, + $filter->get_unique_identifier() . '_value' => [$user02->id], + ]); + + $usernames = $DB->get_fieldset_select('user', 'username', $select, $params); + $this->assertEquals([$user02->username], $usernames); + } }