? 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 2 Jan 2010 17:37:50 -0000 @@ -138,16 +138,31 @@ function og_user_roles_page_form($form_s */ function og_user_roles_page_form_submit($form, &$form_state) { $gid = $form['#node']->nid; + $assignable_roles = array_keys($form['#assignable_roles']); 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']; + + foreach ($orginal_roles as $rid) { + if (!in_array($rid, $assignable_roles)) { + // Remove the default roles. Don't need to add or remove them here. + unset($orginal_roles[$rid]); } } + + // 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); + } } drupal_set_message(t('The changes have been saved.'));