? hook_og_user_roles.patch ? hook_og_user_roles2.patch Index: og_user_roles.module =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/og_user_roles/og_user_roles.module,v retrieving revision 1.36 diff -u -p -r1.36 og_user_roles.module --- og_user_roles.module 8 Jun 2009 12:57:47 -0000 1.36 +++ og_user_roles.module 20 Jun 2009 14:00:21 -0000 @@ -417,11 +417,15 @@ function og_user_roles_get_roles_by_grou * The user ID. * @param $rid * The role ID to grant. + * @param $args + * an array with custom parameter values that are passed to hook implementations. */ -function og_user_roles_role_add($gid, $uid, $rid) { +function og_user_roles_role_add($gid, $uid, $rid, $args = array()) { $granted = db_result(db_query_range("SELECT rid FROM {og_users_roles} WHERE gid = %d AND uid = %d AND rid = %d", $gid, $uid, $rid, 0, 1)); if (!$granted) { db_query("INSERT INTO {og_users_roles} (uid, gid, rid) VALUES (%d, %d, %d)", $uid, $gid, $rid); + + module_invoke_all('og_user_roles', 'role add', $gid, $uid, $rid, $args); } } @@ -434,13 +438,17 @@ function og_user_roles_role_add($gid, $u * The user ID. * @param $rid * (Optional) The role ID to remove. If omitted, all roles are removed. + * @param $args + * an array with custom parameter values that are passed to hook implementations. */ -function og_user_roles_role_delete($gid, $uid, $rid = NULL) { +function og_user_roles_role_delete($gid, $uid, $rid = NULL, $args = array()) { if (is_null($rid)) { db_query("DELETE FROM {og_users_roles} WHERE gid = %d AND uid = %d", $gid, $uid); } else { db_query("DELETE FROM {og_users_roles} WHERE gid = %d AND uid = %d AND rid = %d", $gid, $uid, $rid); } + + module_invoke_all('og_user_roles', 'role delete', $gid, $uid, $rid, $args); } 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.3 diff -u -p -r1.3 og_user_roles.pages.inc --- og_user_roles.pages.inc 8 Jun 2009 13:00:05 -0000 1.3 +++ og_user_roles.pages.inc 20 Jun 2009 14:00:21 -0000 @@ -131,10 +131,21 @@ function og_user_roles_page_form_submit( $gid = $form['#node']->nid; foreach ($form_state['values']['user_roles'] as $uid => $new_roles) { - og_user_roles_role_delete($gid, $uid); + //get the user's current roles from the db. + $original_roles = og_user_roles_get_roles_by_group($gid, $uid); + + //determine which roles to add + $add_roles = array_diff($new_roles, $original_roles); + $add_roles = array_filter($add_roles); + + //determine which roles to delete + $delete_roles = array_diff($original_roles, $new_roles); + + foreach ($delete_roles as $rid => $checked) { + og_user_roles_role_delete($gid, $uid, $rid); + } - $new_roles = array_filter($new_roles); - foreach ($new_roles as $rid => $checked) { + foreach ($add_roles as $rid => $checked) { og_user_roles_role_add($gid, $uid, $rid); } }