Chris@76: $value) Chris@76: $groups[$key] = (int) $value; Chris@76: } Chris@76: Chris@76: // Some groups are protected (guests, administrators, moderators, newbies). Chris@76: $protected_groups = array(-1, 0, 1, 3, 4); Chris@76: Chris@76: // There maybe some others as well. Chris@76: if (!allowedTo('admin_forum')) Chris@76: { Chris@76: $request = $smcFunc['db_query']('', ' Chris@76: SELECT id_group Chris@76: FROM {db_prefix}membergroups Chris@76: WHERE group_type = {int:is_protected}', Chris@76: array( Chris@76: 'is_protected' => 1, Chris@76: ) Chris@76: ); Chris@76: while ($row = $smcFunc['db_fetch_assoc']($request)) Chris@76: $protected_groups[] = $row['id_group']; Chris@76: $smcFunc['db_free_result']($request); Chris@76: } Chris@76: Chris@76: // Make sure they don't delete protected groups! Chris@76: $groups = array_diff($groups, array_unique($protected_groups)); Chris@76: if (empty($groups)) Chris@76: return false; Chris@76: Chris@76: // Log the deletion. Chris@76: $request = $smcFunc['db_query']('', ' Chris@76: SELECT group_name Chris@76: FROM {db_prefix}membergroups Chris@76: WHERE id_group IN ({array_int:group_list})', Chris@76: array( Chris@76: 'group_list' => $groups, Chris@76: ) Chris@76: ); Chris@76: while ($row = $smcFunc['db_fetch_assoc']($request)) Chris@76: logAction('delete_group', array('group' => $row['group_name']), 'admin'); Chris@76: $smcFunc['db_free_result']($request); Chris@76: Chris@76: // Remove the membergroups themselves. Chris@76: $smcFunc['db_query']('', ' Chris@76: DELETE FROM {db_prefix}membergroups Chris@76: WHERE id_group IN ({array_int:group_list})', Chris@76: array( Chris@76: 'group_list' => $groups, Chris@76: ) Chris@76: ); Chris@76: Chris@76: // Remove the permissions of the membergroups. Chris@76: $smcFunc['db_query']('', ' Chris@76: DELETE FROM {db_prefix}permissions Chris@76: WHERE id_group IN ({array_int:group_list})', Chris@76: array( Chris@76: 'group_list' => $groups, Chris@76: ) Chris@76: ); Chris@76: $smcFunc['db_query']('', ' Chris@76: DELETE FROM {db_prefix}board_permissions Chris@76: WHERE id_group IN ({array_int:group_list})', Chris@76: array( Chris@76: 'group_list' => $groups, Chris@76: ) Chris@76: ); Chris@76: $smcFunc['db_query']('', ' Chris@76: DELETE FROM {db_prefix}group_moderators Chris@76: WHERE id_group IN ({array_int:group_list})', Chris@76: array( Chris@76: 'group_list' => $groups, Chris@76: ) Chris@76: ); Chris@76: Chris@76: // Delete any outstanding requests. Chris@76: $smcFunc['db_query']('', ' Chris@76: DELETE FROM {db_prefix}log_group_requests Chris@76: WHERE id_group IN ({array_int:group_list})', Chris@76: array( Chris@76: 'group_list' => $groups, Chris@76: ) Chris@76: ); Chris@76: Chris@76: // Update the primary groups of members. Chris@76: $smcFunc['db_query']('', ' Chris@76: UPDATE {db_prefix}members Chris@76: SET id_group = {int:regular_group} Chris@76: WHERE id_group IN ({array_int:group_list})', Chris@76: array( Chris@76: 'group_list' => $groups, Chris@76: 'regular_group' => 0, Chris@76: ) Chris@76: ); Chris@76: Chris@76: // Update any inherited groups (Lose inheritance). Chris@76: $smcFunc['db_query']('', ' Chris@76: UPDATE {db_prefix}membergroups Chris@76: SET id_parent = {int:uninherited} Chris@76: WHERE id_parent IN ({array_int:group_list})', Chris@76: array( Chris@76: 'group_list' => $groups, Chris@76: 'uninherited' => -2, Chris@76: ) Chris@76: ); Chris@76: Chris@76: // Update the additional groups of members. Chris@76: $request = $smcFunc['db_query']('', ' Chris@76: SELECT id_member, additional_groups Chris@76: FROM {db_prefix}members Chris@76: WHERE FIND_IN_SET({raw:additional_groups_explode}, additional_groups) != 0', Chris@76: array( Chris@76: 'additional_groups_explode' => implode(', additional_groups) != 0 OR FIND_IN_SET(', $groups), Chris@76: ) Chris@76: ); Chris@76: $updates = array(); Chris@76: while ($row = $smcFunc['db_fetch_assoc']($request)) Chris@76: $updates[$row['additional_groups']][] = $row['id_member']; Chris@76: $smcFunc['db_free_result']($request); Chris@76: Chris@76: foreach ($updates as $additional_groups => $memberArray) Chris@76: updateMemberData($memberArray, array('additional_groups' => implode(',', array_diff(explode(',', $additional_groups), $groups)))); Chris@76: Chris@76: // No boards can provide access to these membergroups anymore. Chris@76: $request = $smcFunc['db_query']('', ' Chris@76: SELECT id_board, member_groups Chris@76: FROM {db_prefix}boards Chris@76: WHERE FIND_IN_SET({raw:member_groups_explode}, member_groups) != 0', Chris@76: array( Chris@76: 'member_groups_explode' => implode(', member_groups) != 0 OR FIND_IN_SET(', $groups), Chris@76: ) Chris@76: ); Chris@76: $updates = array(); Chris@76: while ($row = $smcFunc['db_fetch_assoc']($request)) Chris@76: $updates[$row['member_groups']][] = $row['id_board']; Chris@76: $smcFunc['db_free_result']($request); Chris@76: Chris@76: foreach ($updates as $member_groups => $boardArray) Chris@76: $smcFunc['db_query']('', ' Chris@76: UPDATE {db_prefix}boards Chris@76: SET member_groups = {string:member_groups} Chris@76: WHERE id_board IN ({array_int:board_lists})', Chris@76: array( Chris@76: 'board_lists' => $boardArray, Chris@76: 'member_groups' => implode(',', array_diff(explode(',', $member_groups), $groups)), Chris@76: ) Chris@76: ); Chris@76: Chris@76: // Recalculate the post groups, as they likely changed. Chris@76: updateStats('postgroups'); Chris@76: Chris@76: // Make a note of the fact that the cache may be wrong. Chris@76: $settings_update = array('settings_updated' => time()); Chris@76: // Have we deleted the spider group? Chris@76: if (isset($modSettings['spider_group']) && in_array($modSettings['spider_group'], $groups)) Chris@76: $settings_update['spider_group'] = 0; Chris@76: Chris@76: updateSettings($settings_update); Chris@76: Chris@76: // It was a success. Chris@76: return true; Chris@76: } Chris@76: Chris@76: // Remove one or more members from one or more membergroups. Chris@76: function removeMembersFromGroups($members, $groups = null, $permissionCheckDone = false) Chris@76: { Chris@76: global $smcFunc, $user_info, $modSettings; Chris@76: Chris@76: // You're getting nowhere without this permission, unless of course you are the group's moderator. Chris@76: if (!$permissionCheckDone) Chris@76: isAllowedTo('manage_membergroups'); Chris@76: Chris@76: // Assume something will happen. Chris@76: updateSettings(array('settings_updated' => time())); Chris@76: Chris@76: // Cleaning the input. Chris@76: if (!is_array($members)) Chris@76: $members = array((int) $members); Chris@76: else Chris@76: { Chris@76: $members = array_unique($members); Chris@76: Chris@76: // Cast the members to integer. Chris@76: foreach ($members as $key => $value) Chris@76: $members[$key] = (int) $value; Chris@76: } Chris@76: Chris@76: // Before we get started, let's check we won't leave the admin group empty! Chris@76: if ($groups === null || $groups == 1 || (is_array($groups) && in_array(1, $groups))) Chris@76: { Chris@76: $admins = array(); Chris@76: listMembergroupMembers_Href($admins, 1); Chris@76: Chris@76: // Remove any admins if there are too many. Chris@76: $non_changing_admins = array_diff(array_keys($admins), $members); Chris@76: Chris@76: if (empty($non_changing_admins)) Chris@76: $members = array_diff($members, array_keys($admins)); Chris@76: } Chris@76: Chris@76: // Just in case. Chris@76: if (empty($members)) Chris@76: return false; Chris@76: elseif ($groups === null) Chris@76: { Chris@76: // Wanna remove all groups from these members? That's easy. Chris@76: $smcFunc['db_query']('', ' Chris@76: UPDATE {db_prefix}members Chris@76: SET Chris@76: id_group = {int:regular_member}, Chris@76: additional_groups = {string:blank_string} Chris@76: WHERE id_member IN ({array_int:member_list})' . (allowedTo('admin_forum') ? '' : ' Chris@76: AND id_group != {int:admin_group} Chris@76: AND FIND_IN_SET({int:admin_group}, additional_groups) = 0'), Chris@76: array( Chris@76: 'member_list' => $members, Chris@76: 'regular_member' => 0, Chris@76: 'admin_group' => 1, Chris@76: 'blank_string' => '', Chris@76: ) Chris@76: ); Chris@76: Chris@76: updateStats('postgroups', $members); Chris@76: Chris@76: // Log what just happened. Chris@76: foreach ($members as $member) Chris@76: logAction('removed_all_groups', array('member' => $member), 'admin'); Chris@76: Chris@76: return true; Chris@76: } Chris@76: elseif (!is_array($groups)) Chris@76: $groups = array((int) $groups); Chris@76: else Chris@76: { Chris@76: $groups = array_unique($groups); Chris@76: Chris@76: // Make sure all groups are integer. Chris@76: foreach ($groups as $key => $value) Chris@76: $groups[$key] = (int) $value; Chris@76: } Chris@76: Chris@76: // Fetch a list of groups members cannot be assigned to explicitely, and the group names of the ones we want. Chris@76: $implicitGroups = array(-1, 0, 3); Chris@76: $request = $smcFunc['db_query']('', ' Chris@76: SELECT id_group, group_name, min_posts Chris@76: FROM {db_prefix}membergroups Chris@76: WHERE id_group IN ({array_int:group_list})', Chris@76: array( Chris@76: 'group_list' => $groups, Chris@76: ) Chris@76: ); Chris@76: $group_names = array(); Chris@76: while ($row = $smcFunc['db_fetch_assoc']($request)) Chris@76: { Chris@76: if ($row['min_posts'] != -1) Chris@76: $implicitGroups[] = $row['id_group']; Chris@76: else Chris@76: $group_names[$row['id_group']] = $row['group_name']; Chris@76: } Chris@76: $smcFunc['db_free_result']($request); Chris@76: Chris@76: // Now get rid of those groups. Chris@76: $groups = array_diff($groups, $implicitGroups); Chris@76: Chris@76: // Don't forget the protected groups. Chris@76: if (!allowedTo('admin_forum')) Chris@76: { Chris@76: $request = $smcFunc['db_query']('', ' Chris@76: SELECT id_group Chris@76: FROM {db_prefix}membergroups Chris@76: WHERE group_type = {int:is_protected}', Chris@76: array( Chris@76: 'is_protected' => 1, Chris@76: ) Chris@76: ); Chris@76: $protected_groups = array(1); Chris@76: while ($row = $smcFunc['db_fetch_assoc']($request)) Chris@76: $protected_groups[] = $row['id_group']; Chris@76: $smcFunc['db_free_result']($request); Chris@76: Chris@76: // If you're not an admin yourself, you can't touch protected groups! Chris@76: $groups = array_diff($groups, array_unique($protected_groups)); Chris@76: } Chris@76: Chris@76: // Only continue if there are still groups and members left. Chris@76: if (empty($groups) || empty($members)) Chris@76: return false; Chris@76: Chris@76: // First, reset those who have this as their primary group - this is the easy one. Chris@76: $log_inserts = array(); Chris@76: $request = $smcFunc['db_query']('', ' Chris@76: SELECT id_member, id_group Chris@76: FROM {db_prefix}members AS members Chris@76: WHERE id_group IN ({array_int:group_list}) Chris@76: AND id_member IN ({array_int:member_list})', Chris@76: array( Chris@76: 'group_list' => $groups, Chris@76: 'member_list' => $members, Chris@76: ) Chris@76: ); Chris@76: while ($row = $smcFunc['db_fetch_assoc']($request)) Chris@76: $log_inserts[] = array( Chris@76: time(), 3, $user_info['id'], $user_info['ip'], 'removed_from_group', Chris@76: 0, 0, 0, serialize(array('group' => $group_names[$row['id_group']], 'member' => $row['id_member'])), Chris@76: ); Chris@76: $smcFunc['db_free_result']($request); Chris@76: Chris@76: $smcFunc['db_query']('', ' Chris@76: UPDATE {db_prefix}members Chris@76: SET id_group = {int:regular_member} Chris@76: WHERE id_group IN ({array_int:group_list}) Chris@76: AND id_member IN ({array_int:member_list})', Chris@76: array( Chris@76: 'group_list' => $groups, Chris@76: 'member_list' => $members, Chris@76: 'regular_member' => 0, Chris@76: ) Chris@76: ); Chris@76: Chris@76: // Those who have it as part of their additional group must be updated the long way... sadly. Chris@76: $request = $smcFunc['db_query']('', ' Chris@76: SELECT id_member, additional_groups Chris@76: FROM {db_prefix}members Chris@76: WHERE (FIND_IN_SET({raw:additional_groups_implode}, additional_groups) != 0) Chris@76: AND id_member IN ({array_int:member_list}) Chris@76: LIMIT ' . count($members), Chris@76: array( Chris@76: 'member_list' => $members, Chris@76: 'additional_groups_implode' => implode(', additional_groups) != 0 OR FIND_IN_SET(', $groups), Chris@76: ) Chris@76: ); Chris@76: $updates = array(); Chris@76: while ($row = $smcFunc['db_fetch_assoc']($request)) Chris@76: { Chris@76: // What log entries must we make for this one, eh? Chris@76: foreach (explode(',', $row['additional_groups']) as $group) Chris@76: if (in_array($group, $groups)) Chris@76: $log_inserts[] = array( Chris@76: time(), 3, $user_info['id'], $user_info['ip'], 'removed_from_group', Chris@76: 0, 0, 0, serialize(array('group' => $group_names[$group], 'member' => $row['id_member'])), Chris@76: ); Chris@76: Chris@76: $updates[$row['additional_groups']][] = $row['id_member']; Chris@76: } Chris@76: $smcFunc['db_free_result']($request); Chris@76: Chris@76: foreach ($updates as $additional_groups => $memberArray) Chris@76: $smcFunc['db_query']('', ' Chris@76: UPDATE {db_prefix}members Chris@76: SET additional_groups = {string:additional_groups} Chris@76: WHERE id_member IN ({array_int:member_list})', Chris@76: array( Chris@76: 'member_list' => $memberArray, Chris@76: 'additional_groups' => implode(',', array_diff(explode(',', $additional_groups), $groups)), Chris@76: ) Chris@76: ); Chris@76: Chris@76: // Their post groups may have changed now... Chris@76: updateStats('postgroups', $members); Chris@76: Chris@76: // Do the log. Chris@76: if (!empty($log_inserts) && !empty($modSettings['modlog_enabled'])) Chris@76: $smcFunc['db_insert']('', Chris@76: '{db_prefix}log_actions', Chris@76: array( Chris@76: 'log_time' => 'int', 'id_log' => 'int', 'id_member' => 'int', 'ip' => 'string-16', 'action' => 'string', Chris@76: 'id_board' => 'int', 'id_topic' => 'int', 'id_msg' => 'int', 'extra' => 'string-65534', Chris@76: ), Chris@76: $log_inserts, Chris@76: array('id_action') Chris@76: ); Chris@76: Chris@76: // Mission successful. Chris@76: return true; Chris@76: } Chris@76: Chris@76: // Add one or more members to a membergroup. Chris@76: /* Supported types: Chris@76: - only_primary - Assigns a membergroup as primary membergroup, but only Chris@76: if a member has not yet a primary membergroup assigned, Chris@76: unless the member is already part of the membergroup. Chris@76: - only_additional - Assigns a membergroup to the additional membergroups, Chris@76: unless the member is already part of the membergroup. Chris@76: - force_primary - Assigns a membergroup as primary membergroup no matter Chris@76: what the previous primary membergroup was. Chris@76: - auto - Assigns a membergroup to the primary group if it's still Chris@76: available. If not, assign it to the additional group. */ Chris@76: function addMembersToGroup($members, $group, $type = 'auto', $permissionCheckDone = false) Chris@76: { Chris@76: global $smcFunc, $user_info, $modSettings; Chris@76: Chris@76: // Show your licence, but only if it hasn't been done yet. Chris@76: if (!$permissionCheckDone) Chris@76: isAllowedTo('manage_membergroups'); Chris@76: Chris@76: // Make sure we don't keep old stuff cached. Chris@76: updateSettings(array('settings_updated' => time())); Chris@76: Chris@76: if (!is_array($members)) Chris@76: $members = array((int) $members); Chris@76: else Chris@76: { Chris@76: $members = array_unique($members); Chris@76: Chris@76: // Make sure all members are integer. Chris@76: foreach ($members as $key => $value) Chris@76: $members[$key] = (int) $value; Chris@76: } Chris@76: $group = (int) $group; Chris@76: Chris@76: // Some groups just don't like explicitly having members. Chris@76: $implicitGroups = array(-1, 0, 3); Chris@76: $request = $smcFunc['db_query']('', ' Chris@76: SELECT id_group, group_name, min_posts Chris@76: FROM {db_prefix}membergroups Chris@76: WHERE id_group = {int:current_group}', Chris@76: array( Chris@76: 'current_group' => $group, Chris@76: ) Chris@76: ); Chris@76: $group_names = array(); Chris@76: while ($row = $smcFunc['db_fetch_assoc']($request)) Chris@76: { Chris@76: if ($row['min_posts'] != -1) Chris@76: $implicitGroups[] = $row['id_group']; Chris@76: else Chris@76: $group_names[$row['id_group']] = $row['group_name']; Chris@76: } Chris@76: $smcFunc['db_free_result']($request); Chris@76: Chris@76: // Sorry, you can't join an implicit group. Chris@76: if (in_array($group, $implicitGroups) || empty($members)) Chris@76: return false; Chris@76: Chris@76: // Only admins can add admins... Chris@76: if (!allowedTo('admin_forum') && $group == 1) Chris@76: return false; Chris@76: // ... and assign protected groups! Chris@76: elseif (!allowedTo('admin_forum')) Chris@76: { Chris@76: $request = $smcFunc['db_query']('', ' Chris@76: SELECT group_type Chris@76: FROM {db_prefix}membergroups Chris@76: WHERE id_group = {int:current_group} Chris@76: LIMIT {int:limit}', Chris@76: array( Chris@76: 'current_group' => $group, Chris@76: 'limit' => 1, Chris@76: ) Chris@76: ); Chris@76: list ($is_protected) = $smcFunc['db_fetch_row']($request); Chris@76: $smcFunc['db_free_result']($request); Chris@76: Chris@76: // Is it protected? Chris@76: if ($is_protected == 1) Chris@76: return false; Chris@76: } Chris@76: Chris@76: // Do the actual updates. Chris@76: if ($type == 'only_additional') Chris@76: $smcFunc['db_query']('', ' Chris@76: UPDATE {db_prefix}members Chris@76: SET additional_groups = CASE WHEN additional_groups = {string:blank_string} THEN {string:id_group_string} ELSE CONCAT(additional_groups, {string:id_group_string_extend}) END Chris@76: WHERE id_member IN ({array_int:member_list}) Chris@76: AND id_group != {int:id_group} Chris@76: AND FIND_IN_SET({int:id_group}, additional_groups) = 0', Chris@76: array( Chris@76: 'member_list' => $members, Chris@76: 'id_group' => $group, Chris@76: 'id_group_string' => (string) $group, Chris@76: 'id_group_string_extend' => ',' . $group, Chris@76: 'blank_string' => '', Chris@76: ) Chris@76: ); Chris@76: elseif ($type == 'only_primary' || $type == 'force_primary') Chris@76: $smcFunc['db_query']('', ' Chris@76: UPDATE {db_prefix}members Chris@76: SET id_group = {int:id_group} Chris@76: WHERE id_member IN ({array_int:member_list})' . ($type == 'force_primary' ? '' : ' Chris@76: AND id_group = {int:regular_group} Chris@76: AND FIND_IN_SET({int:id_group}, additional_groups) = 0'), Chris@76: array( Chris@76: 'member_list' => $members, Chris@76: 'id_group' => $group, Chris@76: 'regular_group' => 0, Chris@76: ) Chris@76: ); Chris@76: elseif ($type == 'auto') Chris@76: $smcFunc['db_query']('', ' Chris@76: UPDATE {db_prefix}members Chris@76: SET Chris@76: id_group = CASE WHEN id_group = {int:regular_group} THEN {int:id_group} ELSE id_group END, Chris@76: additional_groups = CASE WHEN id_group = {int:id_group} THEN additional_groups Chris@76: WHEN additional_groups = {string:blank_string} THEN {string:id_group_string} Chris@76: ELSE CONCAT(additional_groups, {string:id_group_string_extend}) END Chris@76: WHERE id_member IN ({array_int:member_list}) Chris@76: AND id_group != {int:id_group} Chris@76: AND FIND_IN_SET({int:id_group}, additional_groups) = 0', Chris@76: array( Chris@76: 'member_list' => $members, Chris@76: 'regular_group' => 0, Chris@76: 'id_group' => $group, Chris@76: 'blank_string' => '', Chris@76: 'id_group_string' => (string) $group, Chris@76: 'id_group_string_extend' => ',' . $group, Chris@76: ) Chris@76: ); Chris@76: // Ack!!? What happened? Chris@76: else Chris@76: trigger_error('addMembersToGroup(): Unknown type \'' . $type . '\'', E_USER_WARNING); Chris@76: Chris@76: // Update their postgroup statistics. Chris@76: updateStats('postgroups', $members); Chris@76: Chris@76: // Log the data. Chris@76: $log_inserts = array(); Chris@76: foreach ($members as $member) Chris@76: $log_inserts[] = array( Chris@76: time(), 3, $user_info['id'], $user_info['ip'], 'added_to_group', Chris@76: 0, 0, 0, serialize(array('group' => $group_names[$group], 'member' => $member)), Chris@76: ); Chris@76: Chris@76: if (!empty($log_inserts) && !empty($modSettings['modlog_enabled'])) Chris@76: $smcFunc['db_insert']('', Chris@76: '{db_prefix}log_actions', Chris@76: array( Chris@76: 'log_time' => 'int', 'id_log' => 'int', 'id_member' => 'int', 'ip' => 'string-16', 'action' => 'string', Chris@76: 'id_board' => 'int', 'id_topic' => 'int', 'id_msg' => 'int', 'extra' => 'string-65534', Chris@76: ), Chris@76: $log_inserts, Chris@76: array('id_action') Chris@76: ); Chris@76: Chris@76: return true; Chris@76: } Chris@76: Chris@76: function listMembergroupMembers_Href(&$members, $membergroup, $limit = null) Chris@76: { Chris@76: global $scripturl, $txt, $smcFunc; Chris@76: Chris@76: $request = $smcFunc['db_query']('', ' Chris@76: SELECT id_member, real_name Chris@76: FROM {db_prefix}members Chris@76: WHERE id_group = {int:id_group} OR FIND_IN_SET({int:id_group}, additional_groups) != 0' . ($limit === null ? '' : ' Chris@76: LIMIT ' . ($limit + 1)), Chris@76: array( Chris@76: 'id_group' => $membergroup, Chris@76: ) Chris@76: ); Chris@76: $members = array(); Chris@76: while ($row = $smcFunc['db_fetch_assoc']($request)) Chris@76: $members[$row['id_member']] = '' . $row['real_name'] . ''; Chris@76: $smcFunc['db_free_result']($request); Chris@76: Chris@76: // If there are more than $limit members, add a 'more' link. Chris@76: if ($limit !== null && count($members) > $limit) Chris@76: { Chris@76: array_pop($members); Chris@76: return true; Chris@76: } Chris@76: else Chris@76: return false; Chris@76: } Chris@76: Chris@76: // Retrieve a list of (visible) membergroups used by the cache. Chris@76: function cache_getMembergroupList() Chris@76: { Chris@76: global $scripturl, $smcFunc; Chris@76: Chris@76: $request = $smcFunc['db_query']('', ' Chris@76: SELECT id_group, group_name, online_color Chris@76: FROM {db_prefix}membergroups Chris@76: WHERE min_posts = {int:min_posts} Chris@76: AND hidden = {int:not_hidden} Chris@76: AND id_group != {int:mod_group} Chris@76: AND online_color != {string:blank_string} Chris@76: ORDER BY group_name', Chris@76: array( Chris@76: 'min_posts' => -1, Chris@76: 'not_hidden' => 0, Chris@76: 'mod_group' => 3, Chris@76: 'blank_string' => '', Chris@76: ) Chris@76: ); Chris@76: $groupCache = array(); Chris@76: while ($row = $smcFunc['db_fetch_assoc']($request)) Chris@76: $groupCache[] = '' . $row['group_name'] . ''; Chris@76: $smcFunc['db_free_result']($request); Chris@76: Chris@76: return array( Chris@76: 'data' => $groupCache, Chris@76: 'expires' => time() + 3600, Chris@76: 'refresh_eval' => 'return $GLOBALS[\'modSettings\'][\'settings_updated\'] > ' . time() . ';', Chris@76: ); Chris@76: } Chris@76: Chris@76: function list_getMembergroups($start, $items_per_page, $sort, $membergroup_type) Chris@76: { Chris@76: global $txt, $scripturl, $context, $settings, $smcFunc; Chris@76: Chris@76: $groups = array(); Chris@76: Chris@76: // Get the basic group data. Chris@76: $request = $smcFunc['db_query']('substring_membergroups', ' Chris@76: SELECT id_group, group_name, min_posts, online_color, stars, 0 AS num_members Chris@76: FROM {db_prefix}membergroups Chris@76: WHERE min_posts ' . ($membergroup_type === 'post_count' ? '!=' : '=') . ' -1' . (allowedTo('admin_forum') ? '' : ' Chris@76: AND group_type != {int:is_protected}') . ' Chris@76: ORDER BY {raw:sort}', Chris@76: array( Chris@76: 'is_protected' => 1, Chris@76: 'sort' => $sort, Chris@76: ) Chris@76: ); Chris@76: while ($row = $smcFunc['db_fetch_assoc']($request)) Chris@76: $groups[$row['id_group']] = array( Chris@76: 'id_group' => $row['id_group'], Chris@76: 'group_name' => $row['group_name'], Chris@76: 'min_posts' => $row['min_posts'], Chris@76: 'online_color' => $row['online_color'], Chris@76: 'stars' => $row['stars'], Chris@76: 'num_members' => $row['num_members'], Chris@76: ); Chris@76: $smcFunc['db_free_result']($request); Chris@76: Chris@76: // If we found any membergroups, get the amount of members in them. Chris@76: if (!empty($groups)) Chris@76: { Chris@76: if ($membergroup_type === 'post_count') Chris@76: { Chris@76: $query = $smcFunc['db_query']('', ' Chris@76: SELECT id_post_group AS id_group, COUNT(*) AS num_members Chris@76: FROM {db_prefix}members Chris@76: WHERE id_post_group IN ({array_int:group_list}) Chris@76: GROUP BY id_post_group', Chris@76: array( Chris@76: 'group_list' => array_keys($groups), Chris@76: ) Chris@76: ); Chris@76: while ($row = $smcFunc['db_fetch_assoc']($query)) Chris@76: $groups[$row['id_group']]['num_members'] += $row['num_members']; Chris@76: $smcFunc['db_free_result']($query); Chris@76: } Chris@76: Chris@76: else Chris@76: { Chris@76: $query = $smcFunc['db_query']('', ' Chris@76: SELECT id_group, COUNT(*) AS num_members Chris@76: FROM {db_prefix}members Chris@76: WHERE id_group IN ({array_int:group_list}) Chris@76: GROUP BY id_group', Chris@76: array( Chris@76: 'group_list' => array_keys($groups), Chris@76: ) Chris@76: ); Chris@76: while ($row = $smcFunc['db_fetch_assoc']($query)) Chris@76: $groups[$row['id_group']]['num_members'] += $row['num_members']; Chris@76: $smcFunc['db_free_result']($query); Chris@76: Chris@76: $query = $smcFunc['db_query']('', ' Chris@76: SELECT mg.id_group, COUNT(*) AS num_members Chris@76: FROM {db_prefix}membergroups AS mg Chris@76: INNER JOIN {db_prefix}members AS mem ON (mem.additional_groups != {string:blank_string} Chris@76: AND mem.id_group != mg.id_group Chris@76: AND FIND_IN_SET(mg.id_group, mem.additional_groups) != 0) Chris@76: WHERE mg.id_group IN ({array_int:group_list}) Chris@76: GROUP BY mg.id_group', Chris@76: array( Chris@76: 'group_list' => array_keys($groups), Chris@76: 'blank_string' => '', Chris@76: ) Chris@76: ); Chris@76: while ($row = $smcFunc['db_fetch_assoc']($query)) Chris@76: $groups[$row['id_group']]['num_members'] += $row['num_members']; Chris@76: $smcFunc['db_free_result']($query); Chris@76: } Chris@76: } Chris@76: Chris@76: // Apply manual sorting if the 'number of members' column is selected. Chris@76: if (substr($sort, 0, 1) == '1' || strpos($sort, ', 1') !== false) Chris@76: { Chris@76: $sort_ascending = strpos($sort, 'DESC') === false; Chris@76: Chris@76: foreach ($groups as $group) Chris@76: $sort_array[] = $group['id_group'] != 3 ? (int) $group['num_members'] : -1; Chris@76: Chris@76: array_multisort($sort_array, $sort_ascending ? SORT_ASC : SORT_DESC, SORT_REGULAR, $groups); Chris@76: } Chris@76: Chris@76: return $groups; Chris@76: } Chris@76: Chris@76: ?>