Merge branch 'MDL-47162' of git://github.com/merrill-oakland/moodle
[moodle.git] / admin / roles / define.php
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/>.
17 /**
18  * Lets the user edit role definitions.
19  *
20  * Responds to actions:
21  *   add       - add a new role (allows import, duplicate, archetype)
22  *   export    - save xml role definition
23  *   edit      - edit the definition of a role
24  *   view      - view the definition of a role
25  *
26  * @package    core_role
27  * @copyright  1999 onwards Martin Dougiamas (http://dougiamas.com)
28  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
29  */
31 require_once(__DIR__ . '/../../config.php');
32 require_once($CFG->libdir.'/adminlib.php');
34 $action = required_param('action', PARAM_ALPHA);
35 if (!in_array($action, array('add', 'export', 'edit', 'reset', 'view'))) {
36     throw new moodle_exception('invalidaccess');
37 }
38 if ($action != 'add') {
39     $roleid = required_param('roleid', PARAM_INT);
40 } else {
41     $roleid = 0;
42 }
43 $resettype = optional_param('resettype', '', PARAM_RAW);
44 $return = optional_param('return', 'manage', PARAM_ALPHA);
46 // Get the base URL for this and related pages into a convenient variable.
47 $baseurl = new moodle_url('/admin/roles/define.php', array('action'=>$action, 'roleid'=>$roleid));
48 $manageurl = new moodle_url('/admin/roles/manage.php');
49 if ($return === 'manage') {
50     $returnurl = $manageurl;
51 } else {
52     $returnurl = new moodle_url('/admin/roles/define.php', array('action'=>'view', 'roleid'=>$roleid));;
53 }
55 // Check access permissions.
56 $systemcontext = context_system::instance();
57 require_login();
58 require_capability('moodle/role:manage', $systemcontext);
59 admin_externalpage_setup('defineroles', '', array('action' => $action, 'roleid' => $roleid), new moodle_url('/admin/roles/define.php'));
61 // Export role.
62 if ($action === 'export') {
63     core_role_preset::send_export_xml($roleid);
64     die;
65 }
67 // Handle the toggle advanced mode button.
68 $showadvanced = get_user_preferences('definerole_showadvanced', false);
69 if (optional_param('toggleadvanced', false, PARAM_BOOL)) {
70     $showadvanced = !$showadvanced;
71     set_user_preference('definerole_showadvanced', $showadvanced);
72 }
74 // Get some basic data we are going to need.
75 $roles = get_all_roles();
76 $rolenames = role_fix_names($roles, $systemcontext, ROLENAME_ORIGINAL);
77 $rolescount = count($roles);
79 if ($action === 'add') {
80     $title = get_string('addinganewrole', 'core_role');
81 } else if ($action == 'view') {
82     $title = get_string('viewingdefinitionofrolex', 'core_role', $rolenames[$roleid]->localname);
83 } else if ($action == 'reset') {
84     $title = get_string('resettingrole', 'core_role', $rolenames[$roleid]->localname);
85 } else {
86     $title = get_string('editingrolex', 'core_role', $rolenames[$roleid]->localname);
87 }
89 // Decide how to create new role.
90 if ($action === 'add' and $resettype !== 'none') {
91     $mform = new core_role_preset_form(null, array('action'=>'add', 'roleid'=>0, 'resettype'=>'0', 'return'=>'manage'));
92     if ($mform->is_cancelled()) {
93         redirect($manageurl);
95     } else if ($data = $mform->get_data()) {
96         $resettype = $data->resettype;
97         $options = array(
98             'shortname'     => 1,
99             'name'          => 1,
100             'description'   => 1,
101             'permissions'   => 1,
102             'archetype'     => 1,
103             'contextlevels' => 1,
104             'allowassign'   => 1,
105             'allowoverride' => 1,
106             'allowswitch'   => 1);
107         if ($showadvanced) {
108             $definitiontable = new core_role_define_role_table_advanced($systemcontext, 0);
109         } else {
110             $definitiontable = new core_role_define_role_table_basic($systemcontext, 0);
111         }
112         if (is_number($resettype)) {
113             // Duplicate the role.
114             $definitiontable->force_duplicate($resettype, $options);
115         } else {
116             // Must be an archetype.
117             $definitiontable->force_archetype($resettype, $options);
118         }
120         if ($xml = $mform->get_file_content('rolepreset')) {
121             $definitiontable->force_preset($xml, $options);
122         }
124     } else {
125         echo $OUTPUT->header();
126         echo $OUTPUT->heading_with_help($title, 'roles', 'core_role');
127         $mform->display();
128         echo $OUTPUT->footer();
129         die;
130     }
132 } else if ($action === 'reset' and $resettype !== 'none') {
133     if (!$role = $DB->get_record('role', array('id'=>$roleid))) {
134         redirect($manageurl);
135     }
136     $resettype = empty($role->archetype) ? '0' : $role->archetype;
137     $mform = new core_role_preset_form(null,
138         array('action'=>'reset', 'roleid'=>$roleid, 'resettype'=>$resettype , 'permissions'=>1, 'archetype'=>1, 'contextlevels'=>1, 'return'=>$return));
139     if ($mform->is_cancelled()) {
140         redirect($returnurl);
142     } else if ($data = $mform->get_data()) {
143         $resettype = $data->resettype;
144         $options = array(
145             'shortname'     => $data->shortname,
146             'name'          => $data->name,
147             'description'   => $data->description,
148             'permissions'   => $data->permissions,
149             'archetype'     => $data->archetype,
150             'contextlevels' => $data->contextlevels,
151             'allowassign'   => $data->allowassign,
152             'allowoverride' => $data->allowoverride,
153             'allowswitch'   => $data->allowswitch);
154         if ($showadvanced) {
155             $definitiontable = new core_role_define_role_table_advanced($systemcontext, $roleid);
156         } else {
157             $definitiontable = new core_role_define_role_table_basic($systemcontext, $roleid);
158         }
159         if (is_number($resettype)) {
160             // Duplicate the role.
161             $definitiontable->force_duplicate($resettype, $options);
162         } else {
163             // Must be an archetype.
164             $definitiontable->force_archetype($resettype, $options);
165         }
167         if ($xml = $mform->get_file_content('rolepreset')) {
168             $definitiontable->force_preset($xml, $options);
169         }
171     } else {
172         echo $OUTPUT->header();
173         echo $OUTPUT->heading_with_help($title, 'roles', 'core_role');
174         $mform->display();
175         echo $OUTPUT->footer();
176         die;
177     }
179 } else {
180     // Create the table object.
181     if ($action === 'view') {
182         $definitiontable = new core_role_view_role_definition_table($systemcontext, $roleid);
183     } else if ($showadvanced) {
184         $definitiontable = new core_role_define_role_table_advanced($systemcontext, $roleid);
185     } else {
186         $definitiontable = new core_role_define_role_table_basic($systemcontext, $roleid);
187     }
188     $definitiontable->read_submitted_permissions();
191 // Handle the cancel button.
192 if (optional_param('cancel', false, PARAM_BOOL)) {
193     redirect($returnurl);
196 // Process submission in necessary.
197 if (optional_param('savechanges', false, PARAM_BOOL) && confirm_sesskey() && $definitiontable->is_submission_valid()) {
198     $definitiontable->save_changes();
199     $tableroleid = $definitiontable->get_role_id();
200     // Trigger event.
201     $event = \core\event\role_capabilities_updated::create(
202         array(
203             'context' => $systemcontext,
204             'objectid' => $tableroleid
205         )
206     );
207     $event->set_legacy_logdata(array(SITEID, 'role', $action, 'admin/roles/define.php?action=view&roleid=' . $tableroleid,
208         $definitiontable->get_role_name(), '', $USER->id));
209     if (!empty($role)) {
210         $event->add_record_snapshot('role', $role);
211     }
212     $event->trigger();
214     if ($action === 'add') {
215         redirect(new moodle_url('/admin/roles/define.php', array('action'=>'view', 'roleid'=>$definitiontable->get_role_id())));
216     } else {
217         redirect($returnurl);
218     }
221 // Print the page header and tabs.
222 echo $OUTPUT->header();
224 $currenttab = 'manage';
225 require('managetabs.php');
227 echo $OUTPUT->heading_with_help($title, 'roles', 'core_role');
229 // Work out some button labels.
230 if ($action === 'add') {
231     $submitlabel = get_string('createthisrole', 'core_role');
232 } else {
233     $submitlabel = get_string('savechanges');
236 // On the view page, show some extra controls at the top.
237 if ($action === 'view') {
238     echo $OUTPUT->container_start('buttons');
239     $url = new moodle_url('/admin/roles/define.php', array('action'=>'edit', 'roleid'=>$roleid, 'return'=>'define'));
240     echo $OUTPUT->single_button(new moodle_url($url), get_string('edit'));
241     $url = new moodle_url('/admin/roles/define.php', array('action'=>'reset', 'roleid'=>$roleid, 'return'=>'define'));
242     echo $OUTPUT->single_button(new moodle_url($url), get_string('resetrole', 'core_role'));
243     $url = new moodle_url('/admin/roles/define.php', array('action'=>'export', 'roleid'=>$roleid));
244     echo $OUTPUT->single_button(new moodle_url($url), get_string('export', 'core_role'));
245     echo $OUTPUT->single_button($manageurl, get_string('listallroles', 'core_role'));
246     echo $OUTPUT->container_end();
249 // Start the form.
250 echo $OUTPUT->box_start('generalbox');
251 if ($action === 'view') {
252     echo '<div class="mform">';
253 } else {
254     ?>
255 <form id="rolesform" class="mform" action="<?php p($baseurl->out(false)); ?>" method="post"><div>
256 <input type="hidden" name="sesskey" value="<?php p(sesskey()) ?>" />
257 <input type="hidden" name="return" value="<?php p($return); ?>" />
258 <input type="hidden" name="resettype" value="none" />
259 <div class="submit buttons">
260     <input type="submit" name="savechanges" value="<?php p($submitlabel); ?>" />
261     <input type="submit" name="cancel" value="<?php print_string('cancel'); ?>" />
262 </div>
263     <?php
266 // Print the form controls.
267 $definitiontable->display();
269 // Close the stuff we left open above.
270 if ($action === 'view') {
271     echo '</div>';
272 } else {
273     ?>
274 <div class="submit buttons">
275     <input type="submit" name="savechanges" value="<?php p($submitlabel); ?>" />
276     <input type="submit" name="cancel" value="<?php print_string('cancel'); ?>" />
277 </div>
278 </div></form>
279 <?php
281 echo $OUTPUT->box_end();
283 // Print a link back to the all roles list.
284 echo '<div class="backlink">';
285 echo '<p><a href="' . s($manageurl->out(false)) . '">' . get_string('backtoallroles', 'core_role') . '</a></p>';
286 echo '</div>';
288 echo $OUTPUT->footer();