filter_perms.module 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. <?php
  2. /**
  3. * Implements hook_form_FORM_ID_alter().
  4. */
  5. function filter_perms_form_system_modules_alter(&$form, &$form_state, $form_id) {
  6. // Confirmation page for enabling dependencies will also fire this hook.
  7. if (isset($form['modules'])) {
  8. // Replace anchors in links with url paramaters so server side processing can happen.
  9. foreach ($form['modules'] as $group_key => $module_group) {
  10. if (is_array($module_group)) {
  11. $modules = element_children($module_group);
  12. foreach ($modules as $key => $module) {
  13. if(!empty($form['modules'][$group_key][$module]['links']['permissions']['#options']['fragment'])) {
  14. $form['modules'][$group_key][$module]['links']['permissions']['#href'] .= '/'. $form['modules'][$group_key][$module]['links']['permissions']['#options']['fragment'];
  15. unset($form['modules'][$group_key][$module]['links']['permissions']['#options']['fragment']);
  16. }
  17. }
  18. }
  19. }
  20. }
  21. }
  22. /**
  23. * Implements hook_form_FORM_ID_alter().
  24. */
  25. function filter_perms_form_user_admin_permissions_alter(&$form, $form_state, $form_id) {
  26. drupal_add_css(drupal_get_path('module', 'filter_perms') . '/filter_perms.css');
  27. if (isset($_SESSION['filter_perm_roles']) && count($_SESSION['filter_perm_roles'])) {
  28. $roles = $_SESSION['filter_perm_roles'];
  29. // If '--All Roles' is selected, get all roles.
  30. if (isset($roles['-1'])) {
  31. $user_roles = user_roles();
  32. foreach ($user_roles as $user_role_key => $user_role) {
  33. $roles[$user_role_key] = $user_role_key;
  34. }
  35. }
  36. }
  37. else {
  38. // Until the session variable is set, don't display any roles.
  39. $roles = array();
  40. }
  41. $cp_field_perms = array();
  42. if (isset($_SESSION['filter_perm_modules']) && count($_SESSION['filter_perm_modules'])) {
  43. $modules = $_SESSION['filter_perm_modules'];
  44. // if '--All Modules' is selected, get all modules.
  45. if (isset($modules['-1'])) {
  46. foreach (module_list(FALSE, FALSE, TRUE) as $module) {
  47. if (module_invoke($module, 'permission')) {
  48. $modules[$module] = $module;
  49. }
  50. }
  51. }
  52. }
  53. else {
  54. // Until the session variable is set, don't display any modules.
  55. $modules = array();
  56. }
  57. $perms = array();
  58. foreach ($form['permission'] as $perm_key => $perm) {
  59. if (is_numeric($perm_key)) {
  60. $perm_module = $perm['#id'];
  61. $perm_id = $perm_key;
  62. }
  63. else {
  64. if (in_array($perm_module, $modules)) {
  65. $perms[$perm_module][$perm_key] = $perm_id;
  66. }
  67. }
  68. }
  69. $old_perms = $form['permission'];
  70. $old_checkboxes = $form['checkboxes'];
  71. $old_roles = $form['role_names'];
  72. $form['permission'] = array();
  73. $form['checkboxes'] = array();
  74. $form['role_names'] = array();
  75. // If either a role or module is not selected, don't display checkboxes.
  76. if (count($roles) && count($modules)) {
  77. $new_roles = array();
  78. foreach ($old_roles as $rid => $role) {
  79. if (in_array($rid, $roles)) {
  80. $new_roles[$rid] = $role;
  81. }
  82. }
  83. $perm_index = 0;
  84. foreach ($perms as $perm_key => $perm) {
  85. foreach ($perms[$perm_key] as $perm_name => $perm_value) {
  86. $form['permission'][$perm_index] = $old_perms[$perm_value];
  87. $form['permission'][$perm_name] = $old_perms[$perm_name];
  88. foreach ($new_roles as $rid => $role) {
  89. $form['checkboxes'][$rid]['#type'] = 'checkboxes';
  90. $form['checkboxes'][$rid]['#options'][$perm_name] = '';
  91. $form['checkboxes'][$rid]['#default_value'] = $old_checkboxes[$rid]['#default_value'];
  92. }
  93. }
  94. $perm_index++;
  95. }
  96. $form['role_names'] = $new_roles;
  97. foreach ($new_roles as $new_rid => $new_role) {
  98. $form['role_names']['#value'][$new_rid] = $new_role['#markup'];
  99. }
  100. $form['role_names']['#type'] = 'value';
  101. //No longer need to add a custom submit handler as core appears to handle partial form submits.
  102. }
  103. else {
  104. // Put some basic info in if filters are not selected.
  105. $form['permission']['-1'] = array('#markup' => 'Filter Selection', '#id' => 'empty');
  106. $form['permission']['empty'] = array('#type' => 'item', '#markup' => 'Please select at least one value from both the Roles and Modules select boxes above and then click the "Filter Permissions" button');
  107. // Initialize an empty array to avoid warnings in theme function.
  108. $form['role_names']['#value'] = array();
  109. // Remove the Save permissions button when no permissions are present.
  110. unset($form['actions']['submit']);
  111. }
  112. }
  113. /**
  114. * Implements hook_menu_alter().
  115. */
  116. function filter_perms_menu_alter(&$callbacks) {
  117. $callbacks['admin/people/permissions']['page callback'] = 'filter_perms_admin_perm';
  118. }
  119. /**
  120. * Page callback which appends a filter form to the standard user_admin_permissions form.
  121. */
  122. function filter_perms_admin_perm() {
  123. $output = array();
  124. $output['filter_perms_admin_perm_filter'] = drupal_get_form('filter_perms_admin_perm_filter');
  125. $output['user_admin_permissions'] = drupal_get_form('user_admin_permissions');
  126. return $output;
  127. }
  128. /**
  129. * Form providing a multiple select for roles and modules for filtering permissions.
  130. */
  131. function filter_perms_admin_perm_filter() {
  132. // @todo: Move this handling to a more appropriate place prior to drupal_goto().
  133. $url_parts = explode('/', request_uri());
  134. $url_last = $url_parts[count($url_parts) - 1];
  135. if (is_numeric($url_last)) {
  136. // Role Ids will come from role page referral.
  137. $_SESSION['filter_perm_roles'] = array($url_last => $url_last);
  138. // Show selected role for all modules.
  139. foreach (module_list(FALSE, FALSE, TRUE) as $module) {
  140. if (module_invoke($module, 'permission')) {
  141. $_SESSION['filter_perm_modules'][$module] = $module;
  142. }
  143. }
  144. }
  145. elseif (strstr($url_last, 'module-')) {
  146. // module- prefix indicates module page referral.
  147. $single_module = str_replace('module-', '', $url_last);
  148. $_SESSION['filter_perm_modules'] = array($single_module => $single_module);
  149. // Show all roles for selected module.
  150. $user_roles = user_roles();
  151. foreach ($user_roles as $user_role_key => $user_role) {
  152. $_SESSION['filter_perm_roles'][$user_role_key] = $user_role_key;
  153. }
  154. }
  155. if ($url_last != 'permissions' && (strpos($url_last, 'permissions?') === FALSE)) {
  156. drupal_goto('admin/people/permissions');
  157. }
  158. $form['filters'] = array(
  159. '#type' => 'fieldset',
  160. '#title' => t('Permission Filters'),
  161. '#collapsible' => TRUE,
  162. '#collapsed' => FALSE,
  163. );
  164. $role_options = user_roles();
  165. // Displays all user roles.
  166. $form['filters']['roles'] = array(
  167. '#title' => t('Roles to display'),
  168. '#type' => 'select',
  169. '#options' => array('-1' => '--All Roles') + $role_options,
  170. '#default_value' => isset($_SESSION['filter_perm_roles']) ? $_SESSION['filter_perm_roles'] : '',
  171. '#size' => 8,
  172. '#multiple' => TRUE,
  173. );
  174. $module_options = array();
  175. // TRUE for the 3rd parameter forces name sorting instead of by module weight.
  176. foreach (module_list(FALSE, FALSE, TRUE) as $module) {
  177. if (module_invoke($module, 'permission')) {
  178. $module_options[$module] = $module;
  179. }
  180. }
  181. // Displays all modules which implement hook_permission().
  182. $form['filters']['modules'] = array(
  183. '#title' => t('Modules to display'),
  184. '#type' => 'select',
  185. '#options' => array('-1' => '--All Modules') + $module_options,
  186. '#default_value' => isset($_SESSION['filter_perm_modules']) ? $_SESSION['filter_perm_modules'] : '',
  187. '#size' => 8,
  188. '#multiple' => TRUE,
  189. );
  190. $form['filters']['submit'] = array('#type' => 'submit', '#value' => t('Filter Permissions'));
  191. return $form;
  192. }
  193. /**
  194. * Submit handler for filter_perms_admin_perm_filter form.
  195. */
  196. function filter_perms_admin_perm_filter_submit($form, &$form_state) {
  197. $_SESSION['filter_perm_roles'] = $form_state['values']['roles'];
  198. $_SESSION['filter_perm_modules'] = $form_state['values']['modules'];
  199. }