Proyectos de Subversion Moodle

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 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
/**
18
 * Lists all the users within a given course.
19
 *
20
 * @copyright 1999 Martin Dougiamas  http://dougiamas.com
21
 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
22
 * @package core_user
23
 */
24
 
25
require_once('../config.php');
26
require_once($CFG->dirroot.'/user/lib.php');
27
require_once($CFG->dirroot.'/course/lib.php');
28
require_once($CFG->dirroot.'/notes/lib.php');
29
require_once($CFG->libdir.'/tablelib.php');
30
require_once($CFG->libdir.'/filelib.php');
31
require_once($CFG->dirroot.'/enrol/locallib.php');
32
 
33
use core_table\local\filter\filter;
34
use core_table\local\filter\integer_filter;
35
use core_table\local\filter\string_filter;
36
 
37
$participantsperpage = intval(get_config('moodlecourse', 'participantsperpage'));
38
define('DEFAULT_PAGE_SIZE', (!empty($participantsperpage) ? $participantsperpage : 20));
39
 
40
$page         = optional_param('page', 0, PARAM_INT); // Which page to show.
41
$perpage      = optional_param('perpage', DEFAULT_PAGE_SIZE, PARAM_INT); // How many per page.
42
$contextid    = optional_param('contextid', 0, PARAM_INT); // One of this or.
43
$courseid     = optional_param('id', 0, PARAM_INT); // This are required.
44
$newcourse    = optional_param('newcourse', false, PARAM_BOOL);
45
$roleid       = optional_param('roleid', 0, PARAM_INT);
46
$urlgroupid   = optional_param('group', 0, PARAM_INT);
47
 
48
$PAGE->set_url('/user/index.php', array(
49
        'page' => $page,
50
        'perpage' => $perpage,
51
        'contextid' => $contextid,
52
        'id' => $courseid,
53
        'newcourse' => $newcourse));
54
 
55
if ($contextid) {
56
    $context = context::instance_by_id($contextid, MUST_EXIST);
57
    if ($context->contextlevel != CONTEXT_COURSE) {
58
        throw new \moodle_exception('invalidcontext');
59
    }
60
    $course = $DB->get_record('course', array('id' => $context->instanceid), '*', MUST_EXIST);
61
} else {
62
    $course = $DB->get_record('course', array('id' => $courseid), '*', MUST_EXIST);
63
    $context = context_course::instance($course->id, MUST_EXIST);
64
}
65
// Not needed anymore.
66
unset($contextid);
67
unset($courseid);
68
 
69
require_login($course);
70
 
71
$systemcontext = context_system::instance();
72
$isfrontpage = ($course->id == SITEID);
73
 
74
$frontpagectx = context_course::instance(SITEID);
75
 
76
if ($isfrontpage) {
77
    $PAGE->set_pagelayout('admin');
78
    course_require_view_participants($systemcontext);
79
} else {
80
    $PAGE->set_pagelayout('incourse');
81
    course_require_view_participants($context);
82
}
83
 
84
// Trigger events.
85
user_list_view($course, $context);
86
 
87
$PAGE->set_title("$course->shortname: ".get_string('participants'));
88
$PAGE->set_heading($course->fullname);
89
$PAGE->set_pagetype('course-view-participants');
90
$PAGE->set_docs_path('enrol/users');
91
$PAGE->add_body_class('path-user');                     // So we can style it independently.
92
$PAGE->set_other_editing_capability('moodle/course:manageactivities');
93
 
94
// Expand the users node in the settings navigation when it exists because those pages
95
// are related to this one.
96
$node = $PAGE->settingsnav->find('users', navigation_node::TYPE_CONTAINER);
97
if ($node) {
98
    $node->force_open();
99
}
100
 
101
echo $OUTPUT->header();
102
 
103
$participanttable = new \core_user\table\participants("user-index-participants-{$course->id}");
104
 
105
// Manage enrolments.
106
$manager = new course_enrolment_manager($PAGE, $course);
107
$enrolbuttons = $manager->get_manual_enrol_buttons();
108
$enrolrenderer = $PAGE->get_renderer('core_enrol');
109
$enrolbuttonsout = '';
110
foreach ($enrolbuttons as $enrolbutton) {
111
    $enrolbuttonsout .= $enrolrenderer->render($enrolbutton);
112
}
113
 
114
echo $OUTPUT->render_participants_tertiary_nav($course, html_writer::div($enrolbuttonsout, '', [
115
    'data-region' => 'wrapper',
116
    'data-table-uniqueid' => $participanttable->uniqueid,
117
]));
118
 
119
$filterset = new \core_user\table\participants_filterset();
120
$filterset->add_filter(new integer_filter('courseid', filter::JOINTYPE_DEFAULT, [(int)$course->id]));
121
 
122
$canaccessallgroups = has_capability('moodle/site:accessallgroups', $context);
123
$filtergroupids = $urlgroupid ? [$urlgroupid] : [];
124
 
125
// Force group filtering if user should only see a subset of groups' users.
126
if ($course->groupmode != NOGROUPS && !$canaccessallgroups) {
127
    if ($filtergroupids) {
128
        $filtergroupids = array_intersect(
129
            $filtergroupids,
130
            array_keys(groups_get_all_groups($course->id, $USER->id))
131
        );
132
    } else {
133
        $filtergroupids = array_keys(groups_get_all_groups($course->id, $USER->id));
134
    }
135
 
136
    if (empty($filtergroupids)) {
137
        if ($course->groupmode == SEPARATEGROUPS) {
138
            // The user is not in a group so show message and exit.
139
            echo $OUTPUT->notification(get_string('notingroup'));
140
            echo $OUTPUT->footer();
141
            exit();
142
        } else {
143
            $filtergroupids = [(int) groups_get_course_group($course, true)];
144
        }
145
    }
146
}
147
 
148
// Apply groups filter if included in URL or forced due to lack of capabilities.
149
if (!empty($filtergroupids)) {
150
    $filterset->add_filter(new integer_filter('groups', filter::JOINTYPE_DEFAULT, $filtergroupids));
151
}
152
 
153
// Display single group information if requested in the URL.
154
if ($urlgroupid > 0 && ($course->groupmode != SEPARATEGROUPS || $canaccessallgroups)) {
155
    $grouprenderer = $PAGE->get_renderer('core_group');
156
    $groupdetailpage = new \core_group\output\group_details($urlgroupid);
157
    echo $grouprenderer->group_details($groupdetailpage);
158
}
159
 
160
// Filter by role if passed via URL (used on profile page).
161
if ($roleid) {
162
    $viewableroles = get_profile_roles($context);
163
 
164
    // Apply filter if the user can view this role.
165
    if (array_key_exists($roleid, $viewableroles)) {
166
        $filterset->add_filter(new integer_filter('roles', filter::JOINTYPE_DEFAULT, [$roleid]));
167
    }
168
}
169
 
170
// Render the user filters.
171
$userrenderer = $PAGE->get_renderer('core_user');
172
echo $userrenderer->participants_filter($context, $participanttable->uniqueid);
173
 
174
echo '<div class="userlist">';
175
 
176
// Do this so we can get the total number of rows.
177
ob_start();
178
$participanttable->set_filterset($filterset);
179
$participanttable->out($perpage, true);
180
$participanttablehtml = ob_get_contents();
181
ob_end_clean();
182
 
183
echo html_writer::start_tag('form', [
184
    'action' => 'action_redir.php',
185
    'method' => 'post',
186
    'id' => 'participantsform',
187
    'data-course-id' => $course->id,
188
    'data-table-unique-id' => $participanttable->uniqueid,
189
]);
190
echo '<div>';
191
echo '<input type="hidden" name="sesskey" value="'.sesskey().'" />';
192
echo '<input type="hidden" name="returnto" value="'.s($PAGE->url->out(false)).'" />';
193
 
194
echo html_writer::tag(
195
    'p',
196
    get_string('countparticipantsfound', 'core_user', $participanttable->totalrows),
197
    [
198
        'data-region' => 'participant-count',
199
    ]
200
);
201
 
202
echo $participanttablehtml;
203
 
204
$bulkoptions = (object) [
205
    'uniqueid' => $participanttable->uniqueid,
206
];
207
 
208
echo '<br /><div class="buttons"><div class="d-flex flex-wrap align-items-center">';
209
 
210
echo html_writer::start_tag('div', array('class' => 'btn-group'));
211
 
212
if ($participanttable->get_page_size() < $participanttable->totalrows) {
213
    // Select all users, refresh table showing all users and mark them all selected.
214
    $label = get_string('selectalluserswithcount', 'moodle', $participanttable->totalrows);
215
    echo html_writer::empty_tag('input', [
216
        'type' => 'button',
217
        'id' => 'checkall',
218
        'class' => 'btn btn-secondary',
219
        'value' => $label,
220
        'data-target-page-size' => TABLE_SHOW_ALL_PAGE_SIZE,
221
    ]);
222
}
223
echo html_writer::end_tag('div');
224
$displaylist = array();
225
if (!empty($CFG->messaging) && has_all_capabilities(['moodle/site:sendmessage', 'moodle/course:bulkmessaging'], $context)) {
226
    $displaylist['#messageselect'] = get_string('messageselectadd');
227
}
228
if (!empty($CFG->enablenotes) && has_capability('moodle/notes:manage', $context) && $context->id != $frontpagectx->id) {
229
    $displaylist['#addgroupnote'] = get_string('addnewnote', 'notes');
230
}
231
 
232
$params = ['operation' => 'download_participants'];
233
 
234
$downloadoptions = [];
235
$formats = core_plugin_manager::instance()->get_plugins_of_type('dataformat');
236
foreach ($formats as $format) {
237
    if ($format->is_enabled()) {
238
        $params = ['operation' => 'download_participants', 'dataformat' => $format->name];
239
        $url = new moodle_url('bulkchange.php', $params);
240
        $downloadoptions[$url->out(false)] = get_string('dataformat', $format->component);
241
    }
242
}
243
 
244
if (!empty($downloadoptions)) {
245
    $displaylist[] = [get_string('downloadas', 'table') => $downloadoptions];
246
}
247
 
248
if ($context->id != $frontpagectx->id) {
249
    $instances = $manager->get_enrolment_instances();
250
    $plugins = $manager->get_enrolment_plugins(false);
251
    foreach ($instances as $key => $instance) {
252
        if (!isset($plugins[$instance->enrol])) {
253
            // Weird, some broken stuff in plugin.
254
            continue;
255
        }
256
        $plugin = $plugins[$instance->enrol];
257
        $bulkoperations = $plugin->get_bulk_operations($manager);
258
 
259
        $pluginoptions = [];
260
        foreach ($bulkoperations as $key => $bulkoperation) {
261
            $params = ['plugin' => $plugin->get_name(), 'operation' => $key];
262
            $url = new moodle_url('bulkchange.php', $params);
263
            $pluginoptions[$url->out(false)] = $bulkoperation->get_title();
264
        }
265
        if (!empty($pluginoptions)) {
266
            $name = get_string('pluginname', 'enrol_' . $plugin->get_name());
267
            $displaylist[] = [$name => $pluginoptions];
268
        }
269
    }
270
}
271
 
272
$selectactionparams = array(
273
    'id' => 'formactionid',
274
    'class' => 'ml-2',
275
    'data-action' => 'toggle',
276
    'data-togglegroup' => 'participants-table',
277
    'data-toggle' => 'action',
278
    'disabled' => 'disabled'
279
);
280
$label = html_writer::tag('label', get_string("withselectedusers"),
281
        ['for' => 'formactionid', 'class' => 'col-form-label d-inline']);
282
$select = html_writer::select($displaylist, 'formaction', '', ['' => 'choosedots'], $selectactionparams);
283
echo html_writer::tag('div', $label . $select);
284
 
285
echo '<input type="hidden" name="id" value="' . $course->id . '" />';
286
echo '<div class="d-none" data-region="state-help-icon">' . $OUTPUT->help_icon('publishstate', 'notes') . '</div>';
287
echo '</div></div></div>';
288
 
289
$bulkoptions->noteStateNames = note_get_state_names();
290
 
291
echo '</form>';
292
 
293
$PAGE->requires->js_call_amd('core_user/participants', 'init', [$bulkoptions]);
294
echo '</div>';  // Userlist.
295
 
296
$enrolrenderer = $PAGE->get_renderer('core_enrol');
297
// Need to re-generate the buttons to avoid having elements with duplicate ids on the page.
298
$enrolbuttons = $manager->get_manual_enrol_buttons();
299
$enrolbuttonsout = '';
300
foreach ($enrolbuttons as $enrolbutton) {
301
    $enrolbuttonsout .= $enrolrenderer->render($enrolbutton);
302
}
303
echo html_writer::div($enrolbuttonsout, 'd-flex justify-content-end', [
304
    'data-region' => 'wrapper',
305
    'data-table-uniqueid' => $participanttable->uniqueid,
306
]);
307
 
308
echo $OUTPUT->footer();