AutorÃa | Ultima modificación | Ver Log |
<?php// This file is part of Moodle - http://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 <http://www.gnu.org/licenses/>./*** Completion Progress block overview page** @package block_completion_progress* @copyright 2018 Michael de Raadt* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later*/// Include required files.require_once(dirname(__FILE__) . '/../../config.php');require_once($CFG->dirroot.'/notes/lib.php');require_once($CFG->libdir.'/tablelib.php');use block_completion_progress\completion_progress;/*** Default number of participants per page.*/const DEFAULT_PAGE_SIZE = 20;/*** An impractically high number of participants indicating 'all' are to be shown.*/const SHOW_ALL_PAGE_SIZE = 5000;// Gather form data.$id = required_param('instanceid', PARAM_INT);$courseid = required_param('courseid', PARAM_INT);$page = optional_param('page', 0, PARAM_INT); // Which page to show.$perpage = optional_param('perpage', DEFAULT_PAGE_SIZE, PARAM_INT); // How many per page.$group = optional_param('group', 0, PARAM_ALPHANUMEXT); // Group selected.$role = optional_param('role', null, PARAM_INT);$download = optional_param('download', '', PARAM_ALPHA);// Determine course and context.$course = $DB->get_record('course', array('id' => $courseid), '*', MUST_EXIST);$context = context_course::instance($courseid);// Get specific block config and context.$block = $DB->get_record('block_instances', array('id' => $id), '*', MUST_EXIST);$blockcontext = context_block::instance($id);$notesallowed = !empty($CFG->enablenotes) && has_capability('moodle/notes:manage', $context);$messagingallowed = !empty($CFG->messaging) && has_capability('moodle/site:sendmessage', $context);$bulkoperations = has_capability('moodle/course:bulkmessaging', $context) && ($notesallowed || $messagingallowed);// Set up page parameters.$PAGE->set_course($course);$PAGE->set_url('/blocks/completion_progress/overview.php',array('instanceid' => $id,'courseid' => $courseid,'page' => $page,'perpage' => $perpage,'group' => $group,'role' => $role,));$PAGE->set_context($context);$title = get_string('overview', 'block_completion_progress');$PAGE->set_title($title);$PAGE->set_heading($title);$PAGE->navbar->add($title);$PAGE->set_pagelayout('report');$cachevalue = debugging() ? -1 : (int)get_config('block_completion_progress', 'cachevalue');$PAGE->requires->css('/blocks/completion_progress/css.php?v=' . $cachevalue);// Check user is logged in and capable of accessing the Overview.require_login($course, false);require_capability('block/completion_progress:overview', $blockcontext);$progress = (new completion_progress($course))->for_overview()->for_block_instance($block);// Prepare a group selector if there are groups in the course.$groupids = [];$groupoptions = [];if (has_capability('moodle/site:accessallgroups', $context)) {$allgroups = groups_get_all_groups($course->id, 0);$allgroupings = groups_get_all_groupings($course->id);if ($allgroups) {$groupoptions[0] = get_string('allparticipants');}} else {$allgroups = groups_get_all_groups($course->id, $USER->id);$allgroupings = [];$groupids = array_keys($allgroups);}foreach ($allgroups as $rec) {if ($group == $rec->id) {$groupids = [ $rec->id ]; // Selected filter.}$groupoptions[$rec->id] = format_string($rec->name);}foreach ($allgroupings as $rec) {if ($group === "g{$rec->id}") { // Selected grouping.$groupids = array_keys(groups_get_all_groups($course->id, 0, $rec->id));}$groupoptions["g{$rec->id}"] = format_string($rec->name);}if (!$groupids) {$group = 0;$PAGE->set_url($PAGE->url, ['group' => $group]);}// Prepare the roles menu.$sql = "SELECT DISTINCT r.id, r.name, r.shortname, r.archetype, r.sortorderFROM {role} r, {role_assignments} raWHERE ra.contextid = :contextidAND r.id = ra.roleidORDER BY r.sortorder";$params = ['contextid' => $context->id];$roles = role_fix_names($DB->get_records_sql($sql, $params), $context);$roleoptions = array(0 => get_string('allparticipants'));foreach ($roles as $rec) {if ($role === null && $rec->archetype === 'student') {$role = $rec->id; // First student role is the default.$PAGE->set_url($PAGE->url, ['role' => $role]);}$roleoptions[$rec->id] = $rec->localname;}// Setup the overview table.$table = new block_completion_progress\table\overview($progress, $groupids, $role, $bulkoperations);$table->define_baseurl($PAGE->url);$table->show_download_buttons_at([]); // We'll output them ourselves.$table->is_downloading($download, 'completion_progress-' . $COURSE->shortname);$table->setup();if ($download) {$table->query_db($perpage);$table->start_output();$table->build_table();$table->finish_output();exit;}$output = $PAGE->get_renderer('block_completion_progress');// Start page output.echo $output->header();echo $output->heading($title, 2);echo $output->container_start('block_completion_progress');// Check if activities/resources have been selected in config.if (!$progress->has_activities()) {echo get_string('no_activities_message', 'block_completion_progress');echo $output->container_end();echo $output->footer();die();}echo $output->container_start('progressoverviewmenus');if ($groupoptions) {echo $output->single_select($PAGE->url, 'group', $groupoptions, $group,['' => 'choosedots'], null, ['label' => get_string('groupsvisible')]);}if ($roleoptions) {echo $output->single_select($PAGE->url, 'role', $roleoptions, $role,['' => 'choosedots'], null, ['label' => get_string('role')]);}echo $output->container_end();// Form for messaging selected participants.$formattributes = array('action' => $CFG->wwwroot.'/user/action_redir.php', 'method' => 'post', 'id' => 'participantsform');$formattributes['data-course-id'] = $course->id;$formattributes['data-table-unique-id'] = 'block-completion_progress-overview-' . $course->id;echo html_writer::start_tag('form', $formattributes);echo html_writer::empty_tag('input', array('type' => 'hidden', 'name' => 'sesskey', 'value' => sesskey()));echo html_writer::empty_tag('input', array('type' => 'hidden', 'name' => 'returnto', 'value' => s($PAGE->url->out(false))));// Imitate a 3.9 dynamic table enough to fool the core_user/participants JS code, until// next time it changes again.$tabledivattributes = ['data-region' => 'core_table/dynamic','data-table-uniqueid' => $formattributes['data-table-unique-id'],];echo html_writer::start_div('', $tabledivattributes);// Render the overview table.$table->query_db($perpage);$table->start_output();$table->build_table();$table->finish_output();echo html_writer::end_div(); // Closes the 3.9 imitation table wrapper.// Output paging controls.if ($table->totalrows > $perpage || $perpage == SHOW_ALL_PAGE_SIZE) {$perpageurl = new moodle_url($PAGE->url, ['page' => 0]);if ($perpage < SHOW_ALL_PAGE_SIZE) {$perpageurl->param('perpage', SHOW_ALL_PAGE_SIZE);echo $output->container(html_writer::link($perpageurl,get_string('showall', '', $table->totalrows)), array(), 'showall');} else {$perpageurl->param('perpage', DEFAULT_PAGE_SIZE);echo $output->container(html_writer::link($perpageurl,get_string('showperpage', '', DEFAULT_PAGE_SIZE)), array(), 'showall');}}if ($bulkoperations) {echo '<br /><div class="form-inline m-1">';$displaylist = array();if ($messagingallowed) {$displaylist['#messageselect'] = get_string('messageselectadd');}if ($notesallowed) {$displaylist['#addgroupnote'] = get_string('addnewnote', 'notes');}echo html_writer::tag('label', get_string("withselectedusers"), array('for' => 'formactionid'));echo html_writer::select($displaylist, 'formaction', '', array('' => 'choosedots'), array('id' => 'formactionid'));echo '<input type="hidden" name="id" value="'.$course->id.'" />';echo '<noscript style="display:inline">';echo '<div><input type="submit" value="'.get_string('ok').'" /></div>';echo '</noscript>';echo '</div>';$options = new stdClass();$options->noteStateNames = note_get_state_names();$options->uniqueid = $formattributes['data-table-unique-id'];echo '<div class="d-none" data-region="state-help-icon">' . $output->help_icon('publishstate', 'notes') . '</div>';$PAGE->requires->js_call_amd('block_completion_progress/overview', 'init', [$options]);}echo html_writer::end_tag('form');echo $table->download_buttons();// Organise access to JS for progress bars.$PAGE->requires->js_call_amd('block_completion_progress/progressbar', 'init', ['instances' => array($block->id),]);echo $output->container_end();echo $output->footer();