[ Index ]

PHP Cross Reference of Drupal 6 (gatewave)

title

Body

[close]

/sites/all/modules/filter_perms/ -> filter_perms.module (source)

   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  }


Generated: Thu Mar 24 11:18:33 2011 Cross-referenced by PHPXref 0.7