64f8762b8b528c70e4b38a4d3b976e2dd98640ed
[moodle.git] / admin / tool / capability / renderer.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  * Capability tool renderer.
19  *
20  * @package    tool_capability
21  * @copyright  2013 Sam Hemelryk
22  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
25 /**
26  * The primary renderer for the capability tool.
27  *
28  * @copyright  2013 Sam Hemelryk
29  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
30  */
31 class tool_capability_renderer extends plugin_renderer_base {
33     /**
34      * Returns an array of permission strings.
35      *
36      * @return lang_string[]
37      */
38     protected function get_permission_strings() {
39         static $strpermissions;
40         if (!$strpermissions) {
41             $strpermissions = array(
42                 CAP_INHERIT => new lang_string('inherit', 'role'),
43                 CAP_ALLOW => new lang_string('allow', 'role'),
44                 CAP_PREVENT => new lang_string('prevent', 'role'),
45                 CAP_PROHIBIT => new lang_string('prohibit', 'role')
46             );
47         }
48         return $strpermissions;
49     }
51     /**
52      * Returns an array of permission CSS classes.
53      *
54      * @return string[]
55      */
56     protected function get_permission_classes() {
57         static $permissionclasses;
58         if (!$permissionclasses) {
59             $permissionclasses = array(
60                 CAP_INHERIT => 'inherit',
61                 CAP_ALLOW => 'allow',
62                 CAP_PREVENT => 'prevent',
63                 CAP_PROHIBIT => 'prohibit',
64             );
65         }
66         return $permissionclasses;
67     }
69     /**
70      * Produces a table to visually compare roles and capabilities.
71      *
72      * @param array $capabilities An array of capabilities to show comparison for.
73      * @param int $contextid The context we are displaying for.
74      * @param array $roles An array of roles to show comparison for.
75      * @param bool $onlydiff show only different permissions
76      * @return string
77      */
78     public function capability_comparison_table(array $capabilities, $contextid, array $roles, $onlydiff=false) {
79         static $capabilitycontexts = array();
81         $strpermissions = $this->get_permission_strings();
82         $permissionclasses = $this->get_permission_classes();
84         if ($contextid === context_system::instance()->id) {
85             $strpermissions[CAP_INHERIT] = new lang_string('notset', 'role');
86         }
88         $table = new html_table();
89         $table->attributes['class'] = 'comparisontable';
90         $table->head = array('&nbsp;');
91         foreach ($roles as $role) {
92             $url = new moodle_url('/admin/roles/define.php', array('action' => 'view', 'roleid' => $role->id));
93             $table->head[] = html_writer::div(html_writer::link($url, $role->localname));
94         }
95         $table->data = array();
97         foreach ($capabilities as $capability) {
98             if (empty($capabilitycontexts[$capability])) {
99                 $capabilitycontexts[$capability] = tool_capability_calculate_role_data($capability, $roles);
100             }
101             $contexts = $capabilitycontexts[$capability];
103             $captitle = new html_table_cell(get_capability_string($capability) . html_writer::span($capability));
104             $captitle->header = true;
106             $row = new html_table_row(array($captitle));
108             $permissiontypes = array();
109             foreach ($roles as $role) {
110                 if (isset($contexts[$contextid]->rolecapabilities[$role->id])) {
111                     $permission = $contexts[$contextid]->rolecapabilities[$role->id];
112                 } else {
113                     $permission = CAP_INHERIT;
114                 }
115                 if (!in_array($permission, $permissiontypes)) {
116                     $permissiontypes[] = $permission;
117                 }
118                 $cell = new html_table_cell($strpermissions[$permission]);
119                 $cell->attributes['class'] = $permissionclasses[$permission];
120                 $row->cells[] = $cell;
121             }
122             if (!$onlydiff || count($permissiontypes) > 1) {
123                 $table->data[] = $row;
124             }
125         }
127         // Start the list item, and print the context name as a link to the place to make changes.
128         $context = context::instance_by_id($contextid);
130         if ($context instanceof context_system) {
131             $url = new moodle_url('/admin/roles/manage.php');
132         } else {
133             $url = new moodle_url('/admin/roles/permissions.php', ['contextid' => $contextid]);
134         }
136         $title = get_string('permissionsincontext', 'core_role', $context->get_context_name());
138         $html = $this->output->heading(html_writer::link($url, $title), 3);
139         if (!empty($table->data)) {
140             $html .= html_writer::table($table);
141         } else {
142             $html .= html_writer::tag('p', get_string('nodifferences', 'tool_capability'));
143         }
144         // If there are any child contexts, print them recursively.
145         if (!empty($contexts[$contextid]->children)) {
146             foreach ($contexts[$contextid]->children as $childcontextid) {
147                 $html .= $this->capability_comparison_table($capabilities, $childcontextid, $roles, $onlydiff);
148             }
149         }
150         return $html;
151     }