? change_how_roles_are_granted_and_deleted.patch Index: og_user_roles.pages.inc =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/og_user_roles/og_user_roles.pages.inc,v retrieving revision 1.5 diff -u -p -r1.5 og_user_roles.pages.inc --- og_user_roles.pages.inc 6 Dec 2009 19:26:37 -0000 1.5 +++ og_user_roles.pages.inc 1 Jan 2010 17:45:24 -0000 @@ -140,13 +140,20 @@ function og_user_roles_page_form_submit( $gid = $form['#node']->nid; foreach ($form_state['values']['user_roles'] as $uid => $new_roles) { - foreach ($form['#assignable_roles'] as $rid => $name) { - if (empty($new_roles[$rid])) { - og_user_roles_role_delete($gid, $uid, $rid); - } - else { - og_user_roles_role_add($gid, $uid, $rid); - } + $orginal_roles = $form['user_roles'][$uid]['roles']['#default_value']; + + // Determine which roles need to be granted to the user. + $granted_roles = array_filter(array_diff($new_roles, $orginal_roles)); + + // Determine which roles need to be deleted from the user. + $deleted_roles = array_diff($orginal_roles, $new_roles); + + foreach ($granted_roles as $rid => $checked) { + og_user_roles_role_add($gid, $uid, $rid); + } + + foreach ($deleted_roles as $rid => $checked) { + og_user_roles_role_delete($gid, $uid, $rid); } }