'.t('Allows group administrators to add members into Drupal system roles limited by group.').'

'; } } /** * Implementation of hook_perm(). */ function og_user_roles_perm() { return array( 'configure member roles', 'create og_subgroups', ); } /** * Implementation of hook_access(). */ function og_user_roles_access($op, $node) { global $user; if ($op == 'create') { return user_access('create og_subgroups'); } } /** * Implementation of hook_menu(). */ function og_user_roles_menu($may_cache) { global $user; $items = array(); if (!$may_cache) { $access = $user->uid; // login is required $items[] = array('path' => 'node/ognodeadd', 'type' => MENU_CALLBACK, 'callback' => 'og_user_roles_ognodeadd', 'access' => $access, 'title' => t('Create content')); if (! user_access('administer site configuration')) { $user = user_load(array('uid' => $user->uid)); // Original Code // // This code causes a "configure member roles" tab to appear for each group the user has // admin access to. Problem is, it appears on "My Groups" page: http://clients.brixrealtyinc.com/og/my // // foreach ($user->og_groups as $key => $sub) { // if (og_user_roles_is_allowed($key)) { // $node = node_load(array('nid' => $key)); // Add another tab to the group subscribers page for admins to // configure member roles // $items[] = array( // 'path' => "og/users/$key/roles", // 'callback' => 'og_user_roles_page', // 'title' => t('configure member roles'), // 'callback arguments' => array($key), // 'type' => MENU_LOCAL_TASK, // 'access' => node_access('update', $node), // 'weight' => 5, // ); // } // } // end foreach // Modification // // This prevents this tab from appearing on "My Groups" page: http://clients.brixrealtyinc.com/og/my // // foreach ($user->og_groups as $key => $sub) { if (arg(0) == 'og' && arg(1) == 'users' && arg(2) == $key) { $key = arg(2); if (og_user_roles_is_allowed($key)) { $node = node_load(array('nid' => $key)); // Add another tab to the group subscribers page for admins to // configure member roles $items[] = array( 'path' => "og/users/$key/roles", 'callback' => 'og_user_roles_page', 'title' => t('Configure member roles'), 'callback arguments' => array($key), 'type' => MENU_LOCAL_TASK, // 'access' => node_access('update', $node), 'access' => user_access('configure member roles'), 'weight' => 5, ); } // end if } // end if } // end foreach // // end modification } else { // site admin only $items[] = array( 'path' => 'admin/og/og_user_roles', 'title' => t('Organic groups user roles'), 'description' => t('Allows group administrators to add members into group roles.'), 'callback' => 'drupal_get_form', 'callback arguments' => 'og_user_roles_settings', 'access' => user_access('administer site configuration'), ); // site admin only, admin will see og_user_roles page on each group page if ((arg(0) == 'og') && (arg(1) == 'users') && ($gid = arg(2)) && is_numeric($gid) && (og_user_roles_is_allowed($gid))) { $items[] = array( 'path' => "og/users/$gid/roles", 'callback' => 'og_user_roles_page', 'title' => t('Configure member roles'), 'callback arguments' => array($gid), 'type' => MENU_LOCAL_TASK, 'weight' => 5, 'access' => user_access('administer site configuration') ); } } } // end if return $items; } /** * Implementation of hook_settings(). */ function og_user_roles_settings() { // Get list of all og-enabled node types $group_types = variable_get('og_node_types', array('og')); foreach ($group_types as $type) { $types[$type] = node_get_types('name', $type); } // Get list of roles, not counting authenticated and anonymous user $all_roles = user_roles(); foreach ($all_roles as $rid => $role) { if ($rid > 2) { $roles[$rid] = $role; } } // If no assignable roles, advise user to add some. if (!count($roles)) { $form['og_user_roles'] = array( '#value' => '

'. t('No assignable roles were found. Please create at least one role under administer >> access >> roles.', array('%access' => url('admin/access/roles'))) .'

', ); return $form; } // Create a fieldset for each group type containing role selections foreach ($types as $type => $name) { $form["og_user_roles_$type"] = array( '#type' => 'fieldset', // '#title' => t('%type_name role options', array('%type_name' => theme('placeholder', $name))), '#title' => t('%type_name role options', array('%type_name' => $name)), ); $form["og_user_roles_$type"]["og_user_roles_roles_$type"] = array( '#type' => 'checkboxes', '#title' => t('Assignable roles'), '#options' => $roles, '#default_value' => variable_get("og_user_roles_roles_$type", array()), ); } $form["og_user_roles_default"] = array( '#type' => 'fieldset', '#title' => t('Default Non-Group Role for new users.'), '#description' => t('Allows you to select a role to automatically assign to all new signups to your site.'), ); $form["og_user_roles_default"]["og_user_roles_assign_default"] = array( '#type' => 'checkbox', '#title' => t('Set default global (site-wide) role for new signups?'), '#default_value' => variable_get("og_user_roles_assign_default", 0), '#description' => t('Do you wish to automatically assign all new signups to your web site to a specific role (that is NOT group specific) upon registration?'), ); $form["og_user_roles_default"]["og_user_roles_default_value"] = array( '#type' => 'select', '#title' => t('Selectable roles'), '#options' => $roles, '#default_value' => variable_get("og_user_roles_default_value", 0), ); $form["og_user_roles_founder"] = array( '#type' => 'fieldset', '#title' => t('Default Founder Role for users who create groups.'), '#description' => t('Allows you to select a group role to automatically assign to users who create groups on your site. The role is specific to the group(s) this user creates. That is, the user will only have the privileges of the role in the group that he creates.'), ); $form["og_user_roles_founder"]["og_user_roles_assign_founder"] = array( '#type' => 'checkbox', '#title' => t('Set default group founder (group limited) role for users who create groups?'), '#default_value' => variable_get("og_user_roles_assign_founder", 0), '#description' => t('Do you wish to automatically assign a user who creates a group (e.g. "founder") to a group specific role that is limited to the group that he creates?'), ); $form["og_user_roles_founder"]["og_user_roles_founder_value"] = array( '#type' => 'select', '#title' => t('Role to use as founder role'), '#options' => $roles, '#default_value' => variable_get("og_user_roles_founder_value", 0), '#description' => t('Select the role you wish to use as the "founder" role.'), ); // ---- Modification // Added basic group role option for user roles // - bibo $form["og_user_roles_basicgrouprole"] = array( '#type' => 'fieldset', '#title' => t('Default Basic Group Role for all users in each group.'), '#description' => t('Allows you to select a group role to automatically assign to users who join a group on your site. The role is specific to the group(s) this user creates. That is, the user will only have the privileges of the role in the group that he creates.'), ); $form["og_user_roles_basicgrouprole"]["og_user_roles_assign_basicgrouprole"] = array( '#type' => 'checkbox', '#title' => t('Set default basic group (group limited) role for users who join groups?'), '#default_value' => variable_get("og_user_roles_assign_basicgrouprole", 0), '#description' => t('Do you wish to automatically assign every user to a group specific basic role that is limited to the group that he creates? This role can be be removed by the groups\' admins'), ); $form["og_user_roles_basicgrouprole"]["og_user_roles_basicgrouprole_value"] = array( '#type' => 'select', '#title' => t('Role to use as a basic group role'), '#options' => $roles, '#default_value' => variable_get("og_user_roles_basicgrouprole_value", 0), '#description' => t('Select the role you wish to use as the "basic group role" for every groupmember.'), ); // // --- end of modification $form["og_user_roles_notify"] = array( '#type' => 'fieldset', '#title' => t('Default Group Admin Notification for new subscribers.'), ); $form["og_user_roles_notify"]["og_user_roles_notify_default"] = array( '#type' => 'checkbox', '#title' => t('Send email notification to group admin when new subscriber is added to group?'), '#default_value' => variable_get("og_user_roles_notify_default", 0), '#description' => t('Do you wish to automatically send an email notification to the group administrator when a new subscriber is added to a group? (Note that this feature requires mimemail to be installed)'), ); $form["og_user_roles_all_groups"] = array( '#type' => 'fieldset', '#title' => t('Nodes to automatically place into all available groups.'), ); $form['og_user_roles_all_groups']['og_user_roles_all_groups_nodes'] = array( '#type' => 'textarea', '#title' => t('Nodes to automatically place into all available groups'), '#default_value' => variable_get('og_user_roles_all_groups_nodes', ''), '#cols' => 50, '#rows' => 2, '#description' => t('Specify here the node IDs of nodes which you want placed into all groups, each separated by a comma. Structure your entries like this:

63,20

Each node ID separated by a comma.'), ); $form["og_user_roles_tac_og_default"] = array( '#type' => 'fieldset', '#title' => t('TAC / OG Access Control Integration.'), ); $form["og_user_roles_tac_og_default"]["og_user_roles_tac_og_value"] = array( '#type' => 'checkbox', '#title' => t('Integrate TAC and OG Access Control?'), '#default_value' => variable_get("og_user_roles_tac_og_value", 0), '#description' => t('Do you have Taxonomy Access installed and do you wish to make its access control work with Organic Groups? Details here: http://groups.drupal.org/node/3700'), ); $form["og_user_roles_subgroup"] = array( '#type' => 'fieldset', '#title' => t('Create Subgroups.'), '#description' => t('Allows you to select a group type to use for displaying a "Create Subgroup" link on your group menus. Users will need to have the "create og_subgroups" permission in order to access this link on their group menus. Note that this functionality requires the og_subgroups.module'), ); $form["og_user_roles_subgroup"]["og_user_roles_create_subgroup"] = array( '#type' => 'checkbox', '#title' => t('Create link to "Create Subgroup" in group menu?'), '#default_value' => variable_get("og_user_roles_create_subgroup", 0), '#description' => t('Do you wish to have a "Create Subgroup" link appear on the group menu (if the user has the appropriate permissions)?'), ); $form["og_user_roles_subgroup"]["og_user_roles_create_subgroup_value"] = array( '#type' => 'select', '#title' => t('Group type to use for subgroup creation'), '#options' => $group_types, '#default_value' => variable_get("og_user_roles_create_subgroup_value", ''), '#description' => t('Select the group type you wish to use for subgroup creation.'), ); return system_settings_form($form); } /** * Menu callback; displays members and role selection */ function og_user_roles_page($gid) { $output = ''; $node = node_load(array('nid' => $gid)); // Get roles associated with this group. We rebuild the associative // array because the settings form only passes RID and we need the name. $role_ids = variable_get("og_user_roles_roles_{$node->type}", array()); $all_roles = user_roles(); foreach ($role_ids as $rid => $checked) { if ($checked != 0) { $roles[$rid] = $all_roles[$rid]; } } if (is_array($roles)) { // Retrieve list of all group users $sql = og_list_users_sql(0); $result = pager_query($sql, 100, 0, NULL, $gid); $output .= theme('pager',NULL, 100); $output .= drupal_get_form('og_user_roles_page_form',$gid,$roles,$result); } else { drupal_set_message(t('No roles have been assigned as group roles yet.')); } print theme('page', $output); } /** * Form */ function og_user_roles_page_form($gid,$roles,$result) { $form['user_roles'] = array('#tree' => TRUE); // Make sure form array isn't flattened while ($account = db_fetch_object($result)) { $form['user_roles']['users'][$account->uid] = array( '#type'=>'value', '#value' => $account->uid ); // // Original form // // $form['user_roles']['roles'][$account->uid] = array( // '#type' => 'checkboxes', // '#options' => $roles, // '#default_value' => _user_roles($account->uid, $roles), // ); // // // Modification // // $form['user_roles']['roles'][$account->uid] = array( // '#type' => 'select', // '#multiple' => TRUE, // '#required' => FALSE, // '#size' => 2, // '#options' => $roles, // '#default_value' => _user_roles($account->uid, $roles), // ); // // end modification for pulldown select // // // Multi column checkbox form - as per http://drupal.org/node/41936 // Also "unsubscribe" link added: // $link = l($account->name, "user/$account->uid") . l(t(" (unsubscribe)"), "og/unsubscribe/$gid/$account->uid", array(), "destination=og/users/$gid"); $form['user_roles']['roles'][$account->uid] = array( '#type' => 'checkbox_columns', '#title' => $link, '#default_value' => _og_user_roles($account->uid, $roles), '#columns' => 4, '#options' => $roles, '#suffix' => '
', ); } // Output form to screen $form['submit'] = array('#type' => 'submit', '#value' => t('Save changes')); return $form; } /** * Process the form submission */ function og_user_roles_page_form_submit($form_id, $form_values) { // // Modification // Added this to get gid // if ( is_numeric(arg(2)) ) { $gid = (int)arg(2); } foreach ($form_values['user_roles']['roles'] as $uid => $roles) { foreach ($roles as $rid => $checked) { $exists = db_result(db_query("SELECT * FROM {og_users_roles} WHERE uid = %d AND rid = %d AND gid = %d", $uid, $rid, $gid)); // modification // $exists = db_result(db_query("SELECT * FROM {users_roles} WHERE uid = %d AND rid = %d", $uid, $rid)); // replaced if ($checked && !$exists) { db_query("INSERT INTO {og_users_roles} (uid, rid, gid) VALUES (%d, %d, %d)", $uid, $rid, $gid); // modification // db_query("INSERT INTO {users_roles} (uid, rid) VALUES (%d, %d)", $uid, $rid); // replaced } elseif (!$checked && $exists) { db_query("DELETE FROM {og_users_roles} WHERE uid = %d AND rid = %d AND gid = %d", $uid, $rid, $gid); // modification // db_query("DELETE FROM {users_roles} WHERE uid = %d AND rid = %d", $uid, $rid); // replaced } } } // Have to rebuild the menu here, in case new menu items were added menu_rebuild(); drupal_set_message(t('Your changes have been saved')); } /** * This checks to see what roles a current user has against a given set of roles. */ function _og_user_roles($uid, $roles = array()) { // // Modification // Added this to get gid // if ( is_numeric(arg(2)) ) { $gid = (int)arg(2); } $roles_output = array(); if (is_array($roles)) { foreach ($roles as $rid => $role) { $result = db_result(db_query("SELECT * FROM {og_users_roles} WHERE uid = %d AND rid = %d AND gid = %d", $uid, $rid, $gid)); // modification // $result = db_result(db_query("SELECT * FROM {users_roles} WHERE uid = %d AND rid = %d", $uid, $rid)); // replaced if ($result) { $roles_output[$rid] = $rid; } } } return $roles_output; } /** * Theme function to render the table for the og_user_roles form. */ function theme_og_user_roles_page_form($form) { $output .= "\n" . '

' . "\n"; $output .= '
' . t('Here you can assign group roles to members. This will give that member permission of that role. It will apply to all posts of this group type.') . "
\n"; // $header[] = array('data' => t('Users')); $header[] = array('data' => t('Roles'), 'colspan' => 2); $rows = array(); $i = 0; foreach ($form['user_roles']['users'] as $user_form) { $uid = $user_form['#value']; if ($uid) { // $rows[$i][] = theme('username', user_load(array('uid'=> $uid))); $rows[$i][] = drupal_render($form['user_roles']['roles'][$uid]); $i++; } } $output .= theme_table($header, $rows, $attributes = array('id' => 'og-roles-table'), $caption = NULL); $output .= drupal_render($form['submit']); $output .= "
\n"; $output .= drupal_render($form); return $output; } /** * Determine if a group is allowed to configure member roles. * * @param $nid * A node ID * @return boolean * TRUE if this group type allows roles to be assigned, otherwise FALSE */ function og_user_roles_is_allowed($nid) { $node = node_load(array('nid'=>$nid)); if (in_array($node->type, variable_get('og_node_types', array('og'))) && variable_get("og_user_roles_roles_$node->type", NULL)) { return TRUE; } else { return FALSE; } } // // Modification // Added the following two functions to add and remove roles. // /** * Add role to og_users_roles table. */ function og_user_roles_role_join($uid, $rid, $gid) { db_query("INSERT INTO {og_users_roles} (rid, uid, gid) VALUES ('%d','%d','%d')", $rid, $uid, $gid); } /** * Remove all roles for a user in a group table. */ function og_user_roles_role_leave($uid, $gid) { db_query("DELETE FROM {og_users_roles} WHERE uid = %d AND gid = %d", $uid, $gid); } // // Modification // Added the following functions from this snippet: http://drupal.org/node/41936 // Creates multiple checkbox columns // function expand_checkbox_columns($element) { $value = is_array($element['#value']) ? $element['#value'] : array(); $element['#type'] = 'checkboxes'; $element['#tree'] = TRUE; if (count($element['#options']) > 0) { if (!isset($element['#default_value']) || $element['#default_value'] == 0) { $element['#default_value'] = array(); } foreach ($element['#options'] as $key => $choice) { $class = ($column % $element['#columns']) && $column ? 'checkbox-columns' : 'checkbox-columns-clear'; if (!isset($element[$key])) { $element[$key] = array('#type' => 'checkbox', '#processed' => TRUE, '#title' => $choice, '#default_value' => in_array($key, $value), '#attributes' => $element['#attributes'], '#prefix' => '
', '#suffix' => '
', '#return_value' => $choice); } $column++; } } return $element; } // // Modification // Added the following functions from this snippet: http://drupal.org/node/41936 // To let Drupal know about the new "expand_checkbox_columns". // function og_user_roles_elements() { $type['checkbox_columns'] = array('#input' => TRUE, '#process' => array('expand_checkbox_columns' => array()), '#tree' => TRUE); return $type; } /** * @ingroup views */ /** * Implementation of hook_views_tables(): * Present fields and filters for user data. * Requires that usernode be installed. */ function og_user_roles_views_tables() { $tables['og_users_roles'] = array( 'name' => 'og_users_roles', 'provider' => 'internal', // won't show up in external list. 'join' => array( 'left' => array( 'table' => 'node', 'field' => 'uid' ), 'right' => array( 'field' => 'uid' ), ), 'filters' => array( 'rid' => array( 'name' => t('OG User Roles: Role (group)'), 'operator' => 'views_handler_operator_andor', 'list' => 'views_handler_filter_role', 'value-type' => 'array', 'help' => t('Include the node only if the node author is a member of the selected OG group role - uses og_users_roles.'), ), 'gid' => array( 'name' => t('OG User Roles: Group (using og_users_roles)'), 'list' => 'views_handler_filter_group', 'list-type' => 'list', 'operator' => 'views_handler_operator_or', 'value-type' => 'array', 'help' => t('Include or exclude nodes whose node author has roles in the selected groups - uses og_users_roles (less accurate).'), ), ), ); $tables['og_users_uid'] = array( 'name' => 'og_uid', 'provider' => 'internal', // won't show up in external list. 'join' => array( 'left' => array( 'table' => 'node', 'field' => 'uid' ), 'right' => array( 'field' => 'uid' ), ), 'filters' => array( 'nid' => array( 'name' => t('OG User Roles: Group (using og_uid)'), 'list' => 'views_handler_filter_group', 'list-type' => 'list', 'operator' => 'views_handler_operator_or', 'value-type' => 'array', 'help' => t('Include or exclude nodes whose node author is a member of the selected groups - using og_uid table (more accurate).'), ), ), ); $tables['og_non_group_roles'] = array( 'name' => 'users_roles', 'provider' => 'internal', // won't show up in external list. 'join' => array( 'left' => array( 'table' => 'node', 'field' => 'uid' ), 'right' => array( 'field' => 'uid' ), ), 'filters' => array( 'rid' => array( 'name' => t('OG User Roles: Role (non-group)'), 'operator' => 'views_handler_operator_andor', 'list' => 'views_handler_filter_role', 'value-type' => 'array', 'help' => t('Include the node only if the node author is a member of the selected role - uses users_roles (non-group roles).'), ), ), ); return $tables; } /* * Create a list of group names and IDs. */ function views_handler_filter_group() { $list = array(); $list = variable_get('og_node_types', array('og')); $groupTypes = implode(",", $list); $vids = array(); $result = db_query("SELECT n.nid, n.title FROM {node} n WHERE n.type IN ('". $groupTypes ."') ORDER BY n.title"); while ($obj = db_fetch_object($result)) { $vids[$obj->nid] = $obj->title; } return $vids; } /* * Implementation of hook_init. * * Got the idea of re-directing if this is a add group node request * from here: http://drupal.org/project/globalredirect * */ function og_user_roles_init () { global $user; // Looking for this format: http://www.scbbs.com/node/add/link?gids[]=29 // We only need to process this if the user is logged in if ($user->uid > 0) { // Bootstrap if arg() doesn't exist if (!function_exists('arg') && $user->uid > 0){ drupal_bootstrap(DRUPAL_BOOTSTRAP_PATH); // added as per this issue: http://drupal.org/node/149469 } // If this is a group node/add, re-direct to ognodeadd if (arg(0) == 'node' && arg(1) == 'add' && isset($_REQUEST['gids'])) { $gids = $_GET['gids']; $gid = intval(current($_REQUEST['gids'])); $type = arg(2); $path = 'node/ognodeadd'; if ($type == 'og_user_roles_subgroup') $type = variable_get("og_user_roles_create_subgroup_value", ''); // change OG Subgroups type to 'group' $query = 'type=' . $type . '&gids[]=' . $gid; drupal_goto($path, $query); } } } /* * Implementation of hook_user. * Put new users in default role if applicable. * * Got this code from here: http://drupal.org/node/28379#comment-132430 * */ function og_user_roles_user ($op, &$edit, &$user, $category=null) { // If the user opted to create a default role if (variable_get("og_user_roles_assign_default", 0) == 1) { $rid = variable_get("og_user_roles_default_value", 0); // special case for new users if ($op == "insert") { /* * Modification as per: http://drupal.org/node/149483 */ // Check to see if this user doesn't already have this role; // If not, then assign it. $sql = "SELECT COUNT(*) FROM {users_roles} WHERE uid = %d AND rid = %d"; $result = db_query($sql, $user->uid, $rid); $output = (db_result($result)); if ($output == 0) db_query('INSERT INTO {users_roles} (uid, rid) VALUES (%d, %d)', $user->uid, $rid); } } // end if // Add the group roles to $user->roles if this is a group // This should only be effective until the next global $user call if ($op == "load") { $roles = og_user_roles_all_roles($user); // This returns normal $user->roles and includes OG roles if any $user->roles = $roles; } // end $op load } /** * implementation of hook_og(); * * @param $op string, 'user insert', 'user update', 'user delete' * @param $nid node ID of the group * @param $uid the user ID * @param $args associative array containing details about the subscription */ function og_user_roles_og($op, $nid, $uid, $args = array()) { switch ($op) { case 'user insert': //---------- // Adding every user to a basic group restricted role, that all users in the group should have. // I don't know a better way, so I'll do it like this. This is based on the creating of a founder role, // just that every user in the group should automagically get this role. // -Bibo if (variable_get("og_user_roles_assign_basicgrouprole", 0) == 1) { $rid = variable_get("og_user_roles_basicgrouprole_value", 0); og_user_roles_role_join($uid, $rid, $nid); // assign user to group role in that group } //--- end of modification global $base_url; $user = user_load(array('uid' => $uid)); $username = $user->name; $node = node_load($nid); // Send notification of new og subscription to administrators of group; if (variable_get("og_user_roles_notify_default", 0) == 1) { $group = $node->title; $sender = variable_get('site_mail', ''); $subject = 'User ' . $username . ' added to group: ' . $group; $message = "User " . $username . " added to group: " . $group . ""; // Get the group admin(s) // $result = db_query("SELECT uid FROM og_uid WHERE is_admin = 1 AND nid = " . $nid); $result = db_query("SELECT uid FROM {og_uid} WHERE is_admin = 1 AND nid = %d", $nid); // FIXED TABLE PREFIX while ($obj = db_fetch_object($result)) { $recipient_uid = $obj->uid; $recipient_user = user_load(array('uid' => $recipient_uid)); $recipient = $recipient_user->mail; mimemail($sender, $recipient, $subject, $message); } // end while } // end if break; } } /** * Implementation of hook_node_info(). */ function og_user_roles_node_info() { // If og_subgroups is installed AND og_user_roles_create_subgroup checkbox is checked; if (module_exists('og_subgroups') && variable_get("og_user_roles_create_subgroup", 0) == 1) { return array( 'og_user_roles_subgroup' => array( 'name' => t('Subgroup'), 'module' => 'og_user_roles', 'description' => t('Create a basic subgroup.'), 'help' => t('Create a basic subgroup.'), 'body_label' => t('Description'), ), ); } // end if } /** * Implementation of hook_load(). * * Doesn't seem to work. */ //function og_user_roles_load($node) { // watchdog test // watchdog("hook_load", "og_user_roles : type = " . $node->type); // return $node; //} /** * Implementation of hook_nodeapi(). * */ function og_user_roles_nodeapi(&$node, $op, $teaser = NULL, $page = NULL) { switch ($op) { case 'access': // // This access check is used for TAC and OG permissions integration; // if (variable_get("og_user_roles_tac_og_value", 0) == 1) { $access = FALSE; $og_access = og_user_roles_og_access_check($teaser, $node); $tac_access = og_user_roles_taxonomy_access_check($teaser, $node); if ($og_access === TRUE && $tac_access == FALSE) $access = FALSE; if ($og_access === FALSE) $access = FALSE; if ($og_access === TRUE && $tac_access == TRUE) $access = TRUE; return $access; } break; case 'submit': // // Put appropriate nodes into all groups upon node submission; // // Get list of nodes to put into all groups; $nodelist = variable_get('og_user_roles_all_groups_nodes', ''); if (!empty($nodelist)) { $nodelistArray = explode(",", $nodelist); foreach ($nodelistArray as $nodelistItem) { if ($node->nid == $nodelistItem) { if ($grps = og_user_roles_get_groups($node)) { $node->og_groups = array_keys($grps); $node->og_groups_names = array_values($grps); $public = db_result(db_query_range("SELECT is_public FROM {og_ancestry} WHERE nid = %d", $node->nid, 0, 1)); $node->og_public = $public ? TRUE : FALSE; } // end $grps if } // end $node->nid if } // end foreach } // end $nodelist if break; case 'insert': // If this is a group node, put the group creator into a group role upon creation; if (variable_get("og_user_roles_assign_founder", 0) == 1) { $rid = variable_get("og_user_roles_founder_value", 0); // If this is a group node if (og_is_group_type($node->type)) { // Get the requisite data $uid = $node->uid; // user ID $gid = $node->nid; // group ID og_user_roles_role_join($uid, $rid, $gid); // assign user to group role in that group } } // Create a subgroup record for this group // 'ognodeadd' is my node add callback, so I know if this node is a group and // here, then we need to process it node as a subgroup if ($node->type == variable_get('og_user_roles_create_subgroup_value', '') && arg(1) == 'ognodeadd') { $gids = $_GET['gids']; $gid = $gids[0]; $subgroup = $node->nid; $sql = 'INSERT INTO {og_ancestry} (nid,group_nid,is_public) VALUES (%d,%d,0)'; db_query($sql, $subgroup, $gid); } break; } // end switch } // end og_user_roles_nodeapi function // returns all groups so long as this is not a group itself function og_user_roles_get_groups($node) { $groups = array(); if (!og_is_group_type($node->type)) { $result = og_user_roles_get_groups_result(); while ($row = db_fetch_object($result)) { $groups[$row->group_nid] = $row->title; } return $groups; } } // just the query for the get_node_groups function. function og_user_roles_get_groups_result() { $sql = "SELECT oga.group_nid, n.title FROM {og_ancestry} oga INNER JOIN {node} n ON oga.group_nid = n.nid"; // we use rewrite_sql() in order to avoid disclosing completely private groups (once we support those properly) // return db_query(db_rewrite_sql($sql, 'oga', 'group_nid'), $nid); return db_query(db_rewrite_sql($sql, 'oga', 'group_nid'), ''); } // // My OG Roles Modifications // // // Modification - Added this function // // This function returns an array of role keys and names, like $user->roles // However, it returns site roles as well as group roles // function og_user_roles_all_roles_array($user) { $roles = og_user_roles_all_roles($user); return $roles; } // This function takes the global $user (or $account) value and returns a list // of group and non-group roles for this user function og_user_roles_all_roles($user) { // This will be the process to get BOTH the group and non-group roles for a user $uid = $user->uid; $gid = 0; $gids = array(); $nodeID = 0; $location = 0; $uri_request_id = $_SERVER['REQUEST_URI']; $arg = explode("/", $uri_request_id); $ogroles = array(); $x1 = 0; // // This will by default add the anonymous user role (no need since we merge user->roles) // // We get the groupID // $group_node = og_get_group_context(); $gid02 = $group_node->nid; $gid = $gid02; if ($gid02 === null) $gid = 0; // // If the above doesn't get the groupID, then we start trying stuff // if ($gid == 0) { // http://doadance.scbbs.com/drupal03/node/79 if (arg(0) == 'node' && is_numeric(arg(1)) && is_null(arg(2))) { $location = 1; $nodeID = (int)arg(1); $gid = getgid($nodeID, $uid); } // http://doadance.scbbs.com/node/79/edit // http://doadance.scbbs.com/node/79/outline // http://doadance.scbbs.com/node/79/track if (arg(0) == 'node' && is_numeric(arg(1)) && (arg(2) == 'edit' || arg(2) == 'outline' || arg(2) == 'track' ) ) { $location = 2; $nodeID = (int)arg(1); $gid = getgid($nodeID, $uid); } // 0 1 2 // http://www.mysite.com/comment/edit/14 // if (arg(0) == 'comment' && is_numeric(arg(2)) && arg(1) == 'edit' ) { $location = 3; $comment = _comment_load(arg(2)); $nodeID = $comment->nid; $gid = getgid($nodeID, $uid); } // 0 1 2 // http://www.mysite.com/comment/reply/128#comment_form // if (arg(0) == 'comment' && arg(1) == 'reply' ) { $location = 4; $subsections = explode("#", arg(2)); $nodeID = (int)$subsections[0]; $gid = getgid($nodeID, $uid); } // og_term access // 0 1 2 3 // http://www.mysite.com/node/add/forum/121 // if (arg(0) == 'node' && is_numeric(arg(3)) && arg(1) == 'add' ) { $location = 5; $nodeID = (int)arg(3); $gid = getgid($nodeID, $uid); } // Here we get the gid directly // // http://doadance.scbbs.com/node/79/view/tree // http://doadance.scbbs.com/node/79/view/members // http://doadance.scbbs.com/node/79/view if (arg(0) == 'node' && is_numeric(arg(1)) && arg(2) == 'view' ) { $location = 2; $gid = (int)arg(1); } // Here we get the gid directly // // http://doadance.scbbs.com/og/users/72 // http://doadance.scbbs.com/og/manage/72 if (arg(0) == 'og' && is_numeric(arg(2)) && is_null(arg(3))) { $location = 6; $gid = (int)arg(2); } // og_user_roles // // http://doadance.scbbs.com/og/users/72/roles // http://doadance.scbbs.com/og/users/72/add if (arg(0) == 'og' && arg(1) == 'users' && is_numeric(arg(2)) && is_null(arg(4))) { $location = 6; $gid = (int)arg(2); } // og unsubscribe // og_user_roles // // This is sort of a catch all for "og" and gid in this order // og// // // http://doadance.scbbs.com/og/unsubscribe/72 // http://doadance.scbbs.com/og/users/72/add if (arg(0) == 'og' && is_numeric(arg(2))) { $location = 6; $gid = (int)arg(2); } // og_forum // // http://doadance.scbbs.com/og_forum/manage/72 if (arg(0) == 'og_forum' && arg(1) == 'manage' && is_numeric(arg(2)) && is_null(arg(3))) { $location = 6; $gid = (int)arg(2); } // http://doadance.scbbs.com/og_forum/manage/edit/72 // http://doadance.scbbs.com/og_forum/manage/add/72 if (arg(0) == 'og_forum' && arg(1) == 'manage' && is_numeric(arg(3))) { $location = 6; $gid = (int)arg(3); } // og_calendar // // http://doadance.scbbs.com/og_calendar/72 if (arg(0) == 'og_calendar' && is_numeric(arg(1)) && is_null(arg(2))) { $location = 7; $gid = (int)arg(1); } // og_forum // 0 1 2 3 // http://www.mysite.com/og_forum/39/72?edit[og_groups][]=72 // http://www.mysite.com/og_forum/37/71?sort=asc&order=Replies&edit[og_groups][0]=71 if ($arg[1] == 'og_forum' && strpos($arg[3], 'og_groups') !== false && (!is_null($arg[3])) ) { $location = 8; $subsections = explode("=", $arg[3]); foreach ($subsections as $subsection) { if (is_numeric($subsection)) { $gid = (int)$subsection; } } } // og create nodes (version 5.1) // 0 1 2 3 // http://sbn.scbbs.com/node/add/forum?gids[]=72 // http://sbn.scbbs.com/node/add/simplenews?gids[]=72 // http://sbn.scbbs.com/node/add/webform?gids[]=72 // http://sbn.scbbs.com/node/add/video?gids[]=72 // http://sbn.scbbs.com/node/add/page?gids[]=72 // http://sbn.scbbs.com/node/add/blog?gids[]=72 // http://sbn.scbbs.com/node/add/event?gids[]=72 // http://sbn.scbbs.com/node/add/poll?gids[]=72 // http://sbn.scbbs.com/node/add/flexinode-3?gids[]=72 if ($arg[1] == 'node' && strpos($arg[3], 'gids') !== false && (!is_null($arg[3])) ) { $location = 10 . "(" . arg(0) . "|" . arg(1) . "|" . arg(2) . ")"; $subsections = explode("=", $arg[3]); $gid = (int)$subsections[1]; } // og create nodes (custom node/20 aliased to node/ognodeadd) // 0 1 2 3 // http://clients.brixrealtyinc.com/node/ognodeadd?type=document&gids[]=12 // if ($arg[1] == 'node') { if (strpos($arg[2], 'ognodeadd') !== false ) { if (strpos($arg[2], 'gids') !== false ) { $location = 13; $subsections = explode("=", $arg[2]); $gid = (int)$subsections[2]; } } } } // end $gid if // // Now, using $uid and $gid we find out what roles this user has in this group; // if (empty($gid)) $gid = 0; // This prevents us from getting error on non-group node/add // $query = 'SELECT role.rid, role.name FROM role INNER JOIN og_users_roles ON role.rid = og_users_roles.rid WHERE og_users_roles.uid = ' . $uid . ' AND og_users_roles.gid = ' . $gid; // $results = db_query($query); $query = 'SELECT {role}.rid, {role}.name FROM {role} INNER JOIN {og_users_roles} ON {role}.rid = {og_users_roles}.rid WHERE {og_users_roles}.uid = %d AND {og_users_roles}.gid = %d'; // FIXED TABLE PREFIX $results = db_query($query, $uid, $gid); // // Create an array of these roles; // while ( $row = db_fetch_array($results) ) { $x1 = $row["rid"]; $ogroles[$x1] = $row["name"]; } // // First, we need to create an array of $user->roles // $c = $user->roles; // // Next, we add the $user->roles array to the $ogroles array, if there is an ogroles array; // if ($x1 > 0) { $d = array(); $d = $c + $ogroles; $d = array_unique($d); } else { $d = $c; } // Write the test data og_user_roles_write_test($user, $location, $gid02, $gid, $uri_request_id, $d, $query); // // $d is either the merged results, or just $user->roles; // return $d; } // end og_user_roles_all_roles() function getgid($nodeID, $uid) { // This will return a $gid based upon the $nodeID and $uid supplied $gid = 0; // $result = db_query("select node_access.gid from node_access INNER JOIN og_uid ON node_access.gid = og_uid.nid WHERE node_access.realm = 'og_subscriber' AND og_uid.uid = $uid AND (node_access.nid = $nodeID OR node_access.gid = $nodeID)"); // modified to check for either the node or group ID in node_access $result = db_query("select {node_access}.gid from {node_access} INNER JOIN {og_uid} ON {node_access}.gid = {og_uid}.nid WHERE {node_access}.realm = 'og_subscriber' AND {og_uid}.uid = %d AND ({node_access}.nid = %d OR {node_access}.gid = %d)", $uid, $nodeID, $nodeID); // FIXED TABLE PREFIX - modified to check for either the node or group ID in node_access while($t = db_fetch_object($result)) { $gid = $t->gid; } // If $gid still equals 0 then try searching og_term table (if it exists) // og forums will typically be listed here if ($gid == 0) { if (user_table_exists('{og_term}')) { // $result = db_query("select og_term.nid from og_term INNER JOIN og_uid ON og_term.nid = og_uid.nid WHERE og_term.tid = $nodeID AND og_uid.uid = $uid"); $result = db_query("select {og_term}.nid from {og_term} INNER JOIN {og_uid} ON {og_term}.nid = {og_uid}.nid WHERE {og_term}.tid = %d AND {og_uid}.uid = %d", $nodeID, $uid); // FIXED TABLE PREFIX while($t = db_fetch_object($result)) { $gid = $t->nid; } } } return $gid; } // end getgid() // // Modification - Added this function // function user_table_exists($table) { return db_num_rows(db_query("SHOW TABLES LIKE '{" . db_escape_table($table) . "}'")); } function og_user_roles_write_test($user, $location, $gid02, $gid, $uri_request_id, $d, $query) { // // See what is found in user_all_roles // $testStatus = ""; $testDate = format_date(time(), 'custom', 'Y-m-d h:i:s a'); $testUser = $user->uid; $testFunction = "og_user_roles_all_roles"; $testSubFunction = $location; $testString = "group context: " . $gid02; $testUserName = $user->name; $testGroup = $gid; $testURI = $uri_request_id; $testAArg0 = arg(0); $testAArg1 = arg(1); $testAArg2 = arg(2); $testAArg3 = arg(3); $testPerm = "Roles Returned: (" . implode(",", $d) . ")
dbQuery = " . $query; if (user_table_exists('{user_test}')) { $testQuery = "insert into user_test (testStatus, testDate, testUser, testUserName, testGroup, testFunction, testSubFunction, testString, testURI, testAArg0, testAArg1, testAArg2, testAArg3, testPerm) values ('" . $testStatus . "','" . $testDate . "','" . $testUser . "','" . $testUserName . "','" . $testGroup . "','" . $testFunction . "','" . $testSubFunction . "','" . $testString . "','" . $testURI . "','" . $testAArg0 . "','" . $testAArg1 . "','" . $testAArg2 . "','" . $testAArg3 . "','" . $testPerm . "')"; db_query($testQuery); } } /** * Called by og_user_roles_nodeapi('access') * To check og access permissions * */ function og_user_roles_og_access_check($op, $node = NULL) { global $user; $uid = $user->uid; if ($op != 'create' && $node->nid && $node->status) { if (isset($user) && is_array($user->og_groups)) { $gids = array_keys($user->og_groups); } else { $gids[] = 0; } if (isset($user) && is_array($user->roles)) { $rids = array_keys($user->roles); } else { $rids[] = 1; } // // if this node has groups or is a group, then use group sql, else use non-group sql // $groups = $node->og_groups; if ($groups || $node->type == 'group') { $sql = " SELECT COUNT(*) FROM {node_access} na LEFT OUTER JOIN {og_uid} ogu on ogu.nid = na.nid LEFT OUTER JOIN {og} ogm on ogm.nid = na.nid WHERE (na.nid = 0 OR na.nid = %d) AND ((na.realm = 'og_public' and na.gid = 0) OR (na.realm = 'og_subscriber' AND na.gid in ('".implode("','",$gids)."')) OR (ogm.nid > 0 and (na.nid in ('".implode("','",$gids)."')) or ogm.directory = 1 ) OR (na.realm = 'term_access' AND na.nid in ('".implode("','",$gids)."')) ) AND (na.grant_$op >= 1 OR (ogu.is_admin = 1 AND ogu.uid = ".$uid.") ) "; } else { $sql = " SELECT COUNT(*) FROM {node_access} na WHERE (na.nid = 0 OR na.nid = %d) AND (na.realm = 'term_access' AND na.gid in ('".implode("','",$rids)."')) AND na.grant_$op >= 1 "; } $result = db_query($sql, $node->nid); $output = (db_result($result)); if ($output == 0) return FALSE; if ($output > 0) return TRUE; } } /** * Called by og_user_roles_nodeapi('access') * To check taxonomy_access access permissions * */ function og_user_roles_taxonomy_access_check($op, $node = NULL) { global $user; $uid = $user->uid; if ($op != 'create' && $node->nid && $node->status) { // Discovered that I needed to continue using user->roles to get non-group roles. // will get group roles using og_users_roles and og_ancestry // if (isset($user) && is_array($user->roles)) { $rids = array_keys($user->roles); } else { $rids[] = 1; } $sql = "SELECT COUNT(*) FROM {node_access} na"; $sql .= " LEFT OUTER JOIN {og_users_roles} ogr ON ogr.rid = na.gid"; $sql .= " LEFT OUTER JOIN {og_ancestry} oga ON oga.nid = na.nid"; $sql .= " LEFT OUTER JOIN {og_uid} ogu on ogu.nid = na.nid"; $sql .= " WHERE (na.nid = 0 OR na.nid = %d) AND ((na.realm = 'term_access' AND na.gid in ('".implode("','",$rids)."')) OR (ogr.uid = " . $uid . " AND na.realm = 'term_access' AND oga.group_nid = ogr.gid) )"; $sql .= " AND (na.grant_$op >= 1 OR (ogu.is_admin = 1 AND ogu.uid = ".$uid.") )"; $result = db_query($sql, $node->nid); $output = (db_result($result)); if ($output == 0) return FALSE; if ($output > 0) return TRUE; } } /** * Create content * * Format: http://www.scbbs.com/node/ognodeadd?type=link&gids[]=29 * */ function og_user_roles_ognodeadd() { global $user; $roles = og_user_roles_all_roles($user); // This returns normal $user->roles and includes OG roles if any $user->roles = $roles; $gids = $_GET['gids']; $typeFound = 'no'; if ($gids) { $group_node = node_load($gids[0]); og_set_group_context($group_node); } $type = $_GET['type']; if ($type) { // // Got this from node.module (node_access) // No matter the type, this should return us the create permission. // $module = node_get_types('module', $type); if ($module == 'node') { $module = 'node_content'; // Avoid function name collisions. } $access = module_invoke($module, 'access', 'create', $type); if ($access === TRUE) { $output = node_add($type); } else { $output = "Access denied."; watchdog("access denied", "node/ognodeadd?type=" . $type . "&gids[]=" . $gids[0], WATCHDOG_WARNING); } } return $output; }