924fe6343045bf0fddd309e0cfe53441801b3b0f
[moodle.git] / admin / roles / override.php
1 <?php
3 // This file is part of Moodle - http://moodle.org/
4 //
5 // Moodle is free software: you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation, either version 3 of the License, or
8 // (at your option) any later version.
9 //
10 // Moodle is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 // GNU General Public License for more details.
14 //
15 // You should have received a copy of the GNU General Public License
16 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
18 /**
19  * Lets you override role definitions in contexts.
20  *
21  * @package    moodlecore
22  * @subpackage role
23  * @copyright  1999 onwards Martin Dougiamas (http://dougiamas.com)
24  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
25  */
27 require('../../config.php');
28 require_once("$CFG->dirroot/$CFG->admin/roles/lib.php");
30 $contextid = required_param('contextid', PARAM_INT);   // context id
31 $roleid    = required_param('roleid', PARAM_INT);   // requested role id
33 // security first
34 list($context, $course, $cm) = get_context_info_array($contextid);
35 require_login($course, false, $cm);
36 $safeoverridesonly = !has_capability('moodle/role:override', $context);
37 if ($safeoverridesonly) {
38     require_capability('moodle/role:safeoverride', $context);
39 }
41 $PAGE->set_url('/admin/roles/override.php', array('contextid' => $contextid, 'roleid' => $roleid));
42 $PAGE->set_context($context);
44 $userid  = 0;
45 $tabfile = null;
47 if ($course) {
48     $isfrontpage = ($context->contextlevel == CONTEXT_COURSE and $context->instanceid == SITEID);
50 } else {
51     $isfrontpage = false;
52     if ($context->contextlevel == CONTEXT_USER) {
53         $courseid = optional_param('courseid', SITEID, PARAM_INT); // needed for user/tabs.php
54         $course = $DB->get_record('course', array('id'=>$courseid), '*', MUST_EXIST);
55         $PAGE->url->param('courseid', $courseid);
56         $userid = $context->instanceid;
57     } else {
58         $course = $SITE;
59     }
60 }
62 $courseid = $course->id;
64 $baseurl = $PAGE->url->out();
65 $returnurl = new moodle_url('/admin/roles/permissions.php', array('contextid' => $context->id));
67 $role = $DB->get_record('role', array('id'=>$roleid), '*', MUST_EXIST);
69 // These are needed early because of tabs.php
70 $assignableroles  = get_assignable_roles($context, ROLENAME_BOTH);
71 list($overridableroles, $overridecounts, $nameswithcounts) = get_overridable_roles($context, ROLENAME_BOTH, true);
73 // Work out an appropriate page title.
74 $contextname = print_context_name($context);
75 $straction = get_string('overrideroles', 'role'); // Used by tabs.php
76 $a = (object)array('context' => $contextname, 'role' => $overridableroles[$roleid]);
77 $title = get_string('overridepermissionsforrole', 'role', $a);
79 // Print the header and tabs
80 if ($context->contextlevel == CONTEXT_SYSTEM) {
81     print_error('cannotoverridebaserole', 'error');
83 } else if ($context->contextlevel == CONTEXT_USER) {
84     // NOTE: this is not linked from UI for now
85     $userid = $context->instanceid;
86     $user = $DB->get_record('user', array('id'=>$userid, 'deleted'=>0), '*', MUST_EXIST);
87     $fullname = fullname($user, has_capability('moodle/site:viewfullnames', $context));
89     // course header
90     if ($isfrontpage) {
91         $PAGE->set_heading($course->fullname);
92     } else {
93         if (has_capability('moodle/course:viewparticipants', get_context_instance(CONTEXT_COURSE, $courseid))) {
94             $PAGE->navbar->add(get_string('participants'), new moodle_url('/user/index.php', array('id'=>$courseid)));
95         }
96         $PAGE->set_heading($fullname);
97     }
98     $PAGE->navbar->add($fullname, new moodle_url("$CFG->wwwroot/user/view.php", array('id'=>$userid,'course'=>$courseid)));
99     $PAGE->navbar->add($straction);
101     $showroles = 1;
102     $currenttab = 'permissions';
103     $tabfile = $CFG->dirroot.'/user/tabs.php';
105 } else if ($isfrontpage) {
106     admin_externalpage_setup('frontpageroles', '', array(), $PAGE->url);
107     $currenttab = 'permissions';
108     $tabfile = 'tabs.php';
110 } else {
111     $currenttab = 'permissions';
112     $tabfile = 'tabs.php';
116 // Handle the cancel button.
117 if (optional_param('cancel', false, PARAM_BOOL)) {
118     redirect($returnurl);
121 // Make sure this user can override that role
122 if (empty($overridableroles[$roleid])) {
123     $a = new stdClass;
124     $a->roleid = $roleid;
125     $a->context = $contextname;
126     print_error('cannotoverriderolehere', '', get_context_url($context), $a);
129 // If we are actually overriding a role, create the table object, and save changes if appropriate.
130 $overridestable = new override_permissions_table_advanced($context, $roleid, $safeoverridesonly);
131 $overridestable->read_submitted_permissions();
133 if (optional_param('savechanges', false, PARAM_BOOL) && confirm_sesskey()) {
134     $overridestable->save_changes();
135     $rolename = $overridableroles[$roleid];
136     add_to_log($course->id, 'role', 'override', 'admin/roles/override.php?contextid='.$context->id.'&roleid='.$roleid, $rolename, '', $USER->id);
137     redirect($returnurl);
140 // Finally start page output
141 echo $OUTPUT->header();
142 if ($tabfile) {
143     include($tabfile);
145 echo $OUTPUT->heading_with_help($title, 'overrides');
147 // Show UI for overriding roles.
148 if (!empty($capabilities)) {
149     echo $OUTPUT->box(get_string('nocapabilitiesincontext', 'role'), 'generalbox boxaligncenter');
151 } else {
152     // Print the capabilities overrideable in this context
153     echo $OUTPUT->box_start('generalbox capbox');
155     ?>
156 <form id="overrideform" action="<?php echo $baseurl ?>" method="post"><div>
157     <input type="hidden" name="sesskey" value="<?php p(sesskey()); ?>" />
158     <input type="hidden" name="roleid" value="<?php p($roleid); ?>" />
159             <?php
161             echo '<p class="overridenotice">' . get_string('highlightedcellsshowinherit', 'role') . ' </p>';
162             $overridestable->display();
164             if ($overridestable->has_locked_capabiltites()) {
165                 echo '<p class="overridenotice">' . get_string('safeoverridenotice', 'role') . "</p>\n";
166             }
168             ?>
169     <div class="submit buttons">
170         <input type="submit" name="savechanges" value="<?php print_string('savechanges') ?>" />
171         <input type="submit" name="cancel" value="<?php print_string('cancel') ?>" />
172     </div>
173 </div></form>
174     <?php
175     echo $OUTPUT->box_end();
179 // Print a form to swap roles, and a link back to the all roles list.
180 echo '<div class="backlink">';
181 $select = new single_select(new moodle_url($baseurl), 'roleid', $nameswithcounts, $roleid, null);
182 $select->label = get_string('overrideanotherrole', 'role');
183 echo $OUTPUT->render($select);
184 echo '<p><a href="' . $returnurl . '">' . get_string('backtoallroles', 'role') . '</a></p>';
185 echo '</div>';
187 echo $OUTPUT->footer();