You are here

function filter_perms_form_alter in Filter Permissions 6

Implementation of hook_form_alter().

File

./filter_perms.module, line 87
This module adds a role and module filter to the user permissions page. Best used when you have an unruly amount of roles or permissions on your site and want to more efficiently manage them without loading a gigantic grid of checkboxes.

Code

function filter_perms_form_alter(&$form, $form_state, $form_id) {
  if ($form_id == 'user_admin_perm') {

    // CSS for floating and sizing the select boxes and submit button.
    drupal_add_css(drupal_get_path('module', 'filter_perms') . '/filter_perms.css');
    if (isset($_SESSION['filter_perm_roles']) && count($_SESSION['filter_perm_roles'])) {
      $roles = $_SESSION['filter_perm_roles'];

      // If '--All Roles' is selected, get all roles.
      if (isset($roles['-1'])) {
        $user_roles = user_roles();
        foreach ($user_roles as $user_role_key => $user_role) {
          $roles[$user_role_key] = $user_role_key;
        }
      }
    }
    else {

      // Until the session variable is set, don't display any roles.
      $roles = array();
    }
    $cp_field_perms = array();
    if (isset($_SESSION['filter_perm_modules']) && count($_SESSION['filter_perm_modules'])) {
      $modules = $_SESSION['filter_perm_modules'];
      if (!isset($modules['content_permissions']) && module_exists('content_permissions')) {
        $cp_types = array();

        // If any content type is chosen under content_permissions, show content_permissions.
        foreach ($modules as $cp_module) {
          if (strstr($cp_module, 'content_permissions_')) {
            $cp_types[] = str_replace('content_permissions_', '', $cp_module);
          }
        }
        if (count($cp_types)) {
          foreach ($cp_types as $cp_type) {
            $cp_info = content_types($cp_type);
            $cp_fields = $cp_info['fields'];
            foreach ($cp_fields as $cp_field) {
              $cp_field_perms[] = 'edit ' . $cp_field['field_name'];
              $cp_field_perms[] = 'view ' . $cp_field['field_name'];
            }
          }
        }
      }

      // if '--All Modules' is selected, get all modules.
      if (isset($modules['-1'])) {
        foreach (module_list(FALSE, FALSE, TRUE) as $module) {
          if (module_invoke($module, 'perm')) {
            $modules[$module] = $module;
          }
        }
      }
    }
    else {

      // Until the session variable is set, don't display any modules.
      $modules = array();
    }
    $perms = array();
    foreach ($form['permission'] as $perm_key => $perm) {
      if (is_numeric($perm_key)) {
        $perm_module = $perm['#value'];
      }
      else {
        if (in_array($perm_module, $modules)) {
          $perms[$perm_module][$perm_key] = $perm['#value'];
        }
        elseif ($perm_module == 'content_permissions' && in_array($perm['#value'], $cp_field_perms)) {
          $perms[$perm_module][$perm_key] = $perm['#value'];
        }
      }
    }
    $old_checkboxes = $form['checkboxes'];
    $old_roles = $form['role_names'];
    $form['permission'] = array();
    $form['checkboxes'] = array();
    $form['role_names'] = array();
    unset($form['submit']);

    // If either a role or module is not selected, don't display checkboxes.
    if (count($roles) && count($modules)) {
      $new_roles = array();
      foreach ($old_roles as $rid => $role) {
        if (in_array($rid, $roles)) {
          $new_roles[$rid] = $role;
        }
      }
      $perm_index = 0;
      foreach ($perms as $perm_key => $perm) {
        $form['permission'][$perm_index] = array(
          '#value' => $perm_key,
        );
        $perm_index++;
        foreach ($perms[$perm_key] as $perm_name => $perm_value) {
          $form['permission'][$perm_name] = array(
            '#value' => $perm_value,
          );
          foreach ($new_roles as $rid => $role) {
            $form['checkboxes'][$rid]['#type'] = 'checkboxes';
            $form['checkboxes'][$rid]['#options'][$perm_name] = '';
            $form['checkboxes'][$rid]['#default_value'] = $old_checkboxes[$rid]['#default_value'];
          }
        }
      }
      $form['role_names'] = $new_roles;
      $form['submit'] = array(
        '#type' => 'submit',
        '#value' => 'Save permissions',
      );
      $form['#submit'] = array(
        'filter_perms_user_admin_perm_submit',
      );
    }
    else {

      // Put some basic info in if filters are not selected.
      $form['permission']['-1'] = array(
        '#value' => 'Empty',
      );
      $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',
      );
    }
  }
}