Index: role_delegation.module =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/role_delegation/role_delegation.module,v retrieving revision 1.14.2.4 diff -u -r1.14.2.4 role_delegation.module --- role_delegation.module 12 Jan 2010 20:37:27 -0000 1.14.2.4 +++ role_delegation.module 23 Nov 2010 01:02:00 -0000 @@ -160,6 +160,61 @@ /** + * Implementation of hook_form_user_admin_role_alter(). + */ +function role_delegation_form_user_admin_role_alter(&$form, $form_state) +{ + // Put our submit function in line ahead of user_admin_role_submit(), + // so that it can make use of the old role name before it's changed to the new + array_unshift($form['#submit'], 'role_delegation_form_user_admin_role_submit'); +} + +/** + * Submit function for the user_admin_role form: + * When a role is renamed or deleted, rename or delete the permission + * to assign that role. + */ +function role_delegation_form_user_admin_role_submit($form, &$form_state) { + $op = $form_state['values']['op']; + if ($op != t('Save role') && $op != t('Delete role')) { + return; + } + $rid = $form_state['values']['rid']; + $oldrole = db_result(db_query('SELECT name FROM {role} WHERE rid = %d', $rid)); + $newrole = $form_state['values']['name']; + if ($op == t('Save role') && $oldrole == $newrole) { + return; + } + // Role is being renamed or deleted. + // Loop through permission lists for all roles, renaming or deleting the + // 'assign' permission for this role. + $oldperm = _role_delegation_make_perm($oldrole); + $result = db_query('SELECT * FROM {permission}'); + while ($row = db_fetch_object($result)) { + $perms = explode(', ', $row->perm); + for ($i = 0; $i < count($perms); ++$i) { + if ($perms[$i] == $oldperm) { + switch ($op) { + case t('Save role'): + $perms[$i] = _role_delegation_make_perm($newrole); + break; + case t('Delete role'): + unset($perms[$i]); + break; + } + if (count($perms)) { + db_query("UPDATE {permission} SET perm = '%s' WHERE pid = %d", + implode(', ', $perms), $row->pid); + } else { + db_query("DELETE FROM {permission} WHERE pid = %d", $row->pid); + } + break; + } + } + } +} + +/** * Implementation of hook_user(). */ function role_delegation_user($op, &$edit, &$account, $category = NULL) {