From bc100f6efa5be807027b8992e44eabfddfbb3267 Mon Sep 17 00:00:00 2001 From: Jun Pataleta Date: Sun, 1 Jun 2025 00:38:17 +0800 Subject: [PATCH] MDL-85470 reportbuilder: New column containing badge image, name, link --- .../reportbuilder/local/entities/badge.php | 32 +++++++++++++++++++ .../reportbuilder/datasource/badges_test.php | 16 ++++++---- lang/en/badges.php | 1 + 3 files changed, 43 insertions(+), 6 deletions(-) diff --git a/badges/classes/reportbuilder/local/entities/badge.php b/badges/classes/reportbuilder/local/entities/badge.php index 526c441382c..28dd6e27b45 100644 --- a/badges/classes/reportbuilder/local/entities/badge.php +++ b/badges/classes/reportbuilder/local/entities/badge.php @@ -130,6 +130,38 @@ class badge extends base { return html_writer::link($url, $row->name); }); + // Name with image and link. + $columns[] = (new column( + 'namewithimagelink', + new lang_string('namewithimagelink', 'core_badges'), + $this->get_entity_name() + )) + ->add_joins($this->get_joins()) + ->add_join("LEFT JOIN {context} {$contextalias} + ON {$contextalias}.contextlevel = " . CONTEXT_COURSE . " + AND {$contextalias}.instanceid = {$badgealias}.courseid") + ->add_fields( + "{$badgealias}.name, {$badgealias}.id, {$badgealias}.type, {$badgealias}.courseid" + ) + ->add_field($DB->sql_cast_to_char("{$badgealias}.imagecaption"), 'imagecaption') + ->add_fields(context_helper::get_preload_record_columns_sql($contextalias)) + ->set_is_sortable(true) + ->add_callback(static function ($value, stdClass $badge): string { + if ($badge->id === null) { + return ''; + } + if ($badge->type == BADGE_TYPE_SITE) { + $context = context_system::instance(); + } else { + context_helper::preload_from_record($badge); + $context = context_course::instance($badge->courseid); + } + + $badgeimage = moodle_url::make_pluginfile_url($context->id, 'badges', 'badgeimage', $badge->id, '/', 'f2'); + $url = new moodle_url('/badges/overview.php', ['id' => $badge->id]); + return html_writer::img($badgeimage, $badge->imagecaption) . ' ' . html_writer::link($url, $badge->name); + }); + // Description (note, this column contains plaintext so requires no post-processing). $descriptionfieldsql = "{$badgealias}.description"; if ($DB->get_dbfamily() === 'oracle') { diff --git a/badges/tests/reportbuilder/datasource/badges_test.php b/badges/tests/reportbuilder/datasource/badges_test.php index bc10495f2cd..1dcd239e7e3 100644 --- a/badges/tests/reportbuilder/datasource/badges_test.php +++ b/badges/tests/reportbuilder/datasource/badges_test.php @@ -125,6 +125,7 @@ final class badges_test extends core_reportbuilder_testcase { $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'user:fullname', 'sortenabled' => 1]); $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'badge:namewithlink']); + $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'badge:namewithimagelink']); $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'badge:criteria']); $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'badge:image']); $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'badge:language']); @@ -146,11 +147,12 @@ final class badges_test extends core_reportbuilder_testcase { ['id' => $badgeone->id]), ($badgeone->name)); // First badge, issued to user one. - [$badgename, $fullname, $namewithlink, $criteria, $image, $language, $version, $status, $expiry, $tag, $expires, - $visible, $coursename] = array_values($content[0]); + [$badgename, $fullname, $namewithlink, $namewithimagelink, $criteria, $image, $language, $version, $status, $expiry, $tag, + $expires, $visible, $coursename] = array_values($content[0]); $this->assertEquals($badgeone->name, $badgename); $this->assertEquals(fullname($user1), $fullname); $this->assertEquals($expectedbadgeonelink, $namewithlink); + $this->assertEquals($image . ' ' . $expectedbadgeonelink, $namewithimagelink); $this->assertStringContainsString('Awarded by: Manager', $criteria); $this->assertStringContainsString('Image caption', $image); $this->assertEquals('German', $language); @@ -163,11 +165,12 @@ final class badges_test extends core_reportbuilder_testcase { $this->assertEquals('PHPUnit test site', $coursename); // First badge, issued to user two. - [$badgename, $fullname, $namewithlink, $criteria, $image, $language, $version, $status, $expiry, $tag, $expires, - $visible, $coursename] = array_values($content[1]); + [$badgename, $fullname, $namewithlink, $namewithimagelink, $criteria, $image, $language, $version, $status, $expiry, $tag, + $expires, $visible, $coursename] = array_values($content[1]); $this->assertEquals($badgeone->name, $badgename); $this->assertEquals(fullname($user2), $fullname); $this->assertEquals($expectedbadgeonelink, $namewithlink); + $this->assertEquals($image . ' ' . $expectedbadgeonelink, $namewithimagelink); $this->assertStringContainsString('Awarded by: Manager', $criteria); $this->assertStringContainsString('Image caption', $image); $this->assertEquals('German', $language); @@ -183,11 +186,12 @@ final class badges_test extends core_reportbuilder_testcase { ['id' => $badgetwo->id]), ($badgetwo->name)); // Course badge, not issues to any users. - [$badgename, $fullname, $namewithlink, $criteria, $image, $language, $version, $status, $expiry, $tag, $expires, - $visible, $coursename] = array_values($content[2]); + [$badgename, $fullname, $namewithlink, $namewithimagelink, $criteria, $image, $language, $version, $status, $expiry, $tag, + $expires, $visible, $coursename] = array_values($content[2]); $this->assertEquals($badgetwo->name, $badgename); $this->assertEmpty($fullname); $this->assertEquals($expectedbadgetwolink, $namewithlink); + $this->assertEquals($image . ' ' . $expectedbadgetwolink, $namewithimagelink); $this->assertEquals('Criteria for this badge have not been set up yet.', $criteria); $this->assertStringContainsString('Image caption', $image); $this->assertEquals('English', $language); diff --git a/lang/en/badges.php b/lang/en/badges.php index 1687b40f495..5723bf703aa 100644 --- a/lang/en/badges.php +++ b/lang/en/badges.php @@ -415,6 +415,7 @@ $string['month'] = 'Month(s)'; $string['moredetails'] = 'More details'; $string['mybadges'] = 'My badges'; $string['mybackpack'] = 'My backpack settings'; +$string['namewithimagelink'] = 'Name with image and link'; $string['namewithlink'] = 'Name with link'; $string['never'] = 'Never'; $string['newbackpack'] = 'Add a new backpack';