AutorÃa | Ultima modificación | Ver Log |
<?php// This file is part of Moodle - https://moodle.org///// Moodle is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.//// Moodle is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.//// You should have received a copy of the GNU General Public License// along with Moodle. If not, see <https://www.gnu.org/licenses/>.namespace tool_courserating\reportbuilder\local\entities;use core_reportbuilder\local\entities\base;use core_reportbuilder\local\helpers\format;use lang_string;use core_reportbuilder\local\report\column;use stdClass;use core_reportbuilder\local\report\filter;use core_reportbuilder\local\filters\number;use core_reportbuilder\local\filters\select;use tool_courserating\constants;use tool_courserating\helper;/*** Reportbuilder entity representing table tool_courserating_summary.** @package tool_courserating* @copyright 2022 Marina Glancy* @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later*/class summary extends base {/*** Database tables that this entity uses and their default aliases** @return array*/protected function get_default_table_aliases(): array {return ['tool_courserating_summary' => 'tool_courserating_summary'];}/*** Database tables that this entity uses** @return string[]*/protected function get_default_tables(): array {return array_keys($this->get_default_table_aliases());}/*** The default title for this entity** @return lang_string*/protected function get_default_entity_title(): lang_string {return new lang_string('entity_summary', 'tool_courserating');}/*** 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 {$tablealias = $this->get_table_alias('tool_courserating_summary');$columns = [];// Cntall column.$columns[] = (new column('cntall',new lang_string('summary_cntall', 'tool_courserating'),$this->get_entity_name()))->add_joins($this->get_joins())->set_type(column::TYPE_INTEGER)->add_fields("{$tablealias}.cntall")->set_is_sortable(true);// Avgrating column.$columns[] = (new column('avgrating',new lang_string('summary_avgrating', 'tool_courserating'),$this->get_entity_name()))->add_joins($this->get_joins())->set_type(column::TYPE_FLOAT)->add_fields("{$tablealias}.avgrating")->set_is_sortable(true)->add_callback(static function($value, stdClass $row): ?string {return helper::format_avgrating($value);});$columns[] = (new column('stars',new lang_string('ratingasstars', 'tool_courserating'),$this->get_entity_name()))->add_joins($this->get_joins())->set_type(column::TYPE_FLOAT)->add_fields("{$tablealias}.avgrating")->set_disabled_aggregation(['sum'])->set_is_sortable(true)->add_callback(static function($avgrating, $r) {return helper::stars((float)$avgrating);});// Cntreviews column.$columns[] = (new column('cntreviews',new lang_string('summary_cntreviews', 'tool_courserating'),$this->get_entity_name()))->add_joins($this->get_joins())->set_type(column::TYPE_INTEGER)->add_fields("{$tablealias}.cntreviews")->set_is_sortable(true);// Cnt01-Cnt05 columns.for ($i = 1; $i <= 5; $i++) {// phpcs:disable Squiz.PHP.CommentedOutCode.Found// Mdlcode assume: $i ['1', '2', '3', '4', '5'].$fld = "cnt0{$i}";$columns[] = (new column($fld,// phpcs:disable Squiz.PHP.CommentedOutCode.Found// Mdlcode assume-next-line: $fld ['cnt01', 'cnt02', 'cnt03', 'cnt04', 'cnt05'] .new lang_string('summary_'.$fld, 'tool_courserating'),$this->get_entity_name()))->add_joins($this->get_joins())->set_type(column::TYPE_FLOAT)->add_field("CASE WHEN {$tablealias}.cntall > 0 THEN "."100.0*{$tablealias}.{$fld}/{$tablealias}.cntall ELSE NULL END", "p")->set_is_sortable(true)->set_groupby_sql("{$tablealias}.cntall, {$tablealias}.{$fld}")->set_callback(function ($value, $row) {return ($row->p === null) ? null : format::percent($value);});}// Ratingmode column.$columns[] = (new column('ratingmode',new lang_string('summary_ratingmode', 'tool_courserating'),$this->get_entity_name()))->add_joins($this->get_joins())->set_type(column::TYPE_INTEGER)->add_fields("{$tablealias}.ratingmode")->set_is_sortable(true)->set_callback(static function($v) {return is_null($v) ? null : (constants::rated_courses_options()[$v] ?? null);});return $columns;}/*** Return list of all available filters** @return filter[]*/protected function get_all_filters(): array {$tablealias = $this->get_table_alias('tool_courserating_summary');$filters = [];// Cntall filter.$filters[] = (new filter(number::class,'cntall',new lang_string('summary_cntall', 'tool_courserating'),$this->get_entity_name(),"{$tablealias}.cntall"))->add_joins($this->get_joins());// Avgrating filter.$filters[] = (new filter(number::class,'avgrating',new lang_string('summary_avgrating', 'tool_courserating'),$this->get_entity_name(),"{$tablealias}.avgrating"))->add_joins($this->get_joins());// Sumrating filter.$filters[] = (new filter(number::class,'sumrating',new lang_string('summary_sumrating', 'tool_courserating'),$this->get_entity_name(),"{$tablealias}.sumrating"))->add_joins($this->get_joins());// Cntreviews filter.$filters[] = (new filter(number::class,'cntreviews',new lang_string('summary_cntreviews', 'tool_courserating'),$this->get_entity_name(),"{$tablealias}.cntreviews"))->add_joins($this->get_joins());// Cnt01 filter.$filters[] = (new filter(number::class,'cnt01',new lang_string('summary_cnt01', 'tool_courserating'),$this->get_entity_name(),"CASE WHEN {$tablealias}.cntall > 0 THEN 100.0*{$tablealias}.cnt01/{$tablealias}.cntall ELSE NULL END"))->add_joins($this->get_joins());// Cnt02 filter.$filters[] = (new filter(number::class,'cnt02',new lang_string('summary_cnt02', 'tool_courserating'),$this->get_entity_name(),"CASE WHEN {$tablealias}.cntall > 0 THEN 100.0*{$tablealias}.cnt02/{$tablealias}.cntall ELSE NULL END"))->add_joins($this->get_joins());// Cnt03 filter.$filters[] = (new filter(number::class,'cnt03',new lang_string('summary_cnt03', 'tool_courserating'),$this->get_entity_name(),"CASE WHEN {$tablealias}.cntall > 0 THEN 100.0*{$tablealias}.cnt03/{$tablealias}.cntall ELSE NULL END"))->add_joins($this->get_joins());// Cnt04 filter.$filters[] = (new filter(number::class,'cnt04',new lang_string('summary_cnt04', 'tool_courserating'),$this->get_entity_name(),"CASE WHEN {$tablealias}.cntall > 0 THEN 100.0*{$tablealias}.cnt04/{$tablealias}.cntall ELSE NULL END"))->add_joins($this->get_joins());// Cnt05 filter.$filters[] = (new filter(number::class,'cnt05',new lang_string('summary_cnt05', 'tool_courserating'),$this->get_entity_name(),"CASE WHEN {$tablealias}.cntall > 0 THEN 100.0*{$tablealias}.cnt05/{$tablealias}.cntall ELSE NULL END"))->add_joins($this->get_joins());// Ratingmode filter.$filters[] = (new filter(select::class,'ratingmode',new lang_string('summary_ratingmode', 'tool_courserating'),$this->get_entity_name(),"{$tablealias}.ratingmode"))->add_joins($this->get_joins())->set_options_callback(static function(): array {return constants::rated_courses_options();});return $filters;}}