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;
|
namespace core_reportbuilder\local\filters;
|
||||||
|
|
||||||
|
use context_system;
|
||||||
|
use core_user;
|
||||||
use lang_string;
|
use lang_string;
|
||||||
use MoodleQuickForm;
|
use MoodleQuickForm;
|
||||||
use core_reportbuilder\local\helpers\database;
|
use core_reportbuilder\local\helpers\database;
|
||||||
|
@ -39,6 +41,9 @@ class user extends base {
|
||||||
/** @var int Filter for current user */
|
/** @var int Filter for current user */
|
||||||
public const USER_CURRENT = 1;
|
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
|
* Return an array of operators available for this filter
|
||||||
*
|
*
|
||||||
|
@ -48,6 +53,7 @@ class user extends base {
|
||||||
$operators = [
|
$operators = [
|
||||||
self::USER_ANY => new lang_string('userany', 'core_reportbuilder'),
|
self::USER_ANY => new lang_string('userany', 'core_reportbuilder'),
|
||||||
self::USER_CURRENT => new lang_string('usercurrent', '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);
|
return $this->filter->restrict_limited_operators($operators);
|
||||||
|
@ -65,6 +71,18 @@ class user extends base {
|
||||||
|
|
||||||
$mform->setType("{$this->name}_operator", PARAM_INT);
|
$mform->setType("{$this->name}_operator", PARAM_INT);
|
||||||
$mform->setDefault("{$this->name}_operator", self::USER_ANY);
|
$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
|
* @return array
|
||||||
*/
|
*/
|
||||||
public function get_sql_filter(array $values): array {
|
public function get_sql_filter(array $values): array {
|
||||||
global $USER;
|
global $DB, $USER;
|
||||||
|
|
||||||
$fieldsql = $this->filter->get_field_sql();
|
$fieldsql = $this->filter->get_field_sql();
|
||||||
$params = $this->filter->get_field_params();
|
$params = $this->filter->get_field_params();
|
||||||
|
|
||||||
$operator = $values["{$this->name}_operator"] ?? self::USER_ANY;
|
$operator = $values["{$this->name}_operator"] ?? self::USER_ANY;
|
||||||
|
$userids = $values["{$this->name}_value"] ?? [];
|
||||||
|
|
||||||
switch ($operator) {
|
switch ($operator) {
|
||||||
case self::USER_CURRENT:
|
case self::USER_CURRENT:
|
||||||
$paramuserid = database::generate_param_name();
|
$paramuserid = database::generate_param_name();
|
||||||
$sql = "{$fieldsql} = :{$paramuserid}";
|
$sql = "{$fieldsql} = :{$paramuserid}";
|
||||||
$params[$paramuserid] = $USER->id;
|
$params[$paramuserid] = $USER->id;
|
||||||
break;
|
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:
|
default:
|
||||||
// Invalid or inactive filter.
|
// Invalid or inactive filter.
|
||||||
return ['', []];
|
return ['', []];
|
||||||
|
|
|
@ -79,4 +79,33 @@ class user_test extends advanced_testcase {
|
||||||
$usernames = $DB->get_fieldset_select('user', 'username', $select, $params);
|
$usernames = $DB->get_fieldset_select('user', 'username', $select, $params);
|
||||||
$this->assertEqualsCanonicalizing($expectedusernames, $usernames);
|
$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