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