From e56e9cd6de70dd3d99cfbafa50c8a8114f71a3bc Mon Sep 17 00:00:00 2001 From: Paul Holden Date: Tue, 12 Dec 2023 15:35:54 +0000 Subject: [PATCH] MDL-80329 reportbuilder: trim whitespace in text filter content. --- .../reportbuilder/local/filters/courserole.php | 4 ++-- .../reportbuilder/local/filters/courserole_test.php | 1 + reportbuilder/classes/local/filters/text.php | 12 ++++-------- reportbuilder/tests/local/filters/text_test.php | 6 ++++++ 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/admin/classes/reportbuilder/local/filters/courserole.php b/admin/classes/reportbuilder/local/filters/courserole.php index 162a1aeff21dd..99cf70d9333e0 100644 --- a/admin/classes/reportbuilder/local/filters/courserole.php +++ b/admin/classes/reportbuilder/local/filters/courserole.php @@ -53,7 +53,7 @@ public function setup_form(MoodleQuickForm $mform): void { // Course. $elements['course'] = $mform->createElement('text', "{$this->name}_course", get_string('shortnamecourse')); - $mform->setType("{$this->name}_course", PARAM_RAW); + $mform->setType("{$this->name}_course", PARAM_RAW_TRIMMED); $mform->addElement('group', "{$this->name}_group", '', $elements, '', false); } @@ -85,7 +85,7 @@ public function get_sql_filter(array $values): array { } // Course. - $course = $values["{$this->name}_course"] ?? ''; + $course = trim($values["{$this->name}_course"] ?? ''); if ($course !== '') { $selects[] = "{$coursealias}.shortname = :{$courseparam}"; $params[$courseparam] = $course; diff --git a/admin/tests/reportbuilder/local/filters/courserole_test.php b/admin/tests/reportbuilder/local/filters/courserole_test.php index 0e721bfe356d2..1a6bc7aa6f44e 100644 --- a/admin/tests/reportbuilder/local/filters/courserole_test.php +++ b/admin/tests/reportbuilder/local/filters/courserole_test.php @@ -47,6 +47,7 @@ public static function get_sql_filter_provider(): array { 'Filter by category' => ['', 'cat2', '', ['user1', 'user2', 'user3']], 'Filter by category and course' => ['', 'cat2', 'course2', ['user1', 'user2']], 'Filter by course' => ['', '', 'course3', ['user3']], + 'Filter by course (ensure whitespace is trimmed)' => ['', '', ' course3 ', ['user3']], ]; } diff --git a/reportbuilder/classes/local/filters/text.php b/reportbuilder/classes/local/filters/text.php index 791a92598dd62..738d13e78d3a9 100644 --- a/reportbuilder/classes/local/filters/text.php +++ b/reportbuilder/classes/local/filters/text.php @@ -94,7 +94,7 @@ public function setup_form(\MoodleQuickForm $mform): void { $mform->addElement('group', $this->name . '_group', '', $elements, '', false); - $mform->setType($this->name . '_value', PARAM_RAW); + $mform->setType($this->name . '_value', PARAM_RAW_TRIMMED); $mform->hideIf($this->name . '_value', $this->name . '_operator', 'eq', self::ANY_VALUE); $mform->hideIf($this->name . '_value', $this->name . '_operator', 'eq', self::IS_EMPTY); $mform->hideIf($this->name . '_value', $this->name . '_operator', 'eq', self::IS_NOT_EMPTY); @@ -103,19 +103,15 @@ public function setup_form(\MoodleQuickForm $mform): void { /** * Return filter SQL * - * @param array|null $values + * @param array $values * @return array array of two elements - SQL query and named parameters */ - public function get_sql_filter(?array $values) : array { + public function get_sql_filter(array $values): array { global $DB; $name = database::generate_param_name(); - if (!$values) { - return ['', []]; - } - $operator = (int) ($values["{$this->name}_operator"] ?? self::ANY_VALUE); - $value = $values["{$this->name}_value"] ?? ''; + $value = trim($values["{$this->name}_value"] ?? ''); $fieldsql = $this->filter->get_field_sql(); $params = $this->filter->get_field_params(); diff --git a/reportbuilder/tests/local/filters/text_test.php b/reportbuilder/tests/local/filters/text_test.php index 9a9a5f0d017f4..6bce83f6322dd 100644 --- a/reportbuilder/tests/local/filters/text_test.php +++ b/reportbuilder/tests/local/filters/text_test.php @@ -53,6 +53,12 @@ public function get_sql_filter_simple_provider(): array { [text::STARTS_WITH, 'sunlight', false], [text::ENDS_WITH, 'looking for?', true], [text::ENDS_WITH, 'your heart', false], + + // Ensure whitespace is trimmed. + [text::CONTAINS, ' looking for ', true], + [text::IS_EQUAL_TO, ' Hello, is it me you\'re looking for? ', true], + [text::STARTS_WITH, ' Hello, is it me ', true], + [text::ENDS_WITH, ' you\'re looking for? ', true], ]; }