| [ Index ] |
PHP Cross Reference of Drupal 6 (gatewave) |
[Summary view] [Print] [Text view]
1 <?php 2 // $Id$ 3 4 /** 5 * @file 6 * This module adds a role and module filter to the user permissions page. Best used 7 * when you have an unruly amount of roles or permissions on your site and want to 8 * more efficiently manage them without loading a gigantic grid of checkboxes. 9 */ 10 11 /** 12 * Implementation of hook_menu_alter(). 13 */ 14 function filter_perms_menu_alter(&$callbacks) { 15 $callbacks['admin/user/permissions']['page callback'] = 'filter_perms_admin_perm'; 16 } 17 18 /** 19 * Page callback which appends a filter form to the standard user_admin_perm form. 20 */ 21 function filter_perms_admin_perm($a) { 22 $output = drupal_get_form('filter_perms_admin_perm_filter'); 23 $output .= drupal_get_form('user_admin_perm'); 24 return $output; 25 } 26 27 /** 28 * Form providing a multiple select for roles and modules for filtering permissions. 29 */ 30 function filter_perms_admin_perm_filter() { 31 $form['filters'] = array( 32 '#type' => 'fieldset', 33 '#title' => t('Permission Filters'), 34 '#collapsible' => TRUE, 35 '#collapsed' => FALSE, 36 ); 37 $role_options = user_roles(); 38 // Displays all user roles. 39 $form['filters']['roles'] = array( 40 '#title' => t('Roles to display'), 41 '#type' => 'select', 42 '#options' => array('-1' => '--All Roles') + $role_options, 43 '#default_value' => isset($_SESSION['filter_perm_roles']) ? $_SESSION['filter_perm_roles'] : '', 44 '#size' => 8, 45 '#multiple' => TRUE, 46 ); 47 $module_options = array(); 48 foreach (module_list(FALSE, FALSE, TRUE) as $module) { 49 if ($module == 'content_permissions') { 50 $module_options[$module] = $module .' ('. t('or select individual content types below') .')'; 51 $content_types = node_get_types('types'); 52 foreach ($content_types as $content_type) { 53 $content_type_info = content_types($content_type->type); 54 // Only show content types with fields. 55 if (count($content_type_info['fields'])) { 56 $module_options['content_permissions_'. $content_type->type] = '- '. $content_type->name; 57 } 58 } 59 } 60 elseif (module_invoke($module, 'perm')) { 61 $module_options[$module] = $module; 62 } 63 } 64 // Displays all modules which implement hook_perm(). 65 $form['filters']['modules'] = array( 66 '#title' => t('Modules to display'), 67 '#type' => 'select', 68 '#options' => array('-1' => '--All Modules') + $module_options, 69 '#default_value' => isset($_SESSION['filter_perm_modules']) ? $_SESSION['filter_perm_modules'] : '', 70 '#size' => 8, 71 '#multiple' => TRUE, 72 ); 73 74 $form['filters']['submit'] = array('#type' => 'submit', '#value' => t('Filter Permissions')); 75 return $form; 76 } 77 /** 78 * Submit handler for filter_perms_admin_perm_filter form. 79 */ 80 function filter_perms_admin_perm_filter_submit($form, &$form_state) { 81 $_SESSION['filter_perm_roles'] = $form_state['values']['roles']; 82 $_SESSION['filter_perm_modules'] = $form_state['values']['modules']; 83 } 84 85 /** 86 * Implementation of hook_form_alter(). 87 */ 88 function filter_perms_form_alter(&$form, $form_state, $form_id) { 89 if ($form_id == 'user_admin_perm') { 90 // CSS for floating and sizing the select boxes and submit button. 91 drupal_add_css(drupal_get_path('module', 'filter_perms') .'/filter_perms.css'); 92 if (isset($_SESSION['filter_perm_roles']) && count($_SESSION['filter_perm_roles'])) { 93 $roles = $_SESSION['filter_perm_roles']; 94 // If '--All Roles' is selected, get all roles. 95 if (isset($roles['-1'])) { 96 $user_roles = user_roles(); 97 foreach ($user_roles as $user_role_key => $user_role) { 98 $roles[$user_role_key] = $user_role_key; 99 } 100 } 101 } 102 else { 103 // Until the session variable is set, don't display any roles. 104 $roles = array(); 105 } 106 $cp_field_perms = array(); 107 if (isset($_SESSION['filter_perm_modules']) && count($_SESSION['filter_perm_modules'])) { 108 $modules = $_SESSION['filter_perm_modules']; 109 if (!isset($modules['content_permissions']) && module_exists('content_permissions')) { 110 $cp_types = array(); 111 // If any content type is chosen under content_permissions, show content_permissions. 112 foreach ($modules as $cp_module) { 113 if (strstr($cp_module, 'content_permissions_')) { 114 $cp_types[] = str_replace('content_permissions_', '', $cp_module); 115 } 116 } 117 if (count($cp_types)) { 118 foreach ($cp_types as $cp_type) { 119 $cp_info = content_types($cp_type); 120 $cp_fields = $cp_info['fields']; 121 foreach ($cp_fields as $cp_field) { 122 $cp_field_perms[] = 'edit '. $cp_field['field_name']; 123 $cp_field_perms[] = 'view '. $cp_field['field_name']; 124 } 125 } 126 } 127 } 128 // if '--All Modules' is selected, get all modules. 129 if (isset($modules['-1'])) { 130 foreach (module_list(FALSE, FALSE, TRUE) as $module) { 131 if (module_invoke($module, 'perm')) { 132 $modules[$module] = $module; 133 } 134 } 135 } 136 } 137 else { 138 // Until the session variable is set, don't display any modules. 139 $modules = array(); 140 } 141 $perms = array(); 142 foreach ($form['permission'] as $perm_key => $perm) { 143 if (is_numeric($perm_key)) { 144 $perm_module = $perm['#value']; 145 } 146 else { 147 if (in_array($perm_module, $modules)) { 148 $perms[$perm_module][$perm_key] = $perm['#value']; 149 } 150 elseif (($perm_module == 'content_permissions' && in_array($perm['#value'], $cp_field_perms))) { 151 $perms[$perm_module][$perm_key] = $perm['#value']; 152 } 153 } 154 } 155 $old_checkboxes = $form['checkboxes']; 156 $old_roles = $form['role_names']; 157 $form['permission'] = array(); 158 $form['checkboxes'] = array(); 159 $form['role_names'] = array(); 160 unset($form['submit']); 161 // If either a role or module is not selected, don't display checkboxes. 162 if (count($roles) && count($modules)) { 163 $new_roles = array(); 164 foreach ($old_roles as $rid => $role) { 165 if (in_array($rid, $roles)) { 166 $new_roles[$rid] = $role; 167 } 168 } 169 $perm_index = 0; 170 foreach ($perms as $perm_key => $perm) { 171 $form['permission'][$perm_index] = array('#value' => $perm_key); 172 $perm_index++; 173 foreach ($perms[$perm_key] as $perm_name => $perm_value) { 174 $form['permission'][$perm_name] = array('#value' => $perm_value); 175 foreach ($new_roles as $rid => $role) { 176 $form['checkboxes'][$rid]['#type'] = 'checkboxes'; 177 $form['checkboxes'][$rid]['#options'][$perm_name] = ''; 178 $form['checkboxes'][$rid]['#default_value'] = $old_checkboxes[$rid]['#default_value']; 179 } 180 } 181 } 182 $form['role_names'] = $new_roles; 183 $form['submit'] = array('#type' => 'submit', '#value' => 'Save permissions'); 184 $form['#submit'] = array('filter_perms_user_admin_perm_submit'); 185 } 186 else { 187 // Put some basic info in if filters are not selected. 188 $form['permission']['-1'] = array('#value' => 'Empty'); 189 $form['permission']['Empty'] = array('#value' => 'Please select at least one value from both the Roles and Modules select boxes above and then click the "Filter Permissions" button'); 190 } 191 } 192 } 193 194 /** 195 * Submit handler which overrides user_admin_perm_submit(). 196 */ 197 function filter_perms_user_admin_perm_submit($form, &$form_state) { 198 // Save permissions: 199 $result = db_query('SELECT * FROM {role}'); 200 while ($role = db_fetch_object($result)) { 201 if (isset($form_state['values'][$role->rid])) { 202 $permissions = array(); 203 $indexed_perms = array(); 204 $current_perms = db_result(db_query("SELECT perm FROM {permission} WHERE rid = %d", $role->rid)); 205 if (drupal_strlen($current_perms)) { 206 $permissions = explode(', ', $current_perms); 207 } 208 foreach ($permissions as $permission) { 209 $indexed_perms[$permission] = $permission; 210 } 211 $permissions = $indexed_perms; 212 foreach ($form_state['values'][$role->rid] as $perm_key => $role_perms) { 213 if (isset($permissions[$perm_key])) { 214 if ($role_perms == 0) { 215 unset($permissions[$perm_key]); 216 } 217 } 218 } 219 $permissions = array_merge($permissions, array_filter($form_state['values'][$role->rid])); 220 db_query('DELETE FROM {permission} WHERE rid = %d', $role->rid); 221 if (count($permissions)) { 222 db_query("INSERT INTO {permission} (rid, perm) VALUES (%d, '%s')", $role->rid, implode(', ', array_values($permissions))); 223 } 224 } 225 } 226 227 drupal_set_message(t('The changes have been saved.')); 228 229 // Clear the cached pages 230 cache_clear_all(); 231 } 232 233 /** 234 * Implementation of hook_theme_registry_alter(). 235 */ 236 function filter_perms_theme_registry_alter(&$theme_registry) { 237 $theme_registry['system_admin_by_module']['function'] = 'theme_filter_perms_admin_by_module'; 238 } 239 240 function theme_filter_perms_admin_by_module($menu_items) { 241 $stripe = 0; 242 $output = ''; 243 $container = array('left' => '', 'right' => ''); 244 $flip = array('left' => 'right', 'right' => 'left'); 245 $position = 'left'; 246 247 // Iterate over all modules 248 foreach ($menu_items as $module => $block) { 249 list($description, $items) = $block; 250 251 // Output links 252 if (count($items)) { 253 if (isset($items['-1'])) { 254 $items['-1'] = str_replace('#module-', '/', $items['-1']); 255 } 256 $block = array(); 257 $block['title'] = $module; 258 $block['content'] = theme('item_list', $items); 259 $block['description'] = t($description); 260 261 if ($block_output = theme('admin_block', $block)) { 262 if (!isset($block['position'])) { 263 // Perform automatic striping. 264 $block['position'] = $position; 265 $position = $flip[$position]; 266 } 267 $container[$block['position']] .= $block_output; 268 } 269 } 270 } 271 272 $output = '<div class="admin clear-block">'; 273 foreach ($container as $id => $data) { 274 $output .= '<div class="'. $id .' clear-block">'; 275 $output .= $data; 276 $output .= '</div>'; 277 } 278 $output .= '</div>'; 279 280 return $output; 281 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
| Generated: Thu Mar 24 11:18:33 2011 | Cross-referenced by PHPXref 0.7 |