mirror of
https://github.com/moodle/moodle.git
synced 2025-08-04 16:36:37 +02:00
MDL-73693 reportbuilder: report filter by specific user.
This commit is contained in:
parent
5500d143f4
commit
9ec385a533
2 changed files with 56 additions and 1 deletions
|
@ -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 ['', []];
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue