From beea1042468b88f9cb752d8d0cb109c1bb1259c2 Mon Sep 17 00:00:00 2001 From: Paul Holden Date: Thu, 4 May 2023 12:09:34 +0100 Subject: [PATCH] MDL-78117 reportbuilder: create new context report entity. Encapsulate context related data in columns to replace similar in other entities, add new context level filter. --- lang/en/moodle.php | 2 + .../reportbuilder/local/entities/context.php | 178 ++++++++++++++++++ 2 files changed, 180 insertions(+) create mode 100644 lib/classes/reportbuilder/local/entities/context.php diff --git a/lang/en/moodle.php b/lang/en/moodle.php index 7e70bb7dd4b..685e71933b5 100644 --- a/lang/en/moodle.php +++ b/lang/en/moodle.php @@ -299,6 +299,8 @@ $string['contentexport_modulesummary'] = 'This page is part of the content downl $string['contentexport_viewfilename'] = 'View the file {$a}'; $string['contentbank'] = 'Content bank'; $string['context'] = 'Context'; +$string['contextlevel'] = 'Context level'; +$string['contextname'] = 'Context name'; $string['contexturl'] = 'Context URL'; $string['continue'] = 'Continue'; $string['continuetocourse'] = 'Click here to enter your course'; diff --git a/lib/classes/reportbuilder/local/entities/context.php b/lib/classes/reportbuilder/local/entities/context.php new file mode 100644 index 00000000000..c9870150ee4 --- /dev/null +++ b/lib/classes/reportbuilder/local/entities/context.php @@ -0,0 +1,178 @@ +. + +declare(strict_types=1); + +namespace core\reportbuilder\local\entities; + +use core\context_helper; +use core_reportbuilder\local\entities\base; +use core_reportbuilder\local\filters\select; +use core_reportbuilder\local\report\{column, filter}; +use html_writer; +use lang_string; +use stdClass; + +/** + * Context entity + * + * @package core + * @copyright 2023 Paul Holden + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class context extends base { + + /** + * Database tables that this entity uses and their default aliases + * + * @return array + */ + protected function get_default_table_aliases(): array { + return ['context' => 'ctx']; + } + + /** + * The default title for this entity in the list of columns/conditions/filters in the report builder + * + * @return lang_string + */ + protected function get_default_entity_title(): lang_string { + return new lang_string('context'); + } + + /** + * Initialise the entity + * + * @return base + */ + public function initialise(): base { + $columns = $this->get_all_columns(); + foreach ($columns as $column) { + $this->add_column($column); + } + + // All the filters defined by the entity can also be used as conditions. + $filters = $this->get_all_filters(); + foreach ($filters as $filter) { + $this + ->add_filter($filter) + ->add_condition($filter); + } + + return $this; + } + + /** + * Returns list of all available columns + * + * @return column[] + */ + protected function get_all_columns(): array { + $contextalias = $this->get_table_alias('context'); + + // Name. + $columns[] = (new column( + 'name', + new lang_string('contextname'), + $this->get_entity_name() + )) + ->add_joins($this->get_joins()) + ->set_type(column::TYPE_TEXT) + ->add_fields(context_helper::get_preload_record_columns_sql($contextalias)) + // Sorting may not order alphabetically, but will at least group contexts together. + ->set_is_sortable(true) + ->add_callback(static function($contextid, stdClass $context): string { + if ($contextid === null) { + return ''; + } + + context_helper::preload_from_record($context); + return context_helper::instance_by_id($contextid)->get_context_name(); + }); + + // Link. + $columns[] = (new column( + 'link', + new lang_string('contexturl'), + $this->get_entity_name() + )) + ->add_joins($this->get_joins()) + ->set_type(column::TYPE_TEXT) + ->add_fields(context_helper::get_preload_record_columns_sql($contextalias)) + // Sorting may not order alphabetically, but will at least group contexts together. + ->set_is_sortable(true) + ->add_callback(static function($contextid, stdClass $context): string { + if ($contextid === null) { + return ''; + } + + context_helper::preload_from_record($context); + $context = context_helper::instance_by_id($contextid); + + return html_writer::link($context->get_url(), $context->get_context_name()); + }); + + // Level. + $columns[] = (new column( + 'level', + new lang_string('contextlevel'), + $this->get_entity_name() + )) + ->add_joins($this->get_joins()) + ->set_type(column::TYPE_INTEGER) + ->add_fields("{$contextalias}.contextlevel") + ->set_is_sortable(true) + // It doesn't make sense to offer integer aggregation methods for this column. + ->set_disabled_aggregation(['avg', 'max', 'min', 'sum']) + ->add_callback(static function(?int $level): string { + if ($level === null) { + return ''; + } + + return context_helper::get_level_name($level); + }); + + return $columns; + } + + /** + * Return list of all available filters + * + * @return filter[] + */ + protected function get_all_filters(): array { + $contextalias = $this->get_table_alias('context'); + + // Level. + $filters[] = (new filter( + select::class, + 'level', + new lang_string('contextlevel'), + $this->get_entity_name(), + "{$contextalias}.contextlevel" + )) + ->add_joins($this->get_joins()) + ->set_options_callback(static function(): array { + $levels = context_helper::get_all_levels(); + + return array_map(static function(string $levelclass): string { + return $levelclass::get_level_name(); + }, $levels); + }); + + return $filters; + } +}