--- adminrole.module.orig 2009-10-30 11:18:40.339574428 -0500 +++ adminrole.module 2009-10-30 11:19:01.207922800 -0500 @@ -14,6 +14,8 @@ function adminrole_help($section) { switch ($section) { case 'admin/user/adminrole': return t('Change which role is an "administrator" role with full permissions'); + case 'admin/user/adminrole/exceptions': + return t('Select the permissions below you DO NOT want the admin role to have.'); } } @@ -23,13 +25,22 @@ function adminrole_help($section) { function adminrole_menu() { $items = array(); - $items['admin/user/adminrole'] = array( + $items['admin/user/adminrole/roles'] = array( 'title' => t('Admin Role'), 'description' => t('Change which role is an "administrator" role with full permissions'), 'page callback' => 'drupal_get_form', 'page arguments' => array('adminrole_admin_settings'), 'access arguments' => array('administer site configuration'), - 'type' => MENU_NORMAL_ITEM, + 'type' => MENU_LOCAL_TASK, + ); + $items['admin/user/adminrole/exceptions'] = array( + 'title' => t('Admin Role Permission Exceptions'), + 'description' => t('Exclude permissions from automatically turning on for the admin role.'), + 'page callback' => 'drupal_get_form', + 'page arguments' => array('adminrole_settings_exceptions'), + 'access arguments' => array('administer site configuration'), + 'type' => MENU_LOCAL_TASK, + 'weight' => 5, ); $items['admin/adminrole/update'] = array( @@ -42,6 +53,46 @@ function adminrole_menu() { return $items; } +function adminrole_settings_exceptions($form_state) { + $form = array(); + $options = array(); + $defaults = explode(', ', variable_get('adminrole_exceptions', '')); + 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)); + } + } + } + + $form['checkboxes'] = array('#type' => 'checkboxes', '#options' => $options, '#default_value' => array_values($defaults)); + + $form = system_settings_form($form); + $form['#theme'] = 'adminrole_settings_exceptions'; + $form['#submit'] = array('adminrole_settings_exceptions_submit'); + return $form; +} + +function adminrole_settings_exceptions_submit($form, &$form_state) { + if ($op == t('Reset to defaults')) { + variable_del('adminrole_exceptions'); + drupal_set_message(t('The configuration options have been reset to their default values.')); + } + else { + $perms = array_filter($form_state['values']['checkboxes']); + variable_set('adminrole_exceptions', implode(', ', array_keys($perms))); + } + + cache_clear_all(); + drupal_rebuild_theme_registry(); + adminrole_update_perms(); +} + function adminrole_update_perms() { if ($admin_role = variable_get('adminrole_adminrole', 0)) { if ($admin_role == 0) { @@ -53,6 +104,10 @@ function adminrole_update_perms() { $perms = array_merge($perms, $permissions); } } + + $exceptions = array_values(explode(', ', variable_get('adminrole_exceptions', ''))); + $perms = array_diff($perms, $exceptions); + db_query('DELETE FROM {permission} WHERE rid = %d', $admin_role); if (count($perms)) { db_query("INSERT INTO {permission} (rid, perm) VALUES (%d, '%s')", $admin_role, implode(', ', $perms)); @@ -63,7 +118,6 @@ function adminrole_update_perms() { function adminrole_admin_settings() { $form = array(); - $u_roles = user_roles(); // Removing Authenticated and anonymous roles unset($u_roles[1]); @@ -88,3 +142,36 @@ function adminrole_form_alter(&$form, $f $form['#submit'][] = 'adminrole_update_perms'; } } + +function adminrole_theme() { + return array( + 'adminrole_settings_exceptions' => array( + 'argument' => array('form' => NULL), + ), + ); +} + + +function theme_adminrole_settings_exceptions($form) { + 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' => 2); + } + else { + $row[] = array('data' => drupal_render($form['permission'][$key]), 'class' => 'permission'); + $row[] = array('data' => drupal_render($form['checkboxes'][$key]), 'class' => 'checkbox', 'title' => 'admin role' .' : '. t($key)); + } + $rows[] = $row; + } + } + $header[] = (t('Permission')); + $output = theme('table', $header, $rows, array('id' => 'permissions')); + $output .= drupal_render($form); + return $output; +} + +