annotate forum/Sources/Subs-Membergroups.php @ 87:df86d318892b website

Link to SampleType doc
author Chris Cannam
date Mon, 10 Feb 2014 18:11:48 +0000
parents e3e11437ecea
children
rev   line source
Chris@76 1 <?php
Chris@76 2
Chris@76 3 /**
Chris@76 4 * Simple Machines Forum (SMF)
Chris@76 5 *
Chris@76 6 * @package SMF
Chris@76 7 * @author Simple Machines http://www.simplemachines.org
Chris@76 8 * @copyright 2011 Simple Machines
Chris@76 9 * @license http://www.simplemachines.org/about/smf/license.php BSD
Chris@76 10 *
Chris@76 11 * @version 2.0
Chris@76 12 */
Chris@76 13
Chris@76 14 if (!defined('SMF'))
Chris@76 15 die('Hacking attempt...');
Chris@76 16
Chris@76 17 /* This file contains functions regarding manipulation of and information
Chris@76 18 about membergroups.
Chris@76 19
Chris@76 20 bool deleteMembergroups(array groups)
Chris@76 21 - delete one of more membergroups.
Chris@76 22 - requires the manage_membergroups permission.
Chris@76 23 - returns true on success or false on failure.
Chris@76 24 - has protection against deletion of protected membergroups.
Chris@76 25 - deletes the permissions linked to the membergroup.
Chris@76 26 - takes members out of the deleted membergroups.
Chris@76 27
Chris@76 28 bool removeMembersFromGroups(array members, array groups = null)
Chris@76 29 - remove one or more members from one or more membergroups.
Chris@76 30 - requires the manage_membergroups permission.
Chris@76 31 - returns true on success or false on failure.
Chris@76 32 - if groups is null, the specified members are stripped from all their
Chris@76 33 membergroups.
Chris@76 34 - function includes a protection against removing from implicit groups.
Chris@76 35 - non-admins are not able to remove members from the admin group.
Chris@76 36
Chris@76 37 bool addMembersToGroup(array members, group, type = 'auto')
Chris@76 38 - add one or more members to a specified group.
Chris@76 39 - requires the manage_membergroups permission.
Chris@76 40 - returns true on success or false on failure.
Chris@76 41 - the type parameter specifies whether the group is added as primary or
Chris@76 42 as additional group.
Chris@76 43 - function has protection against adding members to implicit groups.
Chris@76 44 - non-admins are not able to add members to the admin group.
Chris@76 45
Chris@76 46 bool listMembergroupMembers_Href(&array members, int membergroup, int limit = null)
Chris@76 47 - get a list of all members that are part of a membergroup.
Chris@76 48 - if limit is set to null, all members are returned.
Chris@76 49 - returns a list of href-links in $members.
Chris@76 50 - returns true if there are more than limit members.
Chris@76 51
Chris@76 52 */
Chris@76 53
Chris@76 54 // Delete one or more membergroups.
Chris@76 55 function deleteMembergroups($groups)
Chris@76 56 {
Chris@76 57 global $sourcedir, $smcFunc, $modSettings;
Chris@76 58
Chris@76 59 // Make sure it's an array.
Chris@76 60 if (!is_array($groups))
Chris@76 61 $groups = array((int) $groups);
Chris@76 62 else
Chris@76 63 {
Chris@76 64 $groups = array_unique($groups);
Chris@76 65
Chris@76 66 // Make sure all groups are integer.
Chris@76 67 foreach ($groups as $key => $value)
Chris@76 68 $groups[$key] = (int) $value;
Chris@76 69 }
Chris@76 70
Chris@76 71 // Some groups are protected (guests, administrators, moderators, newbies).
Chris@76 72 $protected_groups = array(-1, 0, 1, 3, 4);
Chris@76 73
Chris@76 74 // There maybe some others as well.
Chris@76 75 if (!allowedTo('admin_forum'))
Chris@76 76 {
Chris@76 77 $request = $smcFunc['db_query']('', '
Chris@76 78 SELECT id_group
Chris@76 79 FROM {db_prefix}membergroups
Chris@76 80 WHERE group_type = {int:is_protected}',
Chris@76 81 array(
Chris@76 82 'is_protected' => 1,
Chris@76 83 )
Chris@76 84 );
Chris@76 85 while ($row = $smcFunc['db_fetch_assoc']($request))
Chris@76 86 $protected_groups[] = $row['id_group'];
Chris@76 87 $smcFunc['db_free_result']($request);
Chris@76 88 }
Chris@76 89
Chris@76 90 // Make sure they don't delete protected groups!
Chris@76 91 $groups = array_diff($groups, array_unique($protected_groups));
Chris@76 92 if (empty($groups))
Chris@76 93 return false;
Chris@76 94
Chris@76 95 // Log the deletion.
Chris@76 96 $request = $smcFunc['db_query']('', '
Chris@76 97 SELECT group_name
Chris@76 98 FROM {db_prefix}membergroups
Chris@76 99 WHERE id_group IN ({array_int:group_list})',
Chris@76 100 array(
Chris@76 101 'group_list' => $groups,
Chris@76 102 )
Chris@76 103 );
Chris@76 104 while ($row = $smcFunc['db_fetch_assoc']($request))
Chris@76 105 logAction('delete_group', array('group' => $row['group_name']), 'admin');
Chris@76 106 $smcFunc['db_free_result']($request);
Chris@76 107
Chris@76 108 // Remove the membergroups themselves.
Chris@76 109 $smcFunc['db_query']('', '
Chris@76 110 DELETE FROM {db_prefix}membergroups
Chris@76 111 WHERE id_group IN ({array_int:group_list})',
Chris@76 112 array(
Chris@76 113 'group_list' => $groups,
Chris@76 114 )
Chris@76 115 );
Chris@76 116
Chris@76 117 // Remove the permissions of the membergroups.
Chris@76 118 $smcFunc['db_query']('', '
Chris@76 119 DELETE FROM {db_prefix}permissions
Chris@76 120 WHERE id_group IN ({array_int:group_list})',
Chris@76 121 array(
Chris@76 122 'group_list' => $groups,
Chris@76 123 )
Chris@76 124 );
Chris@76 125 $smcFunc['db_query']('', '
Chris@76 126 DELETE FROM {db_prefix}board_permissions
Chris@76 127 WHERE id_group IN ({array_int:group_list})',
Chris@76 128 array(
Chris@76 129 'group_list' => $groups,
Chris@76 130 )
Chris@76 131 );
Chris@76 132 $smcFunc['db_query']('', '
Chris@76 133 DELETE FROM {db_prefix}group_moderators
Chris@76 134 WHERE id_group IN ({array_int:group_list})',
Chris@76 135 array(
Chris@76 136 'group_list' => $groups,
Chris@76 137 )
Chris@76 138 );
Chris@76 139
Chris@76 140 // Delete any outstanding requests.
Chris@76 141 $smcFunc['db_query']('', '
Chris@76 142 DELETE FROM {db_prefix}log_group_requests
Chris@76 143 WHERE id_group IN ({array_int:group_list})',
Chris@76 144 array(
Chris@76 145 'group_list' => $groups,
Chris@76 146 )
Chris@76 147 );
Chris@76 148
Chris@76 149 // Update the primary groups of members.
Chris@76 150 $smcFunc['db_query']('', '
Chris@76 151 UPDATE {db_prefix}members
Chris@76 152 SET id_group = {int:regular_group}
Chris@76 153 WHERE id_group IN ({array_int:group_list})',
Chris@76 154 array(
Chris@76 155 'group_list' => $groups,
Chris@76 156 'regular_group' => 0,
Chris@76 157 )
Chris@76 158 );
Chris@76 159
Chris@76 160 // Update any inherited groups (Lose inheritance).
Chris@76 161 $smcFunc['db_query']('', '
Chris@76 162 UPDATE {db_prefix}membergroups
Chris@76 163 SET id_parent = {int:uninherited}
Chris@76 164 WHERE id_parent IN ({array_int:group_list})',
Chris@76 165 array(
Chris@76 166 'group_list' => $groups,
Chris@76 167 'uninherited' => -2,
Chris@76 168 )
Chris@76 169 );
Chris@76 170
Chris@76 171 // Update the additional groups of members.
Chris@76 172 $request = $smcFunc['db_query']('', '
Chris@76 173 SELECT id_member, additional_groups
Chris@76 174 FROM {db_prefix}members
Chris@76 175 WHERE FIND_IN_SET({raw:additional_groups_explode}, additional_groups) != 0',
Chris@76 176 array(
Chris@76 177 'additional_groups_explode' => implode(', additional_groups) != 0 OR FIND_IN_SET(', $groups),
Chris@76 178 )
Chris@76 179 );
Chris@76 180 $updates = array();
Chris@76 181 while ($row = $smcFunc['db_fetch_assoc']($request))
Chris@76 182 $updates[$row['additional_groups']][] = $row['id_member'];
Chris@76 183 $smcFunc['db_free_result']($request);
Chris@76 184
Chris@76 185 foreach ($updates as $additional_groups => $memberArray)
Chris@76 186 updateMemberData($memberArray, array('additional_groups' => implode(',', array_diff(explode(',', $additional_groups), $groups))));
Chris@76 187
Chris@76 188 // No boards can provide access to these membergroups anymore.
Chris@76 189 $request = $smcFunc['db_query']('', '
Chris@76 190 SELECT id_board, member_groups
Chris@76 191 FROM {db_prefix}boards
Chris@76 192 WHERE FIND_IN_SET({raw:member_groups_explode}, member_groups) != 0',
Chris@76 193 array(
Chris@76 194 'member_groups_explode' => implode(', member_groups) != 0 OR FIND_IN_SET(', $groups),
Chris@76 195 )
Chris@76 196 );
Chris@76 197 $updates = array();
Chris@76 198 while ($row = $smcFunc['db_fetch_assoc']($request))
Chris@76 199 $updates[$row['member_groups']][] = $row['id_board'];
Chris@76 200 $smcFunc['db_free_result']($request);
Chris@76 201
Chris@76 202 foreach ($updates as $member_groups => $boardArray)
Chris@76 203 $smcFunc['db_query']('', '
Chris@76 204 UPDATE {db_prefix}boards
Chris@76 205 SET member_groups = {string:member_groups}
Chris@76 206 WHERE id_board IN ({array_int:board_lists})',
Chris@76 207 array(
Chris@76 208 'board_lists' => $boardArray,
Chris@76 209 'member_groups' => implode(',', array_diff(explode(',', $member_groups), $groups)),
Chris@76 210 )
Chris@76 211 );
Chris@76 212
Chris@76 213 // Recalculate the post groups, as they likely changed.
Chris@76 214 updateStats('postgroups');
Chris@76 215
Chris@76 216 // Make a note of the fact that the cache may be wrong.
Chris@76 217 $settings_update = array('settings_updated' => time());
Chris@76 218 // Have we deleted the spider group?
Chris@76 219 if (isset($modSettings['spider_group']) && in_array($modSettings['spider_group'], $groups))
Chris@76 220 $settings_update['spider_group'] = 0;
Chris@76 221
Chris@76 222 updateSettings($settings_update);
Chris@76 223
Chris@76 224 // It was a success.
Chris@76 225 return true;
Chris@76 226 }
Chris@76 227
Chris@76 228 // Remove one or more members from one or more membergroups.
Chris@76 229 function removeMembersFromGroups($members, $groups = null, $permissionCheckDone = false)
Chris@76 230 {
Chris@76 231 global $smcFunc, $user_info, $modSettings;
Chris@76 232
Chris@76 233 // You're getting nowhere without this permission, unless of course you are the group's moderator.
Chris@76 234 if (!$permissionCheckDone)
Chris@76 235 isAllowedTo('manage_membergroups');
Chris@76 236
Chris@76 237 // Assume something will happen.
Chris@76 238 updateSettings(array('settings_updated' => time()));
Chris@76 239
Chris@76 240 // Cleaning the input.
Chris@76 241 if (!is_array($members))
Chris@76 242 $members = array((int) $members);
Chris@76 243 else
Chris@76 244 {
Chris@76 245 $members = array_unique($members);
Chris@76 246
Chris@76 247 // Cast the members to integer.
Chris@76 248 foreach ($members as $key => $value)
Chris@76 249 $members[$key] = (int) $value;
Chris@76 250 }
Chris@76 251
Chris@76 252 // Before we get started, let's check we won't leave the admin group empty!
Chris@76 253 if ($groups === null || $groups == 1 || (is_array($groups) && in_array(1, $groups)))
Chris@76 254 {
Chris@76 255 $admins = array();
Chris@76 256 listMembergroupMembers_Href($admins, 1);
Chris@76 257
Chris@76 258 // Remove any admins if there are too many.
Chris@76 259 $non_changing_admins = array_diff(array_keys($admins), $members);
Chris@76 260
Chris@76 261 if (empty($non_changing_admins))
Chris@76 262 $members = array_diff($members, array_keys($admins));
Chris@76 263 }
Chris@76 264
Chris@76 265 // Just in case.
Chris@76 266 if (empty($members))
Chris@76 267 return false;
Chris@76 268 elseif ($groups === null)
Chris@76 269 {
Chris@76 270 // Wanna remove all groups from these members? That's easy.
Chris@76 271 $smcFunc['db_query']('', '
Chris@76 272 UPDATE {db_prefix}members
Chris@76 273 SET
Chris@76 274 id_group = {int:regular_member},
Chris@76 275 additional_groups = {string:blank_string}
Chris@76 276 WHERE id_member IN ({array_int:member_list})' . (allowedTo('admin_forum') ? '' : '
Chris@76 277 AND id_group != {int:admin_group}
Chris@76 278 AND FIND_IN_SET({int:admin_group}, additional_groups) = 0'),
Chris@76 279 array(
Chris@76 280 'member_list' => $members,
Chris@76 281 'regular_member' => 0,
Chris@76 282 'admin_group' => 1,
Chris@76 283 'blank_string' => '',
Chris@76 284 )
Chris@76 285 );
Chris@76 286
Chris@76 287 updateStats('postgroups', $members);
Chris@76 288
Chris@76 289 // Log what just happened.
Chris@76 290 foreach ($members as $member)
Chris@76 291 logAction('removed_all_groups', array('member' => $member), 'admin');
Chris@76 292
Chris@76 293 return true;
Chris@76 294 }
Chris@76 295 elseif (!is_array($groups))
Chris@76 296 $groups = array((int) $groups);
Chris@76 297 else
Chris@76 298 {
Chris@76 299 $groups = array_unique($groups);
Chris@76 300
Chris@76 301 // Make sure all groups are integer.
Chris@76 302 foreach ($groups as $key => $value)
Chris@76 303 $groups[$key] = (int) $value;
Chris@76 304 }
Chris@76 305
Chris@76 306 // Fetch a list of groups members cannot be assigned to explicitely, and the group names of the ones we want.
Chris@76 307 $implicitGroups = array(-1, 0, 3);
Chris@76 308 $request = $smcFunc['db_query']('', '
Chris@76 309 SELECT id_group, group_name, min_posts
Chris@76 310 FROM {db_prefix}membergroups
Chris@76 311 WHERE id_group IN ({array_int:group_list})',
Chris@76 312 array(
Chris@76 313 'group_list' => $groups,
Chris@76 314 )
Chris@76 315 );
Chris@76 316 $group_names = array();
Chris@76 317 while ($row = $smcFunc['db_fetch_assoc']($request))
Chris@76 318 {
Chris@76 319 if ($row['min_posts'] != -1)
Chris@76 320 $implicitGroups[] = $row['id_group'];
Chris@76 321 else
Chris@76 322 $group_names[$row['id_group']] = $row['group_name'];
Chris@76 323 }
Chris@76 324 $smcFunc['db_free_result']($request);
Chris@76 325
Chris@76 326 // Now get rid of those groups.
Chris@76 327 $groups = array_diff($groups, $implicitGroups);
Chris@76 328
Chris@76 329 // Don't forget the protected groups.
Chris@76 330 if (!allowedTo('admin_forum'))
Chris@76 331 {
Chris@76 332 $request = $smcFunc['db_query']('', '
Chris@76 333 SELECT id_group
Chris@76 334 FROM {db_prefix}membergroups
Chris@76 335 WHERE group_type = {int:is_protected}',
Chris@76 336 array(
Chris@76 337 'is_protected' => 1,
Chris@76 338 )
Chris@76 339 );
Chris@76 340 $protected_groups = array(1);
Chris@76 341 while ($row = $smcFunc['db_fetch_assoc']($request))
Chris@76 342 $protected_groups[] = $row['id_group'];
Chris@76 343 $smcFunc['db_free_result']($request);
Chris@76 344
Chris@76 345 // If you're not an admin yourself, you can't touch protected groups!
Chris@76 346 $groups = array_diff($groups, array_unique($protected_groups));
Chris@76 347 }
Chris@76 348
Chris@76 349 // Only continue if there are still groups and members left.
Chris@76 350 if (empty($groups) || empty($members))
Chris@76 351 return false;
Chris@76 352
Chris@76 353 // First, reset those who have this as their primary group - this is the easy one.
Chris@76 354 $log_inserts = array();
Chris@76 355 $request = $smcFunc['db_query']('', '
Chris@76 356 SELECT id_member, id_group
Chris@76 357 FROM {db_prefix}members AS members
Chris@76 358 WHERE id_group IN ({array_int:group_list})
Chris@76 359 AND id_member IN ({array_int:member_list})',
Chris@76 360 array(
Chris@76 361 'group_list' => $groups,
Chris@76 362 'member_list' => $members,
Chris@76 363 )
Chris@76 364 );
Chris@76 365 while ($row = $smcFunc['db_fetch_assoc']($request))
Chris@76 366 $log_inserts[] = array(
Chris@76 367 time(), 3, $user_info['id'], $user_info['ip'], 'removed_from_group',
Chris@76 368 0, 0, 0, serialize(array('group' => $group_names[$row['id_group']], 'member' => $row['id_member'])),
Chris@76 369 );
Chris@76 370 $smcFunc['db_free_result']($request);
Chris@76 371
Chris@76 372 $smcFunc['db_query']('', '
Chris@76 373 UPDATE {db_prefix}members
Chris@76 374 SET id_group = {int:regular_member}
Chris@76 375 WHERE id_group IN ({array_int:group_list})
Chris@76 376 AND id_member IN ({array_int:member_list})',
Chris@76 377 array(
Chris@76 378 'group_list' => $groups,
Chris@76 379 'member_list' => $members,
Chris@76 380 'regular_member' => 0,
Chris@76 381 )
Chris@76 382 );
Chris@76 383
Chris@76 384 // Those who have it as part of their additional group must be updated the long way... sadly.
Chris@76 385 $request = $smcFunc['db_query']('', '
Chris@76 386 SELECT id_member, additional_groups
Chris@76 387 FROM {db_prefix}members
Chris@76 388 WHERE (FIND_IN_SET({raw:additional_groups_implode}, additional_groups) != 0)
Chris@76 389 AND id_member IN ({array_int:member_list})
Chris@76 390 LIMIT ' . count($members),
Chris@76 391 array(
Chris@76 392 'member_list' => $members,
Chris@76 393 'additional_groups_implode' => implode(', additional_groups) != 0 OR FIND_IN_SET(', $groups),
Chris@76 394 )
Chris@76 395 );
Chris@76 396 $updates = array();
Chris@76 397 while ($row = $smcFunc['db_fetch_assoc']($request))
Chris@76 398 {
Chris@76 399 // What log entries must we make for this one, eh?
Chris@76 400 foreach (explode(',', $row['additional_groups']) as $group)
Chris@76 401 if (in_array($group, $groups))
Chris@76 402 $log_inserts[] = array(
Chris@76 403 time(), 3, $user_info['id'], $user_info['ip'], 'removed_from_group',
Chris@76 404 0, 0, 0, serialize(array('group' => $group_names[$group], 'member' => $row['id_member'])),
Chris@76 405 );
Chris@76 406
Chris@76 407 $updates[$row['additional_groups']][] = $row['id_member'];
Chris@76 408 }
Chris@76 409 $smcFunc['db_free_result']($request);
Chris@76 410
Chris@76 411 foreach ($updates as $additional_groups => $memberArray)
Chris@76 412 $smcFunc['db_query']('', '
Chris@76 413 UPDATE {db_prefix}members
Chris@76 414 SET additional_groups = {string:additional_groups}
Chris@76 415 WHERE id_member IN ({array_int:member_list})',
Chris@76 416 array(
Chris@76 417 'member_list' => $memberArray,
Chris@76 418 'additional_groups' => implode(',', array_diff(explode(',', $additional_groups), $groups)),
Chris@76 419 )
Chris@76 420 );
Chris@76 421
Chris@76 422 // Their post groups may have changed now...
Chris@76 423 updateStats('postgroups', $members);
Chris@76 424
Chris@76 425 // Do the log.
Chris@76 426 if (!empty($log_inserts) && !empty($modSettings['modlog_enabled']))
Chris@76 427 $smcFunc['db_insert']('',
Chris@76 428 '{db_prefix}log_actions',
Chris@76 429 array(
Chris@76 430 'log_time' => 'int', 'id_log' => 'int', 'id_member' => 'int', 'ip' => 'string-16', 'action' => 'string',
Chris@76 431 'id_board' => 'int', 'id_topic' => 'int', 'id_msg' => 'int', 'extra' => 'string-65534',
Chris@76 432 ),
Chris@76 433 $log_inserts,
Chris@76 434 array('id_action')
Chris@76 435 );
Chris@76 436
Chris@76 437 // Mission successful.
Chris@76 438 return true;
Chris@76 439 }
Chris@76 440
Chris@76 441 // Add one or more members to a membergroup.
Chris@76 442 /* Supported types:
Chris@76 443 - only_primary - Assigns a membergroup as primary membergroup, but only
Chris@76 444 if a member has not yet a primary membergroup assigned,
Chris@76 445 unless the member is already part of the membergroup.
Chris@76 446 - only_additional - Assigns a membergroup to the additional membergroups,
Chris@76 447 unless the member is already part of the membergroup.
Chris@76 448 - force_primary - Assigns a membergroup as primary membergroup no matter
Chris@76 449 what the previous primary membergroup was.
Chris@76 450 - auto - Assigns a membergroup to the primary group if it's still
Chris@76 451 available. If not, assign it to the additional group. */
Chris@76 452 function addMembersToGroup($members, $group, $type = 'auto', $permissionCheckDone = false)
Chris@76 453 {
Chris@76 454 global $smcFunc, $user_info, $modSettings;
Chris@76 455
Chris@76 456 // Show your licence, but only if it hasn't been done yet.
Chris@76 457 if (!$permissionCheckDone)
Chris@76 458 isAllowedTo('manage_membergroups');
Chris@76 459
Chris@76 460 // Make sure we don't keep old stuff cached.
Chris@76 461 updateSettings(array('settings_updated' => time()));
Chris@76 462
Chris@76 463 if (!is_array($members))
Chris@76 464 $members = array((int) $members);
Chris@76 465 else
Chris@76 466 {
Chris@76 467 $members = array_unique($members);
Chris@76 468
Chris@76 469 // Make sure all members are integer.
Chris@76 470 foreach ($members as $key => $value)
Chris@76 471 $members[$key] = (int) $value;
Chris@76 472 }
Chris@76 473 $group = (int) $group;
Chris@76 474
Chris@76 475 // Some groups just don't like explicitly having members.
Chris@76 476 $implicitGroups = array(-1, 0, 3);
Chris@76 477 $request = $smcFunc['db_query']('', '
Chris@76 478 SELECT id_group, group_name, min_posts
Chris@76 479 FROM {db_prefix}membergroups
Chris@76 480 WHERE id_group = {int:current_group}',
Chris@76 481 array(
Chris@76 482 'current_group' => $group,
Chris@76 483 )
Chris@76 484 );
Chris@76 485 $group_names = array();
Chris@76 486 while ($row = $smcFunc['db_fetch_assoc']($request))
Chris@76 487 {
Chris@76 488 if ($row['min_posts'] != -1)
Chris@76 489 $implicitGroups[] = $row['id_group'];
Chris@76 490 else
Chris@76 491 $group_names[$row['id_group']] = $row['group_name'];
Chris@76 492 }
Chris@76 493 $smcFunc['db_free_result']($request);
Chris@76 494
Chris@76 495 // Sorry, you can't join an implicit group.
Chris@76 496 if (in_array($group, $implicitGroups) || empty($members))
Chris@76 497 return false;
Chris@76 498
Chris@76 499 // Only admins can add admins...
Chris@76 500 if (!allowedTo('admin_forum') && $group == 1)
Chris@76 501 return false;
Chris@76 502 // ... and assign protected groups!
Chris@76 503 elseif (!allowedTo('admin_forum'))
Chris@76 504 {
Chris@76 505 $request = $smcFunc['db_query']('', '
Chris@76 506 SELECT group_type
Chris@76 507 FROM {db_prefix}membergroups
Chris@76 508 WHERE id_group = {int:current_group}
Chris@76 509 LIMIT {int:limit}',
Chris@76 510 array(
Chris@76 511 'current_group' => $group,
Chris@76 512 'limit' => 1,
Chris@76 513 )
Chris@76 514 );
Chris@76 515 list ($is_protected) = $smcFunc['db_fetch_row']($request);
Chris@76 516 $smcFunc['db_free_result']($request);
Chris@76 517
Chris@76 518 // Is it protected?
Chris@76 519 if ($is_protected == 1)
Chris@76 520 return false;
Chris@76 521 }
Chris@76 522
Chris@76 523 // Do the actual updates.
Chris@76 524 if ($type == 'only_additional')
Chris@76 525 $smcFunc['db_query']('', '
Chris@76 526 UPDATE {db_prefix}members
Chris@76 527 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 528 WHERE id_member IN ({array_int:member_list})
Chris@76 529 AND id_group != {int:id_group}
Chris@76 530 AND FIND_IN_SET({int:id_group}, additional_groups) = 0',
Chris@76 531 array(
Chris@76 532 'member_list' => $members,
Chris@76 533 'id_group' => $group,
Chris@76 534 'id_group_string' => (string) $group,
Chris@76 535 'id_group_string_extend' => ',' . $group,
Chris@76 536 'blank_string' => '',
Chris@76 537 )
Chris@76 538 );
Chris@76 539 elseif ($type == 'only_primary' || $type == 'force_primary')
Chris@76 540 $smcFunc['db_query']('', '
Chris@76 541 UPDATE {db_prefix}members
Chris@76 542 SET id_group = {int:id_group}
Chris@76 543 WHERE id_member IN ({array_int:member_list})' . ($type == 'force_primary' ? '' : '
Chris@76 544 AND id_group = {int:regular_group}
Chris@76 545 AND FIND_IN_SET({int:id_group}, additional_groups) = 0'),
Chris@76 546 array(
Chris@76 547 'member_list' => $members,
Chris@76 548 'id_group' => $group,
Chris@76 549 'regular_group' => 0,
Chris@76 550 )
Chris@76 551 );
Chris@76 552 elseif ($type == 'auto')
Chris@76 553 $smcFunc['db_query']('', '
Chris@76 554 UPDATE {db_prefix}members
Chris@76 555 SET
Chris@76 556 id_group = CASE WHEN id_group = {int:regular_group} THEN {int:id_group} ELSE id_group END,
Chris@76 557 additional_groups = CASE WHEN id_group = {int:id_group} THEN additional_groups
Chris@76 558 WHEN additional_groups = {string:blank_string} THEN {string:id_group_string}
Chris@76 559 ELSE CONCAT(additional_groups, {string:id_group_string_extend}) END
Chris@76 560 WHERE id_member IN ({array_int:member_list})
Chris@76 561 AND id_group != {int:id_group}
Chris@76 562 AND FIND_IN_SET({int:id_group}, additional_groups) = 0',
Chris@76 563 array(
Chris@76 564 'member_list' => $members,
Chris@76 565 'regular_group' => 0,
Chris@76 566 'id_group' => $group,
Chris@76 567 'blank_string' => '',
Chris@76 568 'id_group_string' => (string) $group,
Chris@76 569 'id_group_string_extend' => ',' . $group,
Chris@76 570 )
Chris@76 571 );
Chris@76 572 // Ack!!? What happened?
Chris@76 573 else
Chris@76 574 trigger_error('addMembersToGroup(): Unknown type \'' . $type . '\'', E_USER_WARNING);
Chris@76 575
Chris@76 576 // Update their postgroup statistics.
Chris@76 577 updateStats('postgroups', $members);
Chris@76 578
Chris@76 579 // Log the data.
Chris@76 580 $log_inserts = array();
Chris@76 581 foreach ($members as $member)
Chris@76 582 $log_inserts[] = array(
Chris@76 583 time(), 3, $user_info['id'], $user_info['ip'], 'added_to_group',
Chris@76 584 0, 0, 0, serialize(array('group' => $group_names[$group], 'member' => $member)),
Chris@76 585 );
Chris@76 586
Chris@76 587 if (!empty($log_inserts) && !empty($modSettings['modlog_enabled']))
Chris@76 588 $smcFunc['db_insert']('',
Chris@76 589 '{db_prefix}log_actions',
Chris@76 590 array(
Chris@76 591 'log_time' => 'int', 'id_log' => 'int', 'id_member' => 'int', 'ip' => 'string-16', 'action' => 'string',
Chris@76 592 'id_board' => 'int', 'id_topic' => 'int', 'id_msg' => 'int', 'extra' => 'string-65534',
Chris@76 593 ),
Chris@76 594 $log_inserts,
Chris@76 595 array('id_action')
Chris@76 596 );
Chris@76 597
Chris@76 598 return true;
Chris@76 599 }
Chris@76 600
Chris@76 601 function listMembergroupMembers_Href(&$members, $membergroup, $limit = null)
Chris@76 602 {
Chris@76 603 global $scripturl, $txt, $smcFunc;
Chris@76 604
Chris@76 605 $request = $smcFunc['db_query']('', '
Chris@76 606 SELECT id_member, real_name
Chris@76 607 FROM {db_prefix}members
Chris@76 608 WHERE id_group = {int:id_group} OR FIND_IN_SET({int:id_group}, additional_groups) != 0' . ($limit === null ? '' : '
Chris@76 609 LIMIT ' . ($limit + 1)),
Chris@76 610 array(
Chris@76 611 'id_group' => $membergroup,
Chris@76 612 )
Chris@76 613 );
Chris@76 614 $members = array();
Chris@76 615 while ($row = $smcFunc['db_fetch_assoc']($request))
Chris@76 616 $members[$row['id_member']] = '<a href="' . $scripturl . '?action=profile;u=' . $row['id_member'] . '">' . $row['real_name'] . '</a>';
Chris@76 617 $smcFunc['db_free_result']($request);
Chris@76 618
Chris@76 619 // If there are more than $limit members, add a 'more' link.
Chris@76 620 if ($limit !== null && count($members) > $limit)
Chris@76 621 {
Chris@76 622 array_pop($members);
Chris@76 623 return true;
Chris@76 624 }
Chris@76 625 else
Chris@76 626 return false;
Chris@76 627 }
Chris@76 628
Chris@76 629 // Retrieve a list of (visible) membergroups used by the cache.
Chris@76 630 function cache_getMembergroupList()
Chris@76 631 {
Chris@76 632 global $scripturl, $smcFunc;
Chris@76 633
Chris@76 634 $request = $smcFunc['db_query']('', '
Chris@76 635 SELECT id_group, group_name, online_color
Chris@76 636 FROM {db_prefix}membergroups
Chris@76 637 WHERE min_posts = {int:min_posts}
Chris@76 638 AND hidden = {int:not_hidden}
Chris@76 639 AND id_group != {int:mod_group}
Chris@76 640 AND online_color != {string:blank_string}
Chris@76 641 ORDER BY group_name',
Chris@76 642 array(
Chris@76 643 'min_posts' => -1,
Chris@76 644 'not_hidden' => 0,
Chris@76 645 'mod_group' => 3,
Chris@76 646 'blank_string' => '',
Chris@76 647 )
Chris@76 648 );
Chris@76 649 $groupCache = array();
Chris@76 650 while ($row = $smcFunc['db_fetch_assoc']($request))
Chris@76 651 $groupCache[] = '<a href="' . $scripturl . '?action=groups;sa=members;group=' . $row['id_group'] . '" ' . ($row['online_color'] ? 'style="color: ' . $row['online_color'] . '"' : '') . '>' . $row['group_name'] . '</a>';
Chris@76 652 $smcFunc['db_free_result']($request);
Chris@76 653
Chris@76 654 return array(
Chris@76 655 'data' => $groupCache,
Chris@76 656 'expires' => time() + 3600,
Chris@76 657 'refresh_eval' => 'return $GLOBALS[\'modSettings\'][\'settings_updated\'] > ' . time() . ';',
Chris@76 658 );
Chris@76 659 }
Chris@76 660
Chris@76 661 function list_getMembergroups($start, $items_per_page, $sort, $membergroup_type)
Chris@76 662 {
Chris@76 663 global $txt, $scripturl, $context, $settings, $smcFunc;
Chris@76 664
Chris@76 665 $groups = array();
Chris@76 666
Chris@76 667 // Get the basic group data.
Chris@76 668 $request = $smcFunc['db_query']('substring_membergroups', '
Chris@76 669 SELECT id_group, group_name, min_posts, online_color, stars, 0 AS num_members
Chris@76 670 FROM {db_prefix}membergroups
Chris@76 671 WHERE min_posts ' . ($membergroup_type === 'post_count' ? '!=' : '=') . ' -1' . (allowedTo('admin_forum') ? '' : '
Chris@76 672 AND group_type != {int:is_protected}') . '
Chris@76 673 ORDER BY {raw:sort}',
Chris@76 674 array(
Chris@76 675 'is_protected' => 1,
Chris@76 676 'sort' => $sort,
Chris@76 677 )
Chris@76 678 );
Chris@76 679 while ($row = $smcFunc['db_fetch_assoc']($request))
Chris@76 680 $groups[$row['id_group']] = array(
Chris@76 681 'id_group' => $row['id_group'],
Chris@76 682 'group_name' => $row['group_name'],
Chris@76 683 'min_posts' => $row['min_posts'],
Chris@76 684 'online_color' => $row['online_color'],
Chris@76 685 'stars' => $row['stars'],
Chris@76 686 'num_members' => $row['num_members'],
Chris@76 687 );
Chris@76 688 $smcFunc['db_free_result']($request);
Chris@76 689
Chris@76 690 // If we found any membergroups, get the amount of members in them.
Chris@76 691 if (!empty($groups))
Chris@76 692 {
Chris@76 693 if ($membergroup_type === 'post_count')
Chris@76 694 {
Chris@76 695 $query = $smcFunc['db_query']('', '
Chris@76 696 SELECT id_post_group AS id_group, COUNT(*) AS num_members
Chris@76 697 FROM {db_prefix}members
Chris@76 698 WHERE id_post_group IN ({array_int:group_list})
Chris@76 699 GROUP BY id_post_group',
Chris@76 700 array(
Chris@76 701 'group_list' => array_keys($groups),
Chris@76 702 )
Chris@76 703 );
Chris@76 704 while ($row = $smcFunc['db_fetch_assoc']($query))
Chris@76 705 $groups[$row['id_group']]['num_members'] += $row['num_members'];
Chris@76 706 $smcFunc['db_free_result']($query);
Chris@76 707 }
Chris@76 708
Chris@76 709 else
Chris@76 710 {
Chris@76 711 $query = $smcFunc['db_query']('', '
Chris@76 712 SELECT id_group, COUNT(*) AS num_members
Chris@76 713 FROM {db_prefix}members
Chris@76 714 WHERE id_group IN ({array_int:group_list})
Chris@76 715 GROUP BY id_group',
Chris@76 716 array(
Chris@76 717 'group_list' => array_keys($groups),
Chris@76 718 )
Chris@76 719 );
Chris@76 720 while ($row = $smcFunc['db_fetch_assoc']($query))
Chris@76 721 $groups[$row['id_group']]['num_members'] += $row['num_members'];
Chris@76 722 $smcFunc['db_free_result']($query);
Chris@76 723
Chris@76 724 $query = $smcFunc['db_query']('', '
Chris@76 725 SELECT mg.id_group, COUNT(*) AS num_members
Chris@76 726 FROM {db_prefix}membergroups AS mg
Chris@76 727 INNER JOIN {db_prefix}members AS mem ON (mem.additional_groups != {string:blank_string}
Chris@76 728 AND mem.id_group != mg.id_group
Chris@76 729 AND FIND_IN_SET(mg.id_group, mem.additional_groups) != 0)
Chris@76 730 WHERE mg.id_group IN ({array_int:group_list})
Chris@76 731 GROUP BY mg.id_group',
Chris@76 732 array(
Chris@76 733 'group_list' => array_keys($groups),
Chris@76 734 'blank_string' => '',
Chris@76 735 )
Chris@76 736 );
Chris@76 737 while ($row = $smcFunc['db_fetch_assoc']($query))
Chris@76 738 $groups[$row['id_group']]['num_members'] += $row['num_members'];
Chris@76 739 $smcFunc['db_free_result']($query);
Chris@76 740 }
Chris@76 741 }
Chris@76 742
Chris@76 743 // Apply manual sorting if the 'number of members' column is selected.
Chris@76 744 if (substr($sort, 0, 1) == '1' || strpos($sort, ', 1') !== false)
Chris@76 745 {
Chris@76 746 $sort_ascending = strpos($sort, 'DESC') === false;
Chris@76 747
Chris@76 748 foreach ($groups as $group)
Chris@76 749 $sort_array[] = $group['id_group'] != 3 ? (int) $group['num_members'] : -1;
Chris@76 750
Chris@76 751 array_multisort($sort_array, $sort_ascending ? SORT_ASC : SORT_DESC, SORT_REGULAR, $groups);
Chris@76 752 }
Chris@76 753
Chris@76 754 return $groups;
Chris@76 755 }
Chris@76 756
Chris@76 757 ?>