MDL-66332 too_capability: add show differences option
[moodle.git] / admin / tool / capability / index.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  * For a given capability, show what permission it has for every role, and everywhere that it is overridden.
19  *
20  * @package    tool_capability
21  * @copyright  2008 Tim Hunt
22  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
25 require_once(__DIR__ . '/../../../config.php');
26 require_once($CFG->dirroot.'/'.$CFG->admin.'/tool/capability/locallib.php');
27 require_once($CFG->libdir.'/adminlib.php');
29 // Get URL parameters.
30 $systemcontext = context_system::instance();
31 $contextid = optional_param('context', $systemcontext->id, PARAM_INT);
33 // Check permissions.
34 list($context, $course, $cm) = get_context_info_array($contextid);
35 require_login($course, false, $cm);
36 require_capability('moodle/role:manage', $context);
38 // Print the header.
39 admin_externalpage_setup('toolcapability');
41 // Prepare the list of capabilities to choose from.
42 $capabilitychoices = array();
43 foreach ($context->get_capabilities() as $cap) {
44     $capabilitychoices[$cap->name] = $cap->name . ': ' . get_capability_string($cap->name);
45 }
47 $allroles = role_fix_names(get_all_roles($context));
48 // Prepare the list of roles to choose from.
49 $rolechoices = array('0' => get_string('all'));
50 foreach ($allroles as $role) {
51     $rolechoices[$role->id] = $role->localname;
52 }
54 $form = new tool_capability_settings_form(null, array(
55     'capabilities' => $capabilitychoices,
56     'roles' => $rolechoices
57 ));
58 $PAGE->requires->yui_module(
59     'moodle-tool_capability-search',
60     'M.tool_capability.init_capability_search',
61     array(array('strsearch' => get_string('search')))
62 );
64 // Log.
65 $capabilities = array();
66 $rolestoshow = array();
67 $roleids = array('0');
68 $cleanedroleids = array();
69 $onlydiff = false;
70 if ($data = $form->get_data()) {
72     $roleids = array();
73     if (!empty($data->roles)) {
74         $roleids = $data->roles;
75     }
77     $capabilities = array();
78     if (!empty($data->capability)) {
79         $capabilities = $data->capability;
80     }
82     if (in_array('0', $roleids)) {
83         $rolestoshow = $allroles;
84     } else {
85         $cleanedroleids = array_intersect(array_keys($allroles), $roleids);
86         if (count($cleanedroleids) === 0) {
87             $rolestoshow = $allroles;
88         } else {
89             foreach ($cleanedroleids as $id) {
90                 $rolestoshow[$id] = $allroles[$id];
91             }
92         }
93     }
95     if (isset($data->onlydiff)) {
96         $onlydiff = $data->onlydiff;
97     }
98 }
100 \tool_capability\event\report_viewed::create()->trigger();
102 $renderer = $PAGE->get_renderer('tool_capability');
104 echo $OUTPUT->header();
106 $form->display();
108 // If we have a capability, generate the report.
109 if (count($capabilities) && count($rolestoshow)) {
110     /* @var tool_capability_renderer $renderer */
111     echo $renderer->capability_comparison_table($capabilities, $context->id, $rolestoshow, $onlydiff);
114 // Footer.
115 echo $OUTPUT->footer();
117 function print_report_tree($contextid, $contexts, $allroles) {
118     global $CFG;
120     // Array for holding lang strings.
121     static $strpermissions = null;
122     if (is_null($strpermissions)) {
123         $strpermissions = array(
124             CAP_INHERIT => get_string('notset','role'),
125             CAP_ALLOW => get_string('allow','role'),
126             CAP_PREVENT => get_string('prevent','role'),
127             CAP_PROHIBIT => get_string('prohibit','role')
128         );
129     }
131     // Start the list item, and print the context name as a link to the place to
132     // make changes.
133     if ($contextid == context_system::instance()->id) {
134         $url = "$CFG->wwwroot/$CFG->admin/roles/manage.php";
135         $title = get_string('changeroles', 'tool_capability');
136     } else {
137         $url = "$CFG->wwwroot/$CFG->admin/roles/override.php?contextid=$contextid";
138         $title = get_string('changeoverrides', 'tool_capability');
139     }
140     $context = context::instance_by_id($contextid);
141     echo '<h3><a href="' . $url . '" title="' . $title . '">', $context->get_context_name(), '</a></h3>';
143     // If there are any role overrides here, print them.
144     if (!empty($contexts[$contextid]->rolecapabilities)) {
145         $rowcounter = 0;
146         echo '<table class="generaltable rolecaps"><tbody>';
147         foreach ($allroles as $role) {
148             if (isset($contexts[$contextid]->rolecapabilities[$role->id])) {
149                 $permission = $contexts[$contextid]->rolecapabilities[$role->id];
150                 echo '<tr class="r' . ($rowcounter % 2) . '"><th class="cell">', $role->localname,
151                         '</th><td class="cell">' . $strpermissions[$permission] . '</td></tr>';
152                 $rowcounter++;
153             }
154         }
155         echo '</tbody></table>';
156     }
158     // After we have done the site context, change the string for CAP_INHERIT
159     // from 'notset' to 'inherit'.
160     $strpermissions[CAP_INHERIT] = get_string('inherit','role');
162     // If there are any child contexts, print them recursively.
163     if (!empty($contexts[$contextid]->children)) {
164         echo '<ul>';
165         foreach ($contexts[$contextid]->children as $childcontextid) {
166             echo '<li>';
167             print_report_tree($childcontextid, $contexts, $allroles);
168             echo '</li>';
169         }
170         echo '</ul>';
171     }