-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathd7permissions.admin.inc
executable file
·178 lines (161 loc) · 6.72 KB
/
d7permissions.admin.inc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
<?php
// $Id$
/**
* @file
* Admin forms callback file for the d7permissions module.
*/
/**
* Menu callback: d7permissions_admin_perm.
*
* @see d7permissions_admin_perm_submit(),
* @see theme_d7permissions_admin_perm(),
*/
function d7permissions_admin_perm($form_state, $rid = NULL) {
if (is_numeric($rid)) {
$result = db_query('SELECT r.rid, p.perm FROM {role} r LEFT JOIN {permission} p ON r.rid = p.rid WHERE r.rid = %d', $rid);
}
else {
$result = db_query('SELECT r.rid, p.perm FROM {role} r LEFT JOIN {permission} p ON r.rid = p.rid ORDER BY name');
}
while ($role = db_fetch_object($result)) {
$role_permissions[$role->rid] = $role->perm .',';
}
// Retrieve role names for columns
$role_names = array();
$results = db_query("SELECT role.rid AS role_id, role.name AS role_name, d7permissions_role_order.weight AS role_weight FROM {role} {role} INNER JOIN {d7permissions_role_order} ON role.rid = d7permissions_role_order.rid ORDER BY d7permissions_role_order.weight");
while ($row = db_fetch_object($results)) {
$role_names[$row->role_id] = $row->role_name;
}
// Render role/permission overview
$options = array();
foreach (module_list(FALSE, FALSE, TRUE) as $module) {
if ($permissions = module_invoke($module, 'perm')) {
$form['permission'][] = array(
'#value' => $module,
);
asort($permissions);
foreach ($permissions as $perm) {
$options[$perm] = '';
$form['permission'][$perm] = array('#value' => t($perm));
foreach ($role_names as $rid => $name) {
// Builds arrays for checked boxes for each role
if (strpos($role_permissions[$rid], $perm .',') !== FALSE) {
$status[$rid][] = $perm;
}
}
}
}
}
// Have to build checkboxes here after checkbox arrays are built
foreach ($role_names as $rid => $name) {
$form['checkboxes'][$rid] = array('#type' => 'checkboxes', '#options' => $options, '#default_value' => isset($status[$rid]) ? $status[$rid] : array());
$form['role_names'][$rid] = array('#value' => $name, '#tree' => TRUE);
}
$form['submit'] = array('#type' => 'submit', '#value' => t('Save permissions'));
return $form;
}
function d7permissions_admin_perm_submit($form, &$form_state) {
// Save permissions
$result = db_query('SELECT * FROM {role}');
while ($role = db_fetch_object($result)) {
if (isset($form_state['values'][$role->rid])) {
db_query('DELETE FROM {permission} WHERE rid = %d', $role->rid);
$form_state['values'][$role->rid] = array_filter($form_state['values'][$role->rid]);
if (count($form_state['values'][$role->rid])) {
db_query("INSERT INTO {permission} (rid, perm) VALUES (%d, '%s')", $role->rid, implode(', ', array_keys($form_state['values'][$role->rid])));
}
}
}
drupal_set_message(t('The changes have been saved.'));
// Clear the cached pages
cache_clear_all();
}
function theme_d7permissions_admin_perm($form) {
drupal_add_js(drupal_get_path('module', 'd7permissions') . '/d7permissions.js');
$roles = user_roles();
foreach (element_children($form['permission']) as $key) {
// Don't take form control structures
if (is_array($form['permission'][$key])) {
$row = array();
// Module name
if (is_numeric($key)) {
$row[] = array('data' => t('@module module', array('@module' => drupal_render($form['permission'][$key]))), 'class' => 'module', 'id' => 'module-'. $form['permission'][$key]['#value'], 'colspan' => count($form['role_names']) + 1);
}
else {
$row[] = array('data' => drupal_render($form['permission'][$key]), 'class' => 'permission');
foreach (element_children($form['checkboxes']) as $rid) {
if (is_array($form['checkboxes'][$rid])) {
$row[] = array('data' => drupal_render($form['checkboxes'][$rid][$key]), 'class' => 'checkbox', 'title' => $roles[$rid] .' : '. t($key));
}
}
}
$rows[] = $row;
}
}
$header[] = (t('Permission'));
foreach (element_children($form['role_names']) as $rid) {
if (is_array($form['role_names'][$rid])) {
$header[] = array('data' => drupal_render($form['role_names'][$rid]), 'class' => 'checkbox');
}
}
$output = theme('table', $header, $rows, array('id' => 'permissions'));
$output .= drupal_render($form);
return $output;
}
/**
* Menu callback: d7permissions_role_order.
*
* @see d7permissions_role_order_submit(),
* @see theme_d7permissions_role_order(),
*/
function d7permissions_role_order($form_state) {
// Select role weights
$results = db_query("SELECT role.rid AS role_id, role.name AS role_name, d7permissions_role_order.weight AS role_weight FROM {role} {role} INNER JOIN {d7permissions_role_order} ON role.rid = d7permissions_role_order.rid ORDER BY role_weight ASC");
// Build the form
$form['#attributes'] = array('name' => 'role-order-form');
while ($row = db_fetch_object($results)) {
$form['rows'][$row->role_id]['data'] = array(
'#type' => 'value',
'#value' => array($row->role_name),
);
$form['rows'][$row->role_id]['weight-' . $row->role_id] = array(
'#type' => 'weight',
'#default_value' => $row->role_weight,
'#attributes' => array('class' => 'weight'),
);
}
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Save changes'),
);
return $form;
}
function d7permissions_role_order_submit($form, &$form_state) {
foreach ($form_state['values'] as $key => $value) {
if (drupal_substr($key, 0, 6) == 'weight') {
$id = str_replace('weight-', '', $key);
db_query("UPDATE {d7permissions_role_order} SET weight=%d WHERE rid=%d", $value, $id);
}
}
drupal_set_message(t('The changes have been saved.'));
// Clear the cached pages
cache_clear_all();
}
function theme_d7permissions_role_order($form) {
// Loop throuth form rows and build our new table rows
foreach ($form['rows'] as $id => $row) {
if (intval($id)) {
$this_row = $row['data']['#value'];
$this_row[] = drupal_render($form['rows'][$id]['weight-' . $id]);
$table_rows[] = array('data' => $this_row, 'class' => 'draggable');
}
}
$header = array(t('Name'), t('Weight'));
// Theme table
$output = t('Set your Roles in the order that you would like them to appear on the permissions page');
$output .= theme('table', $header, $table_rows, array('id' => 'role-order-table'));
$output .= drupal_render($form);
// Convert table-based weight form to a draggable jQuery weight form
drupal_add_tabledrag('role-order-table', 'order', 'sibling', 'weight', NULL, NULL, FALSE);
return $output;
}