From c7a7a54495cdd99e494ed773bf9c53bcec4c9015 Mon Sep 17 00:00:00 2001 From: Paul Holden Date: Mon, 1 Nov 2021 07:58:31 +0000 Subject: [PATCH] MDL-72959 reportbuilder: format course/category names in entities. --- .../local/entities/course_category.php | 5 ++- course/tests/datasource_test.php | 38 +++++++++++++++++++ .../classes/local/entities/course.php | 19 +++++++++- 3 files changed, 59 insertions(+), 3 deletions(-) diff --git a/course/classes/local/entities/course_category.php b/course/classes/local/entities/course_category.php index 15191169b2e..8a31a4e35b9 100644 --- a/course/classes/local/entities/course_category.php +++ b/course/classes/local/entities/course_category.php @@ -96,7 +96,10 @@ class course_category extends base { )) ->add_joins($this->get_joins()) ->set_type(column::TYPE_TEXT) - ->add_fields("{$tablealias}.name") + ->add_fields("{$tablealias}.name, {$tablealias}.id") + ->add_callback(static function(string $name, stdClass $category): string { + return core_course_category::get($category->id, MUST_EXIST, true)->get_formatted_name(); + }) ->set_is_sortable(true); // ID number column. diff --git a/course/tests/datasource_test.php b/course/tests/datasource_test.php index 2d5c1a87389..64c2826bc32 100644 --- a/course/tests/datasource_test.php +++ b/course/tests/datasource_test.php @@ -66,4 +66,42 @@ class datasource_test extends core_reportbuilder_testcase { 'CAT101', // Course ID number. ], $contentrow); } + + /** + * Tests courses datasource using multilang filters + */ + public function test_courses_datasource_multilang_filters(): void { + $this->resetAfterTest(); + + filter_set_global_state('multilang', TEXTFILTER_ON); + filter_set_applies_to_strings('multilang', true); + + // Test subject. + $category = $this->getDataGenerator()->create_category([ + 'name' => 'Cat (en)Cat (es)', + ]); + $course = $this->getDataGenerator()->create_course([ + 'category' => $category->id, + 'fullname' => 'Crs (en)Crs (es)', + ]); + + /** @var core_reportbuilder_generator $generator */ + $generator = $this->getDataGenerator()->get_plugin_generator('core_reportbuilder'); + + // Create a report containing columns that support multilang content. + $report = $generator->create_report(['name' => 'Courses', 'source' => courses::class, 'default' => 0]); + $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'course_category:name']); + $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'course:fullname']); + $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'course:coursefullnamewithlink']); + + $content = $this->get_custom_report_content($report->get('id')); + $this->assertCount(1, $content); + + $contentrow = array_values(reset($content)); + $this->assertEquals([ + 'Cat (en)', + 'Crs (en)', + 'Crs (en)', + ], $contentrow); + } } diff --git a/reportbuilder/classes/local/entities/course.php b/reportbuilder/classes/local/entities/course.php index 6fe60c82eb3..58980bed0ea 100644 --- a/reportbuilder/classes/local/entities/course.php +++ b/reportbuilder/classes/local/entities/course.php @@ -216,7 +216,7 @@ class course extends base { 'courseidnumberewithlink' => 'idnumber', ]; foreach ($fields as $key => $field) { - $columns[] = (new column( + $column = (new column( $key, new lang_string($key, 'core_reportbuilder'), $this->get_entity_name() @@ -230,8 +230,23 @@ class course extends base { return ''; } - return html_writer::link(course_get_url($row->id), $value); + context_helper::preload_from_record($row); + + return html_writer::link(course_get_url($row->id), + format_string($value, true, ['context' => context_course::instance($row->id)])); }); + + // Join on the context table so that we can use it for formatting these columns later. + if ($key === 'coursefullnamewithlink') { + $join = "LEFT JOIN {context} {$contexttablealias} + ON {$contexttablealias}.contextlevel = " . CONTEXT_COURSE . " + AND {$contexttablealias}.instanceid = {$tablealias}.id"; + + $column->add_join($join) + ->add_fields(context_helper::get_preload_record_columns_sql($contexttablealias)); + } + + $columns[] = $column; } foreach ($coursefields as $coursefield => $coursefieldlang) {