1 <?php 2 // This file is part of Moodle - http://moodle.org/ 3 // 4 // Moodle is free software: you can redistribute it and/or modify 5 // it under the terms of the GNU General Public License as published by 6 // the Free Software Foundation, either version 3 of the License, or 7 // (at your option) any later version. 8 // 9 // Moodle is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU General Public License for more details. 13 // 14 // You should have received a copy of the GNU General Public License 15 // along with Moodle. If not, see <http://www.gnu.org/licenses/>. 16 17 namespace core_cohort\reportbuilder\local\systemreports; 18 19 use context; 20 use context_coursecat; 21 use context_system; 22 use core_cohort\reportbuilder\local\entities\cohort; 23 use core_reportbuilder\local\helpers\database; 24 use core_reportbuilder\local\report\action; 25 use core_reportbuilder\local\report\column; 26 use html_writer; 27 use lang_string; 28 use moodle_url; 29 use pix_icon; 30 use core_reportbuilder\system_report; 31 use stdClass; 32 33 /** 34 * Cohorts system report class implementation 35 * 36 * @package core_cohort 37 * @copyright 2021 David Matamoros <davidmc@moodle.com> 38 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 39 */ 40 class cohorts extends system_report { 41 42 /** 43 * Initialise report, we need to set the main table, load our entities and set columns/filters 44 */ 45 protected function initialise(): void { 46 // Our main entity, it contains all of the column definitions that we need. 47 $cohortentity = new cohort(); 48 $entitymainalias = $cohortentity->get_table_alias('cohort'); 49 50 $this->set_main_table('cohort', $entitymainalias); 51 $this->add_entity($cohortentity); 52 53 // Any columns required by actions should be defined here to ensure they're always available. 54 $this->add_base_fields("{$entitymainalias}.id, {$entitymainalias}.contextid, {$entitymainalias}.visible, " . 55 "{$entitymainalias}.component"); 56 57 // Check if report needs to show a specific category. 58 $contextid = $this->get_parameter('contextid', 0, PARAM_INT); 59 $showall = $this->get_parameter('showall', true, PARAM_BOOL); 60 if (!$showall) { 61 $paramcontextid = database::generate_param_name(); 62 $this->add_base_condition_sql("{$entitymainalias}.contextid = :$paramcontextid", [$paramcontextid => $contextid]); 63 } 64 65 // Now we can call our helper methods to add the content we want to include in the report. 66 $this->add_columns($cohortentity); 67 $this->add_filters(); 68 $this->add_actions(); 69 70 // Set if report can be downloaded. 71 $this->set_downloadable(false); 72 } 73 74 /** 75 * Validates access to view this report 76 * 77 * @return bool 78 */ 79 protected function can_view(): bool { 80 $contextid = $this->get_parameter('contextid', 0, PARAM_INT); 81 if ($contextid) { 82 $context = context::instance_by_id($contextid, MUST_EXIST); 83 } else { 84 $context = context_system::instance(); 85 } 86 87 return has_any_capability(['moodle/cohort:manage', 'moodle/cohort:view'], $context); 88 } 89 90 /** 91 * Adds the columns we want to display in the report 92 * 93 * They are provided by the entities we previously added in the {@see initialise} method, referencing each by their 94 * unique identifier. If custom columns are needed just for this report, they can be defined here. 95 * 96 * @param cohort $cohortentity 97 */ 98 public function add_columns(cohort $cohortentity): void { 99 100 $entitymainalias = $cohortentity->get_table_alias('cohort'); 101 $showall = $this->get_parameter('showall', false, PARAM_BOOL); 102 103 // Category column. An extra callback is appended in order to extend the current column formatting. 104 if ($showall) { 105 $this->add_column_from_entity('cohort:context') 106 ->add_callback(static function(string $value, stdClass $cohort): string { 107 $context = context::instance_by_id($cohort->contextid); 108 if ($context instanceof context_coursecat) { 109 return html_writer::link(new moodle_url('/cohort/index.php', 110 ['contextid' => $cohort->contextid]), $value); 111 } 112 113 return $value; 114 }); 115 } 116 117 // Name column using the inplace editable component. 118 $this->add_column(new column( 119 'editablename', 120 new lang_string('name', 'core_cohort'), 121 $cohortentity->get_entity_name() 122 )) 123 ->set_type(column::TYPE_TEXT) 124 ->set_is_sortable(true) 125 ->add_fields("{$entitymainalias}.name, {$entitymainalias}.id, {$entitymainalias}.contextid") 126 ->add_callback(static function(string $name, stdClass $cohort): string { 127 global $OUTPUT, $PAGE; 128 $renderer = $PAGE->get_renderer('core'); 129 130 $template = new \core_cohort\output\cohortname($cohort); 131 return $renderer->render_from_template('core/inplace_editable', $template->export_for_template($OUTPUT)); 132 }); 133 134 // ID Number column using the inplace editable component. 135 $this->add_column(new column( 136 'editableidnumber', 137 new lang_string('idnumber', 'core_cohort'), 138 $cohortentity->get_entity_name() 139 )) 140 ->set_type(column::TYPE_TEXT) 141 ->set_is_sortable(true) 142 ->add_fields("{$entitymainalias}.idnumber, {$entitymainalias}.id, {$entitymainalias}.contextid") 143 ->add_callback(static function(?string $idnumber, stdClass $cohort): string { 144 global $OUTPUT, $PAGE; 145 $renderer = $PAGE->get_renderer('core'); 146 147 $template = new \core_cohort\output\cohortidnumber($cohort); 148 return $renderer->render_from_template('core/inplace_editable', $template->export_for_template($OUTPUT)); 149 }); 150 151 // Description column. 152 $this->add_column_from_entity('cohort:description'); 153 154 // Cohort size column using a custom SQL query to count cohort members. 155 $cm = database::generate_param_name(); 156 $sql = "(SELECT count($cm.id) as memberscount 157 FROM {cohort_members} $cm 158 WHERE $cm.cohortid = {$entitymainalias}.id)"; 159 $this->add_column(new column( 160 'memberscount', 161 new lang_string('memberscount', 'cohort'), 162 $cohortentity->get_entity_name() 163 )) 164 ->set_type(column::TYPE_INTEGER) 165 ->set_is_sortable(true) 166 ->add_field($sql, 'memberscount'); 167 168 // Component column. Override the display name of a column. 169 $this->add_column_from_entity('cohort:component') 170 ->set_title(new lang_string('source', 'core_plugin')); 171 172 // It's possible to set a default initial sort direction for one column. 173 $this->set_initial_sort_column('cohort:editablename', SORT_ASC); 174 } 175 176 /** 177 * Adds the filters we want to display in the report 178 * 179 * They are all provided by the entities we previously added in the {@see initialise} method, referencing each by their 180 * unique identifier 181 */ 182 protected function add_filters(): void { 183 $filters = [ 184 'cohort:name', 185 'cohort:idnumber', 186 'cohort:description', 187 ]; 188 $this->add_filters_from_entities($filters); 189 } 190 191 /** 192 * Add the system report actions. An extra column will be appended to each row, containing all actions added here 193 * 194 * Note the use of ":id" placeholder which will be substituted according to actual values in the row 195 */ 196 protected function add_actions(): void { 197 198 $contextid = $this->get_parameter('contextid', 0, PARAM_INT); 199 $showall = $this->get_parameter('showall', true, PARAM_BOOL); 200 $returnurl = (new moodle_url('/cohort/index.php', 201 ['id' => ':id', 'contextid' => $contextid, 'showall' => $showall]))->out(false); 202 203 // Hide action. It will be only shown if the property 'visible' is true and user has 'moodle/cohort:manage' capabillity. 204 $this->add_action((new action( 205 new moodle_url('/cohort/edit.php', ['id' => ':id', 'sesskey' => sesskey(), 'hide' => 1, 'returnurl' => $returnurl]), 206 new pix_icon('t/show', '', 'core'), 207 [], 208 false, 209 new lang_string('hide') 210 ))->add_callback(function(stdClass $row): bool { 211 return empty($row->component) && $row->visible 212 && has_capability('moodle/cohort:manage', context::instance_by_id($row->contextid)); 213 })); 214 215 // Show action. It will be only shown if the property 'visible' is false and user has 'moodle/cohort:manage' capabillity. 216 $this->add_action((new action( 217 new moodle_url('/cohort/edit.php', ['id' => ':id', 'sesskey' => sesskey(), 'show' => 1, 'returnurl' => $returnurl]), 218 new pix_icon('t/hide', '', 'core'), 219 [], 220 false, 221 new lang_string('show') 222 ))->add_callback(function(stdClass $row): bool { 223 return empty($row->component) && !$row->visible 224 && has_capability('moodle/cohort:manage', context::instance_by_id($row->contextid)); 225 })); 226 227 // Edit action. It will be only shown if user has 'moodle/cohort:manage' capabillity. 228 $this->add_action((new action( 229 new moodle_url('/cohort/edit.php', ['id' => ':id', 'returnurl' => $returnurl]), 230 new pix_icon('t/edit', '', 'core'), 231 [], 232 false, 233 new lang_string('edit') 234 ))->add_callback(function(stdClass $row): bool { 235 return empty($row->component) && has_capability('moodle/cohort:manage', context::instance_by_id($row->contextid)); 236 })); 237 238 // Delete action. It will be only shown if user has 'moodle/cohort:manage' capabillity. 239 $this->add_action((new action( 240 new moodle_url('/cohort/edit.php', ['id' => ':id', 'delete' => 1, 'returnurl' => $returnurl]), 241 new pix_icon('t/delete', '', 'core'), 242 [], 243 false, 244 new lang_string('delete') 245 ))->add_callback(function(stdClass $row): bool { 246 return empty($row->component) && has_capability('moodle/cohort:manage', context::instance_by_id($row->contextid)); 247 })); 248 249 // Assign members to cohort action. It will be only shown if user has 'moodle/cohort:assign' capabillity. 250 $this->add_action((new action( 251 new moodle_url('/cohort/assign.php', ['id' => ':id', 'returnurl' => $returnurl]), 252 new pix_icon('i/users', '', 'core'), 253 [], 254 false, 255 new lang_string('assign', 'core_cohort') 256 ))->add_callback(function(stdClass $row): bool { 257 return empty($row->component) && has_capability('moodle/cohort:assign', context::instance_by_id($row->contextid)); 258 })); 259 } 260 261 /** 262 * CSS class for the row 263 * 264 * @param stdClass $row 265 * @return string 266 */ 267 public function get_row_class(stdClass $row): string { 268 return (!$row->visible) ? 'text-muted' : ''; 269 } 270 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body