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: ?>