[ Index ] |
PHP Cross Reference of phpBB-3.1.12-deutsch |
[Summary view] [Print] [Text view]
1 <?php 2 /** 3 * 4 * This file is part of the phpBB Forum Software package. 5 * 6 * @copyright (c) phpBB Limited <https://www.phpbb.com> 7 * @license GNU General Public License, version 2 (GPL-2.0) 8 * 9 * For full copyright and license information, please see 10 * the docs/CREDITS.txt file. 11 * 12 */ 13 14 /** 15 * @ignore 16 */ 17 if (!defined('IN_PHPBB')) 18 { 19 exit; 20 } 21 22 class acp_groups 23 { 24 var $u_action; 25 26 function main($id, $mode) 27 { 28 global $config, $db, $user, $auth, $template, $cache; 29 global $phpbb_root_path, $phpbb_admin_path, $phpEx, $table_prefix, $file_uploads; 30 global $request, $phpbb_container, $phpbb_dispatcher; 31 32 $user->add_lang('acp/groups'); 33 $this->tpl_name = 'acp_groups'; 34 $this->page_title = 'ACP_GROUPS_MANAGE'; 35 36 $form_key = 'acp_groups'; 37 add_form_key($form_key); 38 39 if ($mode == 'position') 40 { 41 $this->manage_position(); 42 return; 43 } 44 45 if (!function_exists('group_user_attributes')) 46 { 47 include($phpbb_root_path . 'includes/functions_user.' . $phpEx); 48 } 49 50 // Check and set some common vars 51 $action = (isset($_POST['add'])) ? 'add' : ((isset($_POST['addusers'])) ? 'addusers' : request_var('action', '')); 52 $group_id = request_var('g', 0); 53 $mark_ary = request_var('mark', array(0)); 54 $name_ary = request_var('usernames', '', true); 55 $leader = request_var('leader', 0); 56 $default = request_var('default', 0); 57 $start = request_var('start', 0); 58 $update = (isset($_POST['update'])) ? true : false; 59 60 // Clear some vars 61 $group_row = array(); 62 63 // Grab basic data for group, if group_id is set and exists 64 if ($group_id) 65 { 66 $sql = 'SELECT g.*, t.teampage_position AS group_teampage 67 FROM ' . GROUPS_TABLE . ' g 68 LEFT JOIN ' . TEAMPAGE_TABLE . ' t 69 ON (t.group_id = g.group_id) 70 WHERE g.group_id = ' . $group_id; 71 $result = $db->sql_query($sql); 72 $group_row = $db->sql_fetchrow($result); 73 $db->sql_freeresult($result); 74 75 if (!$group_row) 76 { 77 trigger_error($user->lang['NO_GROUP'] . adm_back_link($this->u_action), E_USER_WARNING); 78 } 79 80 // Check if the user is allowed to manage this group if set to founder only. 81 if ($user->data['user_type'] != USER_FOUNDER && $group_row['group_founder_manage']) 82 { 83 trigger_error($user->lang['NOT_ALLOWED_MANAGE_GROUP'] . adm_back_link($this->u_action), E_USER_WARNING); 84 } 85 } 86 87 // Which page? 88 switch ($action) 89 { 90 case 'approve': 91 case 'demote': 92 case 'promote': 93 if (!check_form_key($form_key)) 94 { 95 trigger_error($user->lang['FORM_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING); 96 } 97 98 if (!$group_id) 99 { 100 trigger_error($user->lang['NO_GROUP'] . adm_back_link($this->u_action), E_USER_WARNING); 101 } 102 103 // Approve, demote or promote 104 $group_name = ($group_row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $group_row['group_name']] : $group_row['group_name']; 105 $error = group_user_attributes($action, $group_id, $mark_ary, false, $group_name); 106 107 if (!$error) 108 { 109 switch ($action) 110 { 111 case 'demote': 112 $message = 'GROUP_MODS_DEMOTED'; 113 break; 114 115 case 'promote': 116 $message = 'GROUP_MODS_PROMOTED'; 117 break; 118 119 case 'approve': 120 $message = 'USERS_APPROVED'; 121 break; 122 } 123 124 trigger_error($user->lang[$message] . adm_back_link($this->u_action . '&action=list&g=' . $group_id)); 125 } 126 else 127 { 128 trigger_error($user->lang[$error] . adm_back_link($this->u_action . '&action=list&g=' . $group_id), E_USER_WARNING); 129 } 130 131 break; 132 133 case 'default': 134 if (!$group_id) 135 { 136 trigger_error($user->lang['NO_GROUP'] . adm_back_link($this->u_action), E_USER_WARNING); 137 } 138 else if (empty($mark_ary)) 139 { 140 trigger_error($user->lang['NO_USERS'] . adm_back_link($this->u_action . '&action=list&g=' . $group_id), E_USER_WARNING); 141 } 142 143 if (confirm_box(true)) 144 { 145 $group_name = ($group_row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $group_row['group_name']] : $group_row['group_name']; 146 group_user_attributes('default', $group_id, $mark_ary, false, $group_name, $group_row); 147 trigger_error($user->lang['GROUP_DEFS_UPDATED'] . adm_back_link($this->u_action . '&action=list&g=' . $group_id)); 148 } 149 else 150 { 151 confirm_box(false, $user->lang['CONFIRM_OPERATION'], build_hidden_fields(array( 152 'mark' => $mark_ary, 153 'g' => $group_id, 154 'i' => $id, 155 'mode' => $mode, 156 'action' => $action)) 157 ); 158 } 159 break; 160 161 case 'set_default_on_all': 162 if (confirm_box(true)) 163 { 164 $group_name = ($group_row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $group_row['group_name']] : $group_row['group_name']; 165 166 $start = 0; 167 168 do 169 { 170 $sql = 'SELECT user_id 171 FROM ' . USER_GROUP_TABLE . " 172 WHERE group_id = $group_id 173 ORDER BY user_id"; 174 $result = $db->sql_query_limit($sql, 200, $start); 175 176 $mark_ary = array(); 177 if ($row = $db->sql_fetchrow($result)) 178 { 179 do 180 { 181 $mark_ary[] = $row['user_id']; 182 } 183 while ($row = $db->sql_fetchrow($result)); 184 185 group_user_attributes('default', $group_id, $mark_ary, false, $group_name, $group_row); 186 187 $start = (sizeof($mark_ary) < 200) ? 0 : $start + 200; 188 } 189 else 190 { 191 $start = 0; 192 } 193 $db->sql_freeresult($result); 194 } 195 while ($start); 196 197 trigger_error($user->lang['GROUP_DEFS_UPDATED'] . adm_back_link($this->u_action . '&action=list&g=' . $group_id)); 198 } 199 else 200 { 201 confirm_box(false, $user->lang['CONFIRM_OPERATION'], build_hidden_fields(array( 202 'mark' => $mark_ary, 203 'g' => $group_id, 204 'i' => $id, 205 'mode' => $mode, 206 'action' => $action)) 207 ); 208 } 209 break; 210 211 case 'deleteusers': 212 if (empty($mark_ary)) 213 { 214 trigger_error($user->lang['NO_USERS'] . adm_back_link($this->u_action . '&action=list&g=' . $group_id), E_USER_WARNING); 215 } 216 case 'delete': 217 if (!$group_id) 218 { 219 trigger_error($user->lang['NO_GROUP'] . adm_back_link($this->u_action), E_USER_WARNING); 220 } 221 else if ($action === 'delete' && $group_row['group_type'] == GROUP_SPECIAL) 222 { 223 trigger_error($user->lang['NO_AUTH_OPERATION'] . adm_back_link($this->u_action), E_USER_WARNING); 224 } 225 226 if (confirm_box(true)) 227 { 228 $error = ''; 229 230 switch ($action) 231 { 232 case 'delete': 233 if (!$auth->acl_get('a_groupdel')) 234 { 235 trigger_error($user->lang['NO_AUTH_OPERATION'] . adm_back_link($this->u_action), E_USER_WARNING); 236 } 237 238 $error = group_delete($group_id, $group_row['group_name']); 239 break; 240 241 case 'deleteusers': 242 $group_name = ($group_row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $group_row['group_name']] : $group_row['group_name']; 243 $error = group_user_del($group_id, $mark_ary, false, $group_name); 244 break; 245 } 246 247 $back_link = ($action == 'delete') ? $this->u_action : $this->u_action . '&action=list&g=' . $group_id; 248 249 if ($error) 250 { 251 trigger_error($user->lang[$error] . adm_back_link($back_link), E_USER_WARNING); 252 } 253 254 $message = ($action == 'delete') ? 'GROUP_DELETED' : 'GROUP_USERS_REMOVE'; 255 trigger_error($user->lang[$message] . adm_back_link($back_link)); 256 } 257 else 258 { 259 confirm_box(false, $user->lang['CONFIRM_OPERATION'], build_hidden_fields(array( 260 'mark' => $mark_ary, 261 'g' => $group_id, 262 'i' => $id, 263 'mode' => $mode, 264 'action' => $action)) 265 ); 266 } 267 break; 268 269 case 'addusers': 270 if (!check_form_key($form_key)) 271 { 272 trigger_error($user->lang['FORM_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING); 273 } 274 275 if (!$group_id) 276 { 277 trigger_error($user->lang['NO_GROUP'] . adm_back_link($this->u_action), E_USER_WARNING); 278 } 279 280 if (!$name_ary) 281 { 282 trigger_error($user->lang['NO_USERS'] . adm_back_link($this->u_action . '&action=list&g=' . $group_id), E_USER_WARNING); 283 } 284 285 $name_ary = array_unique(explode("\n", $name_ary)); 286 $group_name = ($group_row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $group_row['group_name']] : $group_row['group_name']; 287 288 // Add user/s to group 289 if ($error = group_user_add($group_id, false, $name_ary, $group_name, $default, $leader, 0, $group_row)) 290 { 291 trigger_error($user->lang[$error] . adm_back_link($this->u_action . '&action=list&g=' . $group_id), E_USER_WARNING); 292 } 293 294 $message = ($leader) ? 'GROUP_MODS_ADDED' : 'GROUP_USERS_ADDED'; 295 trigger_error($user->lang[$message] . adm_back_link($this->u_action . '&action=list&g=' . $group_id)); 296 break; 297 298 case 'edit': 299 case 'add': 300 301 if (!function_exists('display_forums')) 302 { 303 include($phpbb_root_path . 'includes/functions_display.' . $phpEx); 304 } 305 306 $data = $submit_ary = array(); 307 308 if ($action == 'edit' && !$group_id) 309 { 310 trigger_error($user->lang['NO_GROUP'] . adm_back_link($this->u_action), E_USER_WARNING); 311 } 312 313 if ($action == 'add' && !$auth->acl_get('a_groupadd')) 314 { 315 trigger_error($user->lang['NO_AUTH_OPERATION'] . adm_back_link($this->u_action), E_USER_WARNING); 316 } 317 318 $error = array(); 319 $user->add_lang('ucp'); 320 321 // Setup avatar data for later 322 $avatars_enabled = false; 323 $avatar_drivers = null; 324 $avatar_data = null; 325 $avatar_error = array(); 326 327 /** @var \phpbb\avatar\manager $phpbb_avatar_manager */ 328 $phpbb_avatar_manager = $phpbb_container->get('avatar.manager'); 329 330 if ($config['allow_avatar']) 331 { 332 $avatar_drivers = $phpbb_avatar_manager->get_enabled_drivers(); 333 334 // This is normalised data, without the group_ prefix 335 $avatar_data = \phpbb\avatar\manager::clean_row($group_row, 'group'); 336 if (!isset($avatar_data['id'])) 337 { 338 $avatar_data['id'] = 'g' . $group_id; 339 } 340 } 341 342 if ($request->is_set_post('avatar_delete')) 343 { 344 if (confirm_box(true)) 345 { 346 $avatar_data['id'] = substr($avatar_data['id'], 1); 347 $phpbb_avatar_manager->handle_avatar_delete($db, $user, $avatar_data, GROUPS_TABLE, 'group_'); 348 349 $message = ($action == 'edit') ? 'GROUP_UPDATED' : 'GROUP_CREATED'; 350 trigger_error($user->lang[$message] . adm_back_link($this->u_action)); 351 } 352 else 353 { 354 confirm_box(false, $user->lang('CONFIRM_AVATAR_DELETE'), build_hidden_fields(array( 355 'avatar_delete' => true, 356 'i' => $id, 357 'mode' => $mode, 358 'g' => $group_id, 359 'action' => $action)) 360 ); 361 } 362 } 363 364 // Did we submit? 365 if ($update) 366 { 367 if (!check_form_key($form_key)) 368 { 369 trigger_error($user->lang['FORM_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING); 370 } 371 372 $group_name = utf8_normalize_nfc(request_var('group_name', '', true)); 373 $group_desc = utf8_normalize_nfc(request_var('group_desc', '', true)); 374 $group_type = request_var('group_type', GROUP_FREE); 375 376 $allow_desc_bbcode = request_var('desc_parse_bbcode', false); 377 $allow_desc_urls = request_var('desc_parse_urls', false); 378 $allow_desc_smilies = request_var('desc_parse_smilies', false); 379 380 $submit_ary = array( 381 'colour' => request_var('group_colour', ''), 382 'rank' => request_var('group_rank', 0), 383 'receive_pm' => isset($_REQUEST['group_receive_pm']) ? 1 : 0, 384 'legend' => isset($_REQUEST['group_legend']) ? 1 : 0, 385 'teampage' => isset($_REQUEST['group_teampage']) ? 1 : 0, 386 'message_limit' => request_var('group_message_limit', 0), 387 'max_recipients' => request_var('group_max_recipients', 0), 388 'founder_manage' => 0, 389 'skip_auth' => request_var('group_skip_auth', 0), 390 ); 391 392 if ($user->data['user_type'] == USER_FOUNDER) 393 { 394 $submit_ary['founder_manage'] = isset($_REQUEST['group_founder_manage']) ? 1 : 0; 395 } 396 397 if ($config['allow_avatar']) 398 { 399 // Handle avatar 400 $driver_name = $phpbb_avatar_manager->clean_driver_name($request->variable('avatar_driver', '')); 401 402 if (in_array($driver_name, $avatar_drivers) && !$request->is_set_post('avatar_delete')) 403 { 404 $driver = $phpbb_avatar_manager->get_driver($driver_name); 405 $result = $driver->process_form($request, $template, $user, $avatar_data, $avatar_error); 406 407 if ($result && empty($avatar_error)) 408 { 409 $result['avatar_type'] = $driver_name; 410 $submit_ary = array_merge($submit_ary, $result); 411 } 412 } 413 else 414 { 415 $driver = $phpbb_avatar_manager->get_driver($avatar_data['avatar_type']); 416 if ($driver) 417 { 418 $driver->delete($avatar_data); 419 } 420 421 // Removing the avatar 422 $submit_ary['avatar_type'] = ''; 423 $submit_ary['avatar'] = ''; 424 $submit_ary['avatar_width'] = 0; 425 $submit_ary['avatar_height'] = 0; 426 } 427 428 // Merge any avatar errors into the primary error array 429 $error = array_merge($error, $phpbb_avatar_manager->localize_errors($user, $avatar_error)); 430 } 431 432 /* 433 * Validate the length of "Maximum number of allowed recipients per 434 * private message" setting. We use 16777215 as a maximum because it matches 435 * MySQL unsigned mediumint maximum value which is the lowest amongst DBMSes 436 * supported by phpBB3. Also validate the submitted colour value. 437 */ 438 $validation_checks = array( 439 'max_recipients' => array('num', false, 0, 16777215), 440 'colour' => array('hex_colour', true), 441 ); 442 443 /** 444 * Request group data and operate on it 445 * 446 * @event core.acp_manage_group_request_data 447 * @var string action Type of the action: add|edit 448 * @var int group_id The group id 449 * @var array group_row Array with new group data 450 * @var array error Array of errors, if you add errors 451 * ensure to update the template variables 452 * S_ERROR and ERROR_MSG to display it 453 * @var string group_name The group name 454 * @var string group_desc The group description 455 * @var int group_type The group type 456 * @var bool allow_desc_bbcode Allow bbcode in group description: true|false 457 * @var bool allow_desc_urls Allow urls in group description: true|false 458 * @var bool allow_desc_smilies Allow smiles in group description: true|false 459 * @var array submit_ary Array with new group data 460 * @var array validation_checks Array with validation data 461 * @since 3.1.0-b5 462 */ 463 $vars = array( 464 'action', 465 'group_id', 466 'group_row', 467 'error', 468 'group_name', 469 'group_desc', 470 'group_type', 471 'allow_desc_bbcode', 472 'allow_desc_urls', 473 'allow_desc_smilies', 474 'submit_ary', 475 'validation_checks', 476 ); 477 extract($phpbb_dispatcher->trigger_event('core.acp_manage_group_request_data', compact($vars))); 478 479 if ($validation_error = validate_data($submit_ary, $validation_checks)) 480 { 481 // Replace "error" string with its real, localised form 482 $error = array_merge($error, $validation_error); 483 } 484 485 if (!sizeof($error)) 486 { 487 // Only set the rank, colour, etc. if it's changed or if we're adding a new 488 // group. This prevents existing group members being updated if no changes 489 // were made. 490 // However there are some attributes that need to be set everytime, 491 // otherwise the group gets removed from the feature. 492 $set_attributes = array('legend', 'teampage'); 493 494 $group_attributes = array(); 495 $test_variables = array( 496 'rank' => 'int', 497 'colour' => 'string', 498 'avatar' => 'string', 499 'avatar_type' => 'string', 500 'avatar_width' => 'int', 501 'avatar_height' => 'int', 502 'receive_pm' => 'int', 503 'legend' => 'int', 504 'teampage' => 'int', 505 'message_limit' => 'int', 506 'max_recipients'=> 'int', 507 'founder_manage'=> 'int', 508 'skip_auth' => 'int', 509 ); 510 511 /** 512 * Initialise data before we display the add/edit form 513 * 514 * @event core.acp_manage_group_initialise_data 515 * @var string action Type of the action: add|edit 516 * @var int group_id The group id 517 * @var array group_row Array with new group data 518 * @var array error Array of errors, if you add errors 519 * ensure to update the template variables 520 * S_ERROR and ERROR_MSG to display it 521 * @var string group_name The group name 522 * @var string group_desc The group description 523 * @var int group_type The group type 524 * @var bool allow_desc_bbcode Allow bbcode in group description: true|false 525 * @var bool allow_desc_urls Allow urls in group description: true|false 526 * @var bool allow_desc_smilies Allow smiles in group description: true|false 527 * @var array submit_ary Array with new group data 528 * @var array test_variables Array with variables for test 529 * @since 3.1.0-b5 530 */ 531 $vars = array( 532 'action', 533 'group_id', 534 'group_row', 535 'error', 536 'group_name', 537 'group_desc', 538 'group_type', 539 'allow_desc_bbcode', 540 'allow_desc_urls', 541 'allow_desc_smilies', 542 'submit_ary', 543 'test_variables', 544 ); 545 extract($phpbb_dispatcher->trigger_event('core.acp_manage_group_initialise_data', compact($vars))); 546 547 foreach ($test_variables as $test => $type) 548 { 549 if (isset($submit_ary[$test]) && ($action == 'add' || $group_row['group_' . $test] != $submit_ary[$test] || isset($group_attributes['group_avatar']) && strpos($test, 'avatar') === 0 || in_array($test, $set_attributes))) 550 { 551 settype($submit_ary[$test], $type); 552 $group_attributes['group_' . $test] = $group_row['group_' . $test] = $submit_ary[$test]; 553 } 554 } 555 556 if (!($error = group_create($group_id, $group_type, $group_name, $group_desc, $group_attributes, $allow_desc_bbcode, $allow_desc_urls, $allow_desc_smilies))) 557 { 558 $group_perm_from = request_var('group_perm_from', 0); 559 560 // Copy permissions? 561 // If the user has the a_authgroups permission and at least one additional permission ability set the permissions are fully transferred. 562 // We do not limit on one auth category because this can lead to incomplete permissions being tricky to fix for the admin, roles being assigned or added non-default permissions. 563 // Since the user only has the option to copy permissions from non leader managed groups this seems to be a good compromise. 564 if ($group_perm_from && $action == 'add' && $auth->acl_get('a_authgroups') && $auth->acl_gets('a_aauth', 'a_fauth', 'a_mauth', 'a_uauth')) 565 { 566 $sql = 'SELECT group_founder_manage 567 FROM ' . GROUPS_TABLE . ' 568 WHERE group_id = ' . $group_perm_from; 569 $result = $db->sql_query($sql); 570 $check_row = $db->sql_fetchrow($result); 571 $db->sql_freeresult($result); 572 573 // Check the group if non-founder 574 if ($check_row && ($user->data['user_type'] == USER_FOUNDER || $check_row['group_founder_manage'] == 0)) 575 { 576 // From the mysql documentation: 577 // Prior to MySQL 4.0.14, the target table of the INSERT statement cannot appear in the FROM clause of the SELECT part of the query. This limitation is lifted in 4.0.14. 578 // Due to this we stay on the safe side if we do the insertion "the manual way" 579 580 // Copy permisisons from/to the acl groups table (only group_id gets changed) 581 $sql = 'SELECT forum_id, auth_option_id, auth_role_id, auth_setting 582 FROM ' . ACL_GROUPS_TABLE . ' 583 WHERE group_id = ' . $group_perm_from; 584 $result = $db->sql_query($sql); 585 586 $groups_sql_ary = array(); 587 while ($row = $db->sql_fetchrow($result)) 588 { 589 $groups_sql_ary[] = array( 590 'group_id' => (int) $group_id, 591 'forum_id' => (int) $row['forum_id'], 592 'auth_option_id' => (int) $row['auth_option_id'], 593 'auth_role_id' => (int) $row['auth_role_id'], 594 'auth_setting' => (int) $row['auth_setting'] 595 ); 596 } 597 $db->sql_freeresult($result); 598 599 // Now insert the data 600 $db->sql_multi_insert(ACL_GROUPS_TABLE, $groups_sql_ary); 601 602 $auth->acl_clear_prefetch(); 603 } 604 } 605 606 $cache->destroy('sql', array(GROUPS_TABLE, TEAMPAGE_TABLE)); 607 608 $message = ($action == 'edit') ? 'GROUP_UPDATED' : 'GROUP_CREATED'; 609 trigger_error($user->lang[$message] . adm_back_link($this->u_action)); 610 } 611 } 612 613 if (sizeof($error)) 614 { 615 $error = array_map(array(&$user, 'lang'), $error); 616 $group_rank = $submit_ary['rank']; 617 618 $group_desc_data = array( 619 'text' => $group_desc, 620 'allow_bbcode' => $allow_desc_bbcode, 621 'allow_smilies' => $allow_desc_smilies, 622 'allow_urls' => $allow_desc_urls 623 ); 624 } 625 } 626 else if (!$group_id) 627 { 628 $group_name = utf8_normalize_nfc(request_var('group_name', '', true)); 629 $group_desc_data = array( 630 'text' => '', 631 'allow_bbcode' => true, 632 'allow_smilies' => true, 633 'allow_urls' => true 634 ); 635 $group_rank = 0; 636 $group_type = GROUP_OPEN; 637 } 638 else 639 { 640 $group_name = $group_row['group_name']; 641 $group_desc_data = generate_text_for_edit($group_row['group_desc'], $group_row['group_desc_uid'], $group_row['group_desc_options']); 642 $group_type = $group_row['group_type']; 643 $group_rank = $group_row['group_rank']; 644 } 645 646 $sql = 'SELECT * 647 FROM ' . RANKS_TABLE . ' 648 WHERE rank_special = 1 649 ORDER BY rank_title'; 650 $result = $db->sql_query($sql); 651 652 $rank_options = '<option value="0"' . ((!$group_rank) ? ' selected="selected"' : '') . '>' . $user->lang['USER_DEFAULT'] . '</option>'; 653 654 while ($row = $db->sql_fetchrow($result)) 655 { 656 $selected = ($group_rank && $row['rank_id'] == $group_rank) ? ' selected="selected"' : ''; 657 $rank_options .= '<option value="' . $row['rank_id'] . '"' . $selected . '>' . $row['rank_title'] . '</option>'; 658 } 659 $db->sql_freeresult($result); 660 661 $type_free = ($group_type == GROUP_FREE) ? ' checked="checked"' : ''; 662 $type_open = ($group_type == GROUP_OPEN) ? ' checked="checked"' : ''; 663 $type_closed = ($group_type == GROUP_CLOSED) ? ' checked="checked"' : ''; 664 $type_hidden = ($group_type == GROUP_HIDDEN) ? ' checked="checked"' : ''; 665 666 // Load up stuff for avatars 667 if ($config['allow_avatar']) 668 { 669 $avatars_enabled = false; 670 $selected_driver = $phpbb_avatar_manager->clean_driver_name($request->variable('avatar_driver', $avatar_data['avatar_type'])); 671 672 // Assign min and max values before generating avatar driver html 673 $template->assign_vars(array( 674 'AVATAR_MIN_WIDTH' => $config['avatar_min_width'], 675 'AVATAR_MAX_WIDTH' => $config['avatar_max_width'], 676 'AVATAR_MIN_HEIGHT' => $config['avatar_min_height'], 677 'AVATAR_MAX_HEIGHT' => $config['avatar_max_height'], 678 )); 679 680 foreach ($avatar_drivers as $current_driver) 681 { 682 $driver = $phpbb_avatar_manager->get_driver($current_driver); 683 684 $avatars_enabled = true; 685 $template->set_filenames(array( 686 'avatar' => $driver->get_acp_template_name(), 687 )); 688 689 if ($driver->prepare_form($request, $template, $user, $avatar_data, $avatar_error)) 690 { 691 $driver_name = $phpbb_avatar_manager->prepare_driver_name($current_driver); 692 $driver_upper = strtoupper($driver_name); 693 $template->assign_block_vars('avatar_drivers', array( 694 'L_TITLE' => $user->lang($driver_upper . '_TITLE'), 695 'L_EXPLAIN' => $user->lang($driver_upper . '_EXPLAIN'), 696 697 'DRIVER' => $driver_name, 698 'SELECTED' => $current_driver == $selected_driver, 699 'OUTPUT' => $template->assign_display('avatar'), 700 )); 701 } 702 } 703 } 704 705 $avatar = phpbb_get_group_avatar($group_row, 'GROUP_AVATAR', true); 706 707 if (isset($phpbb_avatar_manager) && !$update) 708 { 709 // Merge any avatar errors into the primary error array 710 $error = array_merge($error, $phpbb_avatar_manager->localize_errors($user, $avatar_error)); 711 } 712 713 $back_link = request_var('back_link', ''); 714 715 switch ($back_link) 716 { 717 case 'acp_users_groups': 718 $u_back = append_sid("{$phpbb_admin_path}index.$phpEx", 'i=users&mode=groups&u=' . request_var('u', 0)); 719 break; 720 721 default: 722 $u_back = $this->u_action; 723 break; 724 } 725 726 $template->assign_vars(array( 727 'S_EDIT' => true, 728 'S_ADD_GROUP' => ($action == 'add') ? true : false, 729 'S_GROUP_PERM' => ($action == 'add' && $auth->acl_get('a_authgroups') && $auth->acl_gets('a_aauth', 'a_fauth', 'a_mauth', 'a_uauth')) ? true : false, 730 'S_INCLUDE_SWATCH' => true, 731 'S_ERROR' => (sizeof($error)) ? true : false, 732 'S_SPECIAL_GROUP' => ($group_type == GROUP_SPECIAL) ? true : false, 733 'S_USER_FOUNDER' => ($user->data['user_type'] == USER_FOUNDER) ? true : false, 734 'S_AVATARS_ENABLED' => ($config['allow_avatar'] && $avatars_enabled), 735 736 'ERROR_MSG' => (sizeof($error)) ? implode('<br />', $error) : '', 737 'GROUP_NAME' => ($group_type == GROUP_SPECIAL) ? $user->lang['G_' . $group_name] : $group_name, 738 'GROUP_INTERNAL_NAME' => $group_name, 739 'GROUP_DESC' => $group_desc_data['text'], 740 'GROUP_RECEIVE_PM' => (isset($group_row['group_receive_pm']) && $group_row['group_receive_pm']) ? ' checked="checked"' : '', 741 'GROUP_FOUNDER_MANAGE' => (isset($group_row['group_founder_manage']) && $group_row['group_founder_manage']) ? ' checked="checked"' : '', 742 'GROUP_LEGEND' => (isset($group_row['group_legend']) && $group_row['group_legend']) ? ' checked="checked"' : '', 743 'GROUP_TEAMPAGE' => (isset($group_row['group_teampage']) && $group_row['group_teampage']) ? ' checked="checked"' : '', 744 'GROUP_MESSAGE_LIMIT' => (isset($group_row['group_message_limit'])) ? $group_row['group_message_limit'] : 0, 745 'GROUP_MAX_RECIPIENTS' => (isset($group_row['group_max_recipients'])) ? $group_row['group_max_recipients'] : 0, 746 'GROUP_COLOUR' => (isset($group_row['group_colour'])) ? $group_row['group_colour'] : '', 747 'GROUP_SKIP_AUTH' => (!empty($group_row['group_skip_auth'])) ? ' checked="checked"' : '', 748 749 'S_DESC_BBCODE_CHECKED' => $group_desc_data['allow_bbcode'], 750 'S_DESC_URLS_CHECKED' => $group_desc_data['allow_urls'], 751 'S_DESC_SMILIES_CHECKED'=> $group_desc_data['allow_smilies'], 752 753 'S_RANK_OPTIONS' => $rank_options, 754 'S_GROUP_OPTIONS' => group_select_options(false, false, (($user->data['user_type'] == USER_FOUNDER) ? false : 0)), 755 'AVATAR' => empty($avatar) ? '<img src="' . $phpbb_admin_path . 'images/no_avatar.gif" alt="" />' : $avatar, 756 'AVATAR_MAX_FILESIZE' => $config['avatar_filesize'], 757 'AVATAR_WIDTH' => (isset($group_row['group_avatar_width'])) ? $group_row['group_avatar_width'] : '', 758 'AVATAR_HEIGHT' => (isset($group_row['group_avatar_height'])) ? $group_row['group_avatar_height'] : '', 759 760 'GROUP_TYPE_FREE' => GROUP_FREE, 761 'GROUP_TYPE_OPEN' => GROUP_OPEN, 762 'GROUP_TYPE_CLOSED' => GROUP_CLOSED, 763 'GROUP_TYPE_HIDDEN' => GROUP_HIDDEN, 764 'GROUP_TYPE_SPECIAL' => GROUP_SPECIAL, 765 766 'GROUP_FREE' => $type_free, 767 'GROUP_OPEN' => $type_open, 768 'GROUP_CLOSED' => $type_closed, 769 'GROUP_HIDDEN' => $type_hidden, 770 771 'U_BACK' => $u_back, 772 'U_ACTION' => "{$this->u_action}&action=$action&g=$group_id", 773 'L_AVATAR_EXPLAIN' => phpbb_avatar_explanation_string(), 774 )); 775 776 /** 777 * Modify group template data before we display the form 778 * 779 * @event core.acp_manage_group_display_form 780 * @var string action Type of the action: add|edit 781 * @var bool update Do we display the form only 782 * or did the user press submit 783 * @var int group_id The group id 784 * @var array group_row Array with new group data 785 * @var string group_name The group name 786 * @var int group_type The group type 787 * @var array group_desc_data The group description data 788 * @var string group_rank The group rank 789 * @var string rank_options The rank options 790 * @var array error Array of errors, if you add errors 791 * ensure to update the template variables 792 * S_ERROR and ERROR_MSG to display it 793 * @since 3.1.0-b5 794 */ 795 $vars = array( 796 'action', 797 'update', 798 'group_id', 799 'group_row', 800 'group_desc_data', 801 'group_name', 802 'group_type', 803 'group_rank', 804 'rank_options', 805 'error', 806 ); 807 extract($phpbb_dispatcher->trigger_event('core.acp_manage_group_display_form', compact($vars))); 808 809 return; 810 break; 811 812 case 'list': 813 814 if (!$group_id) 815 { 816 trigger_error($user->lang['NO_GROUP'] . adm_back_link($this->u_action), E_USER_WARNING); 817 } 818 819 $this->page_title = 'GROUP_MEMBERS'; 820 $pagination = $phpbb_container->get('pagination'); 821 822 // Grab the leaders - always, on every page... 823 $sql = 'SELECT u.user_id, u.username, u.username_clean, u.user_regdate, u.user_colour, u.user_posts, u.group_id, ug.group_leader, ug.user_pending 824 FROM ' . USERS_TABLE . ' u, ' . USER_GROUP_TABLE . " ug 825 WHERE ug.group_id = $group_id 826 AND u.user_id = ug.user_id 827 AND ug.group_leader = 1 828 ORDER BY ug.group_leader DESC, ug.user_pending ASC, u.username_clean"; 829 $result = $db->sql_query($sql); 830 831 while ($row = $db->sql_fetchrow($result)) 832 { 833 $template->assign_block_vars('leader', array( 834 'U_USER_EDIT' => append_sid("{$phpbb_admin_path}index.$phpEx", "i=users&action=edit&u={$row['user_id']}"), 835 836 'USERNAME' => $row['username'], 837 'USERNAME_COLOUR' => $row['user_colour'], 838 'S_GROUP_DEFAULT' => ($row['group_id'] == $group_id) ? true : false, 839 'JOINED' => ($row['user_regdate']) ? $user->format_date($row['user_regdate']) : ' - ', 840 'USER_POSTS' => $row['user_posts'], 841 'USER_ID' => $row['user_id'], 842 )); 843 } 844 $db->sql_freeresult($result); 845 846 // Total number of group members (non-leaders) 847 $sql = 'SELECT COUNT(user_id) AS total_members 848 FROM ' . USER_GROUP_TABLE . " 849 WHERE group_id = $group_id 850 AND group_leader = 0"; 851 $result = $db->sql_query($sql); 852 $total_members = (int) $db->sql_fetchfield('total_members'); 853 $db->sql_freeresult($result); 854 855 $s_action_options = ''; 856 $options = array('default' => 'DEFAULT', 'approve' => 'APPROVE', 'demote' => 'DEMOTE', 'promote' => 'PROMOTE', 'deleteusers' => 'DELETE'); 857 858 foreach ($options as $option => $lang) 859 { 860 $s_action_options .= '<option value="' . $option . '">' . $user->lang['GROUP_' . $lang] . '</option>'; 861 } 862 863 $base_url = $this->u_action . "&action=$action&g=$group_id"; 864 $pagination->generate_template_pagination($base_url, 'pagination', 'start', $total_members, $config['topics_per_page'], $start); 865 866 $template->assign_vars(array( 867 'S_LIST' => true, 868 'S_GROUP_SPECIAL' => ($group_row['group_type'] == GROUP_SPECIAL) ? true : false, 869 'S_ACTION_OPTIONS' => $s_action_options, 870 871 'GROUP_NAME' => ($group_row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $group_row['group_name']] : $group_row['group_name'], 872 873 'U_ACTION' => $this->u_action . "&g=$group_id", 874 'U_BACK' => $this->u_action, 875 'U_FIND_USERNAME' => append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=searchuser&form=list&field=usernames'), 876 'U_DEFAULT_ALL' => "{$this->u_action}&action=set_default_on_all&g=$group_id", 877 )); 878 879 // Grab the members 880 $sql = 'SELECT u.user_id, u.username, u.username_clean, u.user_colour, u.user_regdate, u.user_posts, u.group_id, ug.group_leader, ug.user_pending 881 FROM ' . USERS_TABLE . ' u, ' . USER_GROUP_TABLE . " ug 882 WHERE ug.group_id = $group_id 883 AND u.user_id = ug.user_id 884 AND ug.group_leader = 0 885 ORDER BY ug.group_leader DESC, ug.user_pending ASC, u.username_clean"; 886 $result = $db->sql_query_limit($sql, $config['topics_per_page'], $start); 887 888 $pending = false; 889 890 while ($row = $db->sql_fetchrow($result)) 891 { 892 if ($row['user_pending'] && !$pending) 893 { 894 $template->assign_block_vars('member', array( 895 'S_PENDING' => true) 896 ); 897 898 $pending = true; 899 } 900 901 $template->assign_block_vars('member', array( 902 'U_USER_EDIT' => append_sid("{$phpbb_admin_path}index.$phpEx", "i=users&action=edit&u={$row['user_id']}"), 903 904 'USERNAME' => $row['username'], 905 'USERNAME_COLOUR' => $row['user_colour'], 906 'S_GROUP_DEFAULT' => ($row['group_id'] == $group_id) ? true : false, 907 'JOINED' => ($row['user_regdate']) ? $user->format_date($row['user_regdate']) : ' - ', 908 'USER_POSTS' => $row['user_posts'], 909 'USER_ID' => $row['user_id']) 910 ); 911 } 912 $db->sql_freeresult($result); 913 914 return; 915 break; 916 } 917 918 $template->assign_vars(array( 919 'U_ACTION' => $this->u_action, 920 'S_GROUP_ADD' => ($auth->acl_get('a_groupadd')) ? true : false) 921 ); 922 923 // Get us all the groups 924 $sql = 'SELECT g.group_id, g.group_name, g.group_type 925 FROM ' . GROUPS_TABLE . ' g 926 ORDER BY g.group_type ASC, g.group_name'; 927 $result = $db->sql_query($sql); 928 929 $lookup = $cached_group_data = array(); 930 while ($row = $db->sql_fetchrow($result)) 931 { 932 $type = ($row['group_type'] == GROUP_SPECIAL) ? 'special' : 'normal'; 933 934 // used to determine what type a group is 935 $lookup[$row['group_id']] = $type; 936 937 // used for easy access to the data within a group 938 $cached_group_data[$type][$row['group_id']] = $row; 939 $cached_group_data[$type][$row['group_id']]['total_members'] = 0; 940 } 941 $db->sql_freeresult($result); 942 943 // How many people are in which group? 944 $sql = 'SELECT COUNT(ug.user_id) AS total_members, ug.group_id 945 FROM ' . USER_GROUP_TABLE . ' ug 946 WHERE ' . $db->sql_in_set('ug.group_id', array_keys($lookup)) . ' 947 GROUP BY ug.group_id'; 948 $result = $db->sql_query($sql); 949 950 while ($row = $db->sql_fetchrow($result)) 951 { 952 $type = $lookup[$row['group_id']]; 953 $cached_group_data[$type][$row['group_id']]['total_members'] = $row['total_members']; 954 } 955 $db->sql_freeresult($result); 956 957 // The order is... normal, then special 958 ksort($cached_group_data); 959 960 foreach ($cached_group_data as $type => $row_ary) 961 { 962 if ($type == 'special') 963 { 964 $template->assign_block_vars('groups', array( 965 'S_SPECIAL' => true) 966 ); 967 } 968 969 foreach ($row_ary as $group_id => $row) 970 { 971 $group_name = (!empty($user->lang['G_' . $row['group_name']]))? $user->lang['G_' . $row['group_name']] : $row['group_name']; 972 973 $template->assign_block_vars('groups', array( 974 'U_LIST' => "{$this->u_action}&action=list&g=$group_id", 975 'U_EDIT' => "{$this->u_action}&action=edit&g=$group_id", 976 'U_DELETE' => ($auth->acl_get('a_groupdel')) ? "{$this->u_action}&action=delete&g=$group_id" : '', 977 978 'S_GROUP_SPECIAL' => ($row['group_type'] == GROUP_SPECIAL) ? true : false, 979 980 'GROUP_NAME' => $group_name, 981 'TOTAL_MEMBERS' => $row['total_members'], 982 )); 983 } 984 } 985 } 986 987 public function manage_position() 988 { 989 global $config, $db, $template, $user, $request, $phpbb_container; 990 991 $this->tpl_name = 'acp_groups_position'; 992 $this->page_title = 'ACP_GROUPS_POSITION'; 993 994 $field = $request->variable('field', ''); 995 $action = $request->variable('action', ''); 996 $group_id = $request->variable('g', 0); 997 $teampage_id = $request->variable('t', 0); 998 $category_id = $request->variable('c', 0); 999 1000 if ($field && !in_array($field, array('legend', 'teampage'))) 1001 { 1002 // Invalid mode 1003 trigger_error($user->lang['NO_MODE'] . adm_back_link($this->u_action), E_USER_WARNING); 1004 } 1005 else if ($field && in_array($field, array('legend', 'teampage'))) 1006 { 1007 1008 $group_position = $phpbb_container->get('groupposition.' . $field); 1009 } 1010 1011 if ($field == 'teampage') 1012 { 1013 try 1014 { 1015 switch ($action) 1016 { 1017 case 'add': 1018 $group_position->add_group_teampage($group_id, $category_id); 1019 break; 1020 1021 case 'add_category': 1022 $group_position->add_category_teampage($request->variable('category_name', '', true)); 1023 break; 1024 1025 case 'delete': 1026 $group_position->delete_teampage($teampage_id); 1027 break; 1028 1029 case 'move_up': 1030 $group_position->move_up_teampage($teampage_id); 1031 break; 1032 1033 case 'move_down': 1034 $group_position->move_down_teampage($teampage_id); 1035 break; 1036 } 1037 } 1038 catch (\phpbb\groupposition\exception $exception) 1039 { 1040 trigger_error($user->lang($exception->getMessage()) . adm_back_link($this->u_action), E_USER_WARNING); 1041 } 1042 } 1043 else if ($field == 'legend') 1044 { 1045 try 1046 { 1047 switch ($action) 1048 { 1049 case 'add': 1050 $group_position->add_group($group_id); 1051 break; 1052 1053 case 'delete': 1054 $group_position->delete_group($group_id); 1055 break; 1056 1057 case 'move_up': 1058 $group_position->move_up($group_id); 1059 break; 1060 1061 case 'move_down': 1062 $group_position->move_down($group_id); 1063 break; 1064 } 1065 } 1066 catch (\phpbb\groupposition\exception $exception) 1067 { 1068 trigger_error($user->lang($exception->getMessage()) . adm_back_link($this->u_action), E_USER_WARNING); 1069 } 1070 } 1071 else 1072 { 1073 switch ($action) 1074 { 1075 case 'set_config_teampage': 1076 $config->set('teampage_forums', $request->variable('teampage_forums', 0)); 1077 $config->set('teampage_memberships', $request->variable('teampage_memberships', 0)); 1078 trigger_error($user->lang['CONFIG_UPDATED'] . adm_back_link($this->u_action)); 1079 break; 1080 1081 case 'set_config_legend': 1082 $config->set('legend_sort_groupname', $request->variable('legend_sort_groupname', 0)); 1083 trigger_error($user->lang['CONFIG_UPDATED'] . adm_back_link($this->u_action)); 1084 break; 1085 } 1086 } 1087 1088 if (($action == 'move_up' || $action == 'move_down') && $request->is_ajax()) 1089 { 1090 $json_response = new \phpbb\json_response; 1091 $json_response->send(array('success' => true)); 1092 } 1093 1094 $sql = 'SELECT group_id, group_name, group_colour, group_type, group_legend 1095 FROM ' . GROUPS_TABLE . ' 1096 ORDER BY group_legend ASC, group_type DESC, group_name ASC'; 1097 $result = $db->sql_query($sql); 1098 1099 $s_group_select_legend = ''; 1100 while ($row = $db->sql_fetchrow($result)) 1101 { 1102 $group_name = ($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['group_name']] : $row['group_name']; 1103 if ($row['group_legend']) 1104 { 1105 $template->assign_block_vars('legend', array( 1106 'GROUP_NAME' => $group_name, 1107 'GROUP_COLOUR' => ($row['group_colour']) ? '#' . $row['group_colour'] : '', 1108 'GROUP_TYPE' => $user->lang[\phpbb\groupposition\legend::group_type_language($row['group_type'])], 1109 1110 'U_MOVE_DOWN' => "{$this->u_action}&field=legend&action=move_down&g=" . $row['group_id'], 1111 'U_MOVE_UP' => "{$this->u_action}&field=legend&action=move_up&g=" . $row['group_id'], 1112 'U_DELETE' => "{$this->u_action}&field=legend&action=delete&g=" . $row['group_id'], 1113 )); 1114 } 1115 else 1116 { 1117 $template->assign_block_vars('add_legend', array( 1118 'GROUP_ID' => (int) $row['group_id'], 1119 'GROUP_NAME' => $group_name, 1120 'GROUP_SPECIAL' => ($row['group_type'] == GROUP_SPECIAL), 1121 )); 1122 } 1123 } 1124 $db->sql_freeresult($result); 1125 1126 $category_url_param = (($category_id) ? '&c=' . $category_id : ''); 1127 1128 $sql = 'SELECT t.*, g.group_name, g.group_colour, g.group_type 1129 FROM ' . TEAMPAGE_TABLE . ' t 1130 LEFT JOIN ' . GROUPS_TABLE . ' g 1131 ON (t.group_id = g.group_id) 1132 WHERE t.teampage_parent = ' . $category_id . ' 1133 OR t.teampage_id = ' . $category_id . ' 1134 ORDER BY t.teampage_position ASC'; 1135 $result = $db->sql_query($sql); 1136 1137 $category_data = array(); 1138 while ($row = $db->sql_fetchrow($result)) 1139 { 1140 if ($row['teampage_id'] == $category_id) 1141 { 1142 $template->assign_vars(array( 1143 'CURRENT_CATEGORY_NAME' => $row['teampage_name'], 1144 )); 1145 continue; 1146 } 1147 1148 if ($row['group_id']) 1149 { 1150 $group_name = ($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['group_name']] : $row['group_name']; 1151 $group_type = $user->lang[\phpbb\groupposition\teampage::group_type_language($row['group_type'])]; 1152 } 1153 else 1154 { 1155 $group_name = $row['teampage_name']; 1156 $group_type = ''; 1157 } 1158 1159 $template->assign_block_vars('teampage', array( 1160 'GROUP_NAME' => $group_name, 1161 'GROUP_COLOUR' => ($row['group_colour']) ? '#' . $row['group_colour'] : '', 1162 'GROUP_TYPE' => $group_type, 1163 1164 'U_CATEGORY' => (!$row['group_id']) ? "{$this->u_action}&c=" . $row['teampage_id'] : '', 1165 'U_MOVE_DOWN' => "{$this->u_action}&field=teampage&action=move_down{$category_url_param}&t=" . $row['teampage_id'], 1166 'U_MOVE_UP' => "{$this->u_action}&field=teampage&action=move_up{$category_url_param}&t=" . $row['teampage_id'], 1167 'U_DELETE' => "{$this->u_action}&field=teampage&action=delete{$category_url_param}&t=" . $row['teampage_id'], 1168 )); 1169 } 1170 $db->sql_freeresult($result); 1171 1172 $sql = 'SELECT g.group_id, g.group_name, g.group_colour, g.group_type 1173 FROM ' . GROUPS_TABLE . ' g 1174 LEFT JOIN ' . TEAMPAGE_TABLE . ' t 1175 ON (t.group_id = g.group_id) 1176 WHERE t.teampage_id IS NULL 1177 ORDER BY g.group_type DESC, g.group_name ASC'; 1178 $result = $db->sql_query($sql); 1179 1180 $s_group_select_teampage = ''; 1181 while ($row = $db->sql_fetchrow($result)) 1182 { 1183 $group_name = ($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['group_name']] : $row['group_name']; 1184 $template->assign_block_vars('add_teampage', array( 1185 'GROUP_ID' => (int) $row['group_id'], 1186 'GROUP_NAME' => $group_name, 1187 'GROUP_SPECIAL' => ($row['group_type'] == GROUP_SPECIAL), 1188 )); 1189 } 1190 $db->sql_freeresult($result); 1191 1192 $template->assign_vars(array( 1193 'U_ACTION' => $this->u_action, 1194 'U_ACTION_LEGEND' => $this->u_action . '&field=legend', 1195 'U_ACTION_TEAMPAGE' => $this->u_action . '&field=teampage' . $category_url_param, 1196 'U_ACTION_TEAMPAGE_CAT' => $this->u_action . '&field=teampage_cat', 1197 1198 'S_TEAMPAGE_CATEGORY' => $category_id, 1199 'DISPLAY_FORUMS' => ($config['teampage_forums']) ? true : false, 1200 'DISPLAY_MEMBERSHIPS' => $config['teampage_memberships'], 1201 'LEGEND_SORT_GROUPNAME' => ($config['legend_sort_groupname']) ? true : false, 1202 )); 1203 } 1204 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Thu Jan 11 00:25:41 2018 | Cross-referenced by PHPXref 0.7.1 |