Verzeichnisstruktur phpBB-3.1.0
- Veröffentlicht
- 27.10.2014
So funktioniert es
|
Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück |
Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis. |
|
(Beispiel Datei-Icons)
|
Auf das Icon klicken um den Quellcode anzuzeigen |
ucp_groups.php
0001 <?php
0002 /**
0003 *
0004 * This file is part of the phpBB Forum Software package.
0005 *
0006 * @copyright (c) phpBB Limited <https://www.phpbb.com>
0007 * @license GNU General Public License, version 2 (GPL-2.0)
0008 *
0009 * For full copyright and license information, please see
0010 * the docs/CREDITS.txt file.
0011 *
0012 */
0013
0014 /**
0015 * @ignore
0016 */
0017 if (!defined('IN_PHPBB'))
0018 {
0019 exit;
0020 }
0021
0022 /**
0023 * ucp_groups
0024 */
0025 class ucp_groups
0026 {
0027 var $u_action;
0028
0029 function main($id, $mode)
0030 {
0031 global $config, $phpbb_root_path, $phpEx, $phpbb_admin_path;
0032 global $db, $user, $auth, $cache, $template;
0033 global $request, $phpbb_container;
0034
0035 $user->add_lang('groups');
0036
0037 $return_page = '<br /><br />' . sprintf($user->lang['RETURN_PAGE'], '<a href="' . $this->u_action . '">', '</a>');
0038
0039 $mark_ary = request_var('mark', array(0));
0040 $submit = $request->variable('submit', false, false, \phpbb\request\request_interface::POST);
0041 $delete = $request->variable('delete', false, false, \phpbb\request\request_interface::POST);
0042 $error = $data = array();
0043
0044 switch ($mode)
0045 {
0046 case 'membership':
0047
0048 $this->page_title = 'UCP_USERGROUPS_MEMBER';
0049
0050 if ($submit || isset($_POST['change_default']))
0051 {
0052 $action = (isset($_POST['change_default'])) ? 'change_default' : request_var('action', '');
0053 $group_id = ($action == 'change_default') ? request_var('default', 0) : request_var('selected', 0);
0054
0055 if (!$group_id)
0056 {
0057 trigger_error('NO_GROUP_SELECTED');
0058 }
0059
0060 $sql = 'SELECT group_id, group_name, group_type
0061 FROM ' . GROUPS_TABLE . "
0062 WHERE group_id IN ($group_id, {$user->data['group_id']})";
0063 $result = $db->sql_query($sql);
0064
0065 $group_row = array();
0066 while ($row = $db->sql_fetchrow($result))
0067 {
0068 $row['group_name'] = ($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['group_name']] : $row['group_name'];
0069 $group_row[$row['group_id']] = $row;
0070 }
0071 $db->sql_freeresult($result);
0072
0073 if (!sizeof($group_row))
0074 {
0075 trigger_error('GROUP_NOT_EXIST');
0076 }
0077
0078 switch ($action)
0079 {
0080 case 'change_default':
0081 // User already having this group set as default?
0082 if ($group_id == $user->data['group_id'])
0083 {
0084 trigger_error($user->lang['ALREADY_DEFAULT_GROUP'] . $return_page);
0085 }
0086
0087 if (!$auth->acl_get('u_chggrp'))
0088 {
0089 trigger_error($user->lang['NOT_AUTHORISED'] . $return_page);
0090 }
0091
0092 // User needs to be member of the group in order to make it default
0093 if (!group_memberships($group_id, $user->data['user_id'], true))
0094 {
0095 trigger_error($user->lang['NOT_MEMBER_OF_GROUP'] . $return_page);
0096 }
0097
0098 if (confirm_box(true))
0099 {
0100 group_user_attributes('default', $group_id, $user->data['user_id']);
0101
0102 add_log('user', $user->data['user_id'], 'LOG_USER_GROUP_CHANGE', sprintf($user->lang['USER_GROUP_CHANGE'], $group_row[$user->data['group_id']]['group_name'], $group_row[$group_id]['group_name']));
0103
0104 meta_refresh(3, $this->u_action);
0105 trigger_error($user->lang['CHANGED_DEFAULT_GROUP'] . $return_page);
0106 }
0107 else
0108 {
0109 $s_hidden_fields = array(
0110 'default' => $group_id,
0111 'change_default'=> true
0112 );
0113
0114 confirm_box(false, sprintf($user->lang['GROUP_CHANGE_DEFAULT'], $group_row[$group_id]['group_name']), build_hidden_fields($s_hidden_fields));
0115 }
0116
0117 break;
0118
0119 case 'resign':
0120
0121 // User tries to resign from default group but is not allowed to change it?
0122 if ($group_id == $user->data['group_id'] && !$auth->acl_get('u_chggrp'))
0123 {
0124 trigger_error($user->lang['NOT_RESIGN_FROM_DEFAULT_GROUP'] . $return_page);
0125 }
0126
0127 if (!($row = group_memberships($group_id, $user->data['user_id'])))
0128 {
0129 trigger_error($user->lang['NOT_MEMBER_OF_GROUP'] . $return_page);
0130 }
0131 list(, $row) = each($row);
0132
0133 $sql = 'SELECT group_type
0134 FROM ' . GROUPS_TABLE . '
0135 WHERE group_id = ' . $group_id;
0136 $result = $db->sql_query($sql);
0137 $group_type = (int) $db->sql_fetchfield('group_type');
0138 $db->sql_freeresult($result);
0139
0140 if ($group_type != GROUP_OPEN && $group_type != GROUP_FREE)
0141 {
0142 trigger_error($user->lang['CANNOT_RESIGN_GROUP'] . $return_page);
0143 }
0144
0145 if (confirm_box(true))
0146 {
0147 group_user_del($group_id, $user->data['user_id']);
0148
0149 add_log('user', $user->data['user_id'], 'LOG_USER_GROUP_RESIGN', $group_row[$group_id]['group_name']);
0150
0151 meta_refresh(3, $this->u_action);
0152 trigger_error($user->lang[($row['user_pending']) ? 'GROUP_RESIGNED_PENDING' : 'GROUP_RESIGNED_MEMBERSHIP'] . $return_page);
0153 }
0154 else
0155 {
0156 $s_hidden_fields = array(
0157 'selected' => $group_id,
0158 'action' => 'resign',
0159 'submit' => true
0160 );
0161
0162 confirm_box(false, ($row['user_pending']) ? 'GROUP_RESIGN_PENDING' : 'GROUP_RESIGN_MEMBERSHIP', build_hidden_fields($s_hidden_fields));
0163 }
0164
0165 break;
0166
0167 case 'join':
0168
0169 $sql = 'SELECT ug.*, u.username, u.username_clean, u.user_email
0170 FROM ' . USER_GROUP_TABLE . ' ug, ' . USERS_TABLE . ' u
0171 WHERE ug.user_id = u.user_id
0172 AND ug.group_id = ' . $group_id . '
0173 AND ug.user_id = ' . $user->data['user_id'];
0174 $result = $db->sql_query($sql);
0175 $row = $db->sql_fetchrow($result);
0176 $db->sql_freeresult($result);
0177
0178 if ($row)
0179 {
0180 if ($row['user_pending'])
0181 {
0182 trigger_error($user->lang['ALREADY_IN_GROUP_PENDING'] . $return_page);
0183 }
0184
0185 trigger_error($user->lang['ALREADY_IN_GROUP'] . $return_page);
0186 }
0187
0188 // Check permission to join (open group or request)
0189 if ($group_row[$group_id]['group_type'] != GROUP_OPEN && $group_row[$group_id]['group_type'] != GROUP_FREE)
0190 {
0191 trigger_error($user->lang['CANNOT_JOIN_GROUP'] . $return_page);
0192 }
0193
0194 if (confirm_box(true))
0195 {
0196 if ($group_row[$group_id]['group_type'] == GROUP_FREE)
0197 {
0198 group_user_add($group_id, $user->data['user_id']);
0199 }
0200 else
0201 {
0202 group_user_add($group_id, $user->data['user_id'], false, false, false, 0, 1);
0203 }
0204
0205 add_log('user', $user->data['user_id'], 'LOG_USER_GROUP_JOIN' . (($group_row[$group_id]['group_type'] == GROUP_FREE) ? '' : '_PENDING'), $group_row[$group_id]['group_name']);
0206
0207 meta_refresh(3, $this->u_action);
0208 trigger_error($user->lang[($group_row[$group_id]['group_type'] == GROUP_FREE) ? 'GROUP_JOINED' : 'GROUP_JOINED_PENDING'] . $return_page);
0209 }
0210 else
0211 {
0212 $s_hidden_fields = array(
0213 'selected' => $group_id,
0214 'action' => 'join',
0215 'submit' => true
0216 );
0217
0218 confirm_box(false, ($group_row[$group_id]['group_type'] == GROUP_FREE) ? 'GROUP_JOIN' : 'GROUP_JOIN_PENDING', build_hidden_fields($s_hidden_fields));
0219 }
0220
0221 break;
0222
0223 case 'demote':
0224
0225 if (!($row = group_memberships($group_id, $user->data['user_id'])))
0226 {
0227 trigger_error($user->lang['NOT_MEMBER_OF_GROUP'] . $return_page);
0228 }
0229 list(, $row) = each($row);
0230
0231 if (!$row['group_leader'])
0232 {
0233 trigger_error($user->lang['NOT_LEADER_OF_GROUP'] . $return_page);
0234 }
0235
0236 if (confirm_box(true))
0237 {
0238 group_user_attributes('demote', $group_id, $user->data['user_id']);
0239
0240 add_log('user', $user->data['user_id'], 'LOG_USER_GROUP_DEMOTE', $group_row[$group_id]['group_name']);
0241
0242 meta_refresh(3, $this->u_action);
0243 trigger_error($user->lang['USER_GROUP_DEMOTED'] . $return_page);
0244 }
0245 else
0246 {
0247 $s_hidden_fields = array(
0248 'selected' => $group_id,
0249 'action' => 'demote',
0250 'submit' => true
0251 );
0252
0253 confirm_box(false, 'USER_GROUP_DEMOTE', build_hidden_fields($s_hidden_fields));
0254 }
0255
0256 break;
0257 }
0258 }
0259
0260 $sql = 'SELECT g.*, ug.group_leader, ug.user_pending
0261 FROM ' . GROUPS_TABLE . ' g, ' . USER_GROUP_TABLE . ' ug
0262 WHERE ug.user_id = ' . $user->data['user_id'] . '
0263 AND g.group_id = ug.group_id
0264 ORDER BY g.group_type DESC, g.group_name';
0265 $result = $db->sql_query($sql);
0266
0267 $group_id_ary = array();
0268 $leader_count = $member_count = $pending_count = 0;
0269 while ($row = $db->sql_fetchrow($result))
0270 {
0271 $block = ($row['group_leader']) ? 'leader' : (($row['user_pending']) ? 'pending' : 'member');
0272
0273 switch ($row['group_type'])
0274 {
0275 case GROUP_OPEN:
0276 $group_status = 'OPEN';
0277 break;
0278
0279 case GROUP_CLOSED:
0280 $group_status = 'CLOSED';
0281 break;
0282
0283 case GROUP_HIDDEN:
0284 $group_status = 'HIDDEN';
0285 break;
0286
0287 case GROUP_SPECIAL:
0288 $group_status = 'SPECIAL';
0289 break;
0290
0291 case GROUP_FREE:
0292 $group_status = 'FREE';
0293 break;
0294 }
0295
0296 $template->assign_block_vars($block, array(
0297 'GROUP_ID' => $row['group_id'],
0298 'GROUP_NAME' => ($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['group_name']] : $row['group_name'],
0299 'GROUP_DESC' => ($row['group_type'] <> GROUP_SPECIAL) ? generate_text_for_display($row['group_desc'], $row['group_desc_uid'], $row['group_desc_bitfield'], $row['group_desc_options']) : $user->lang['GROUP_IS_SPECIAL'],
0300 'GROUP_SPECIAL' => ($row['group_type'] <> GROUP_SPECIAL) ? false : true,
0301 'GROUP_STATUS' => $user->lang['GROUP_IS_' . $group_status],
0302 'GROUP_COLOUR' => $row['group_colour'],
0303
0304 'U_VIEW_GROUP' => append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=group&g=' . $row['group_id']),
0305
0306 'S_GROUP_DEFAULT' => ($row['group_id'] == $user->data['group_id']) ? true : false,
0307 'S_ROW_COUNT' => ${$block . '_count'}++)
0308 );
0309
0310 $group_id_ary[] = (int) $row['group_id'];
0311 }
0312 $db->sql_freeresult($result);
0313
0314 // Hide hidden groups unless user is an admin with group privileges
0315 $sql_and = ($auth->acl_gets('a_group', 'a_groupadd', 'a_groupdel')) ? '<> ' . GROUP_SPECIAL : 'NOT IN (' . GROUP_SPECIAL . ', ' . GROUP_HIDDEN . ')';
0316
0317 $sql = 'SELECT group_id, group_name, group_colour, group_desc, group_desc_uid, group_desc_bitfield, group_desc_options, group_type, group_founder_manage
0318 FROM ' . GROUPS_TABLE . '
0319 WHERE ' . ((sizeof($group_id_ary)) ? $db->sql_in_set('group_id', $group_id_ary, true) . ' AND ' : '') . "
0320 group_type $sql_and
0321 ORDER BY group_type DESC, group_name";
0322 $result = $db->sql_query($sql);
0323
0324 $nonmember_count = 0;
0325 while ($row = $db->sql_fetchrow($result))
0326 {
0327 switch ($row['group_type'])
0328 {
0329 case GROUP_OPEN:
0330 $group_status = 'OPEN';
0331 break;
0332
0333 case GROUP_CLOSED:
0334 $group_status = 'CLOSED';
0335 break;
0336
0337 case GROUP_HIDDEN:
0338 $group_status = 'HIDDEN';
0339 break;
0340
0341 case GROUP_SPECIAL:
0342 $group_status = 'SPECIAL';
0343 break;
0344
0345 case GROUP_FREE:
0346 $group_status = 'FREE';
0347 break;
0348 }
0349
0350 $template->assign_block_vars('nonmember', array(
0351 'GROUP_ID' => $row['group_id'],
0352 'GROUP_NAME' => ($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['group_name']] : $row['group_name'],
0353 'GROUP_DESC' => ($row['group_type'] <> GROUP_SPECIAL) ? generate_text_for_display($row['group_desc'], $row['group_desc_uid'], $row['group_desc_bitfield'], $row['group_desc_options']) : $user->lang['GROUP_IS_SPECIAL'],
0354 'GROUP_SPECIAL' => ($row['group_type'] <> GROUP_SPECIAL) ? false : true,
0355 'GROUP_CLOSED' => ($row['group_type'] <> GROUP_CLOSED || $auth->acl_gets('a_group', 'a_groupadd', 'a_groupdel')) ? false : true,
0356 'GROUP_STATUS' => $user->lang['GROUP_IS_' . $group_status],
0357 'S_CAN_JOIN' => ($row['group_type'] == GROUP_OPEN || $row['group_type'] == GROUP_FREE) ? true : false,
0358 'GROUP_COLOUR' => $row['group_colour'],
0359
0360 'U_VIEW_GROUP' => append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=group&g=' . $row['group_id']),
0361
0362 'S_ROW_COUNT' => $nonmember_count++)
0363 );
0364 }
0365 $db->sql_freeresult($result);
0366
0367 $template->assign_vars(array(
0368 'S_CHANGE_DEFAULT' => ($auth->acl_get('u_chggrp')) ? true : false,
0369 'S_LEADER_COUNT' => $leader_count,
0370 'S_MEMBER_COUNT' => $member_count,
0371 'S_PENDING_COUNT' => $pending_count,
0372 'S_NONMEMBER_COUNT' => $nonmember_count,
0373
0374 'S_UCP_ACTION' => $this->u_action)
0375 );
0376
0377 break;
0378
0379 case 'manage':
0380
0381 $this->page_title = 'UCP_USERGROUPS_MANAGE';
0382 $action = (isset($_POST['addusers'])) ? 'addusers' : request_var('action', '');
0383 $group_id = request_var('g', 0);
0384
0385 include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
0386
0387 add_form_key('ucp_groups');
0388
0389 if ($group_id)
0390 {
0391 $sql = 'SELECT g.*, t.teampage_position AS group_teampage
0392 FROM ' . GROUPS_TABLE . ' g
0393 LEFT JOIN ' . TEAMPAGE_TABLE . ' t
0394 ON (t.group_id = g.group_id)
0395 WHERE g.group_id = ' . $group_id;
0396 $result = $db->sql_query($sql);
0397 $group_row = $db->sql_fetchrow($result);
0398 $db->sql_freeresult($result);
0399
0400 if (!$group_row)
0401 {
0402 trigger_error($user->lang['NO_GROUP'] . $return_page);
0403 }
0404
0405 // Check if the user is allowed to manage this group if set to founder only.
0406 if ($user->data['user_type'] != USER_FOUNDER && $group_row['group_founder_manage'])
0407 {
0408 trigger_error($user->lang['NOT_ALLOWED_MANAGE_GROUP'] . $return_page, E_USER_WARNING);
0409 }
0410
0411 $group_name = $group_row['group_name'];
0412 $group_type = $group_row['group_type'];
0413
0414 $avatar = phpbb_get_group_avatar($group_row, 'GROUP_AVATAR', true);
0415
0416 $template->assign_vars(array(
0417 'GROUP_NAME' => ($group_type == GROUP_SPECIAL) ? $user->lang['G_' . $group_name] : $group_name,
0418 'GROUP_INTERNAL_NAME' => $group_name,
0419 'GROUP_COLOUR' => (isset($group_row['group_colour'])) ? $group_row['group_colour'] : '',
0420 'GROUP_DESC_DISP' => generate_text_for_display($group_row['group_desc'], $group_row['group_desc_uid'], $group_row['group_desc_bitfield'], $group_row['group_desc_options']),
0421 'GROUP_TYPE' => $group_row['group_type'],
0422
0423 'AVATAR' => (empty($avatar) ? '<img src="' . $phpbb_admin_path . 'images/no_avatar.gif" alt="" />' : $avatar),
0424 'AVATAR_IMAGE' => (empty($avatar) ? '<img src="' . $phpbb_admin_path . 'images/no_avatar.gif" alt="" />' : $avatar),
0425 'AVATAR_WIDTH' => (isset($group_row['group_avatar_width'])) ? $group_row['group_avatar_width'] : '',
0426 'AVATAR_HEIGHT' => (isset($group_row['group_avatar_height'])) ? $group_row['group_avatar_height'] : '',
0427 ));
0428 }
0429
0430 switch ($action)
0431 {
0432 case 'edit':
0433
0434 if (!$group_id)
0435 {
0436 trigger_error($user->lang['NO_GROUP'] . $return_page);
0437 }
0438
0439 if (!($row = group_memberships($group_id, $user->data['user_id'])))
0440 {
0441 trigger_error($user->lang['NOT_MEMBER_OF_GROUP'] . $return_page);
0442 }
0443 list(, $row) = each($row);
0444
0445 if (!$row['group_leader'])
0446 {
0447 trigger_error($user->lang['NOT_LEADER_OF_GROUP'] . $return_page);
0448 }
0449
0450 $file_uploads = (@ini_get('file_uploads') || strtolower(@ini_get('file_uploads')) == 'on') ? true : false;
0451 $user->add_lang(array('acp/groups', 'acp/common'));
0452
0453 $data = $submit_ary = array();
0454
0455 $update = (isset($_POST['update'])) ? true : false;
0456
0457 $error = array();
0458
0459 // Setup avatar data for later
0460 $avatars_enabled = false;
0461 $avatar_drivers = null;
0462 $avatar_data = null;
0463 $avatar_error = array();
0464
0465 if ($config['allow_avatar'])
0466 {
0467 $phpbb_avatar_manager = $phpbb_container->get('avatar.manager');
0468 $avatar_drivers = $phpbb_avatar_manager->get_enabled_drivers();
0469
0470 // This is normalised data, without the group_ prefix
0471 $avatar_data = \phpbb\avatar\manager::clean_row($group_row, 'group');
0472 }
0473
0474 // Handle deletion of avatars
0475 if ($request->is_set_post('avatar_delete'))
0476 {
0477 if (confirm_box(true))
0478 {
0479 $phpbb_avatar_manager->handle_avatar_delete($db, $user, $avatar_data, GROUPS_TABLE, 'group_');
0480 $cache->destroy('sql', GROUPS_TABLE);
0481
0482 $message = ($action == 'edit') ? 'GROUP_UPDATED' : 'GROUP_CREATED';
0483 trigger_error($user->lang[$message] . $return_page);
0484 }
0485 else
0486 {
0487 confirm_box(false, $user->lang('CONFIRM_AVATAR_DELETE'), build_hidden_fields(array(
0488 'avatar_delete' => true,
0489 'i' => $id,
0490 'mode' => $mode,
0491 'g' => $group_id,
0492 'action' => $action))
0493 );
0494 }
0495 }
0496
0497 // Did we submit?
0498 if ($update)
0499 {
0500 $group_name = utf8_normalize_nfc(request_var('group_name', '', true));
0501 $group_desc = utf8_normalize_nfc(request_var('group_desc', '', true));
0502 $group_type = request_var('group_type', GROUP_FREE);
0503
0504 $allow_desc_bbcode = request_var('desc_parse_bbcode', false);
0505 $allow_desc_urls = request_var('desc_parse_urls', false);
0506 $allow_desc_smilies = request_var('desc_parse_smilies', false);
0507
0508 $submit_ary = array(
0509 'colour' => request_var('group_colour', ''),
0510 'rank' => request_var('group_rank', 0),
0511 'receive_pm' => isset($_REQUEST['group_receive_pm']) ? 1 : 0,
0512 'message_limit' => request_var('group_message_limit', 0),
0513 'max_recipients'=> request_var('group_max_recipients', 0),
0514 'legend' => $group_row['group_legend'],
0515 'teampage' => $group_row['group_teampage'],
0516 );
0517
0518 if ($config['allow_avatar'])
0519 {
0520 // Handle avatar
0521 $driver_name = $phpbb_avatar_manager->clean_driver_name($request->variable('avatar_driver', ''));
0522 $config_name = preg_replace('#^avatar\.driver.#', '', $driver_name);
0523
0524 if (in_array($driver_name, $avatar_drivers) && !$request->is_set_post('avatar_delete'))
0525 {
0526 $driver = $phpbb_avatar_manager->get_driver($driver_name);
0527 $result = $driver->process_form($request, $template, $user, $avatar_data, $avatar_error);
0528
0529 if ($result && empty($avatar_error))
0530 {
0531 $result['avatar_type'] = $driver_name;
0532
0533 $submit_ary = array_merge($submit_ary, $result);
0534 }
0535 }
0536
0537 // Merge any avatars errors into the primary error array
0538 $error = array_merge($error, $phpbb_avatar_manager->localize_errors($user, $avatar_error));
0539 }
0540
0541 if (!check_form_key('ucp_groups'))
0542 {
0543 $error[] = $user->lang['FORM_INVALID'];
0544 }
0545
0546 // Validate submitted colour value
0547 if ($colour_error = validate_data($submit_ary, array('colour' => array('hex_colour', true))))
0548 {
0549 // Replace "error" string with its real, localised form
0550 $error = array_merge($error, $colour_error);
0551 }
0552
0553 if (!sizeof($error))
0554 {
0555 // Only set the rank, colour, etc. if it's changed or if we're adding a new
0556 // group. This prevents existing group members being updated if no changes
0557 // were made.
0558 // However there are some attributes that need to be set everytime,
0559 // otherwise the group gets removed from the feature.
0560 $set_attributes = array('legend', 'teampage');
0561
0562 $group_attributes = array();
0563 $test_variables = array(
0564 'rank' => 'int',
0565 'colour' => 'string',
0566 'avatar' => 'string',
0567 'avatar_type' => 'string',
0568 'avatar_width' => 'int',
0569 'avatar_height' => 'int',
0570 'receive_pm' => 'int',
0571 'legend' => 'int',
0572 'teampage' => 'int',
0573 'message_limit' => 'int',
0574 'max_recipients'=> 'int',
0575 );
0576
0577 foreach ($test_variables as $test => $type)
0578 {
0579 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)))
0580 {
0581 settype($submit_ary[$test], $type);
0582 $group_attributes['group_' . $test] = $group_row['group_' . $test] = $submit_ary[$test];
0583 }
0584 }
0585
0586 if (!($error = group_create($group_id, $group_type, $group_name, $group_desc, $group_attributes, $allow_desc_bbcode, $allow_desc_urls, $allow_desc_smilies)))
0587 {
0588 $cache->destroy('sql', GROUPS_TABLE);
0589 $cache->destroy('sql', TEAMPAGE_TABLE);
0590
0591 $message = ($action == 'edit') ? 'GROUP_UPDATED' : 'GROUP_CREATED';
0592 trigger_error($user->lang[$message] . $return_page);
0593 }
0594 }
0595
0596 if (sizeof($error))
0597 {
0598 $error = array_map(array(&$user, 'lang'), $error);
0599 $group_rank = $submit_ary['rank'];
0600
0601 $group_desc_data = array(
0602 'text' => $group_desc,
0603 'allow_bbcode' => $allow_desc_bbcode,
0604 'allow_smilies' => $allow_desc_smilies,
0605 'allow_urls' => $allow_desc_urls
0606 );
0607 }
0608 }
0609 else if (!$group_id)
0610 {
0611 $group_name = utf8_normalize_nfc(request_var('group_name', '', true));
0612 $group_desc_data = array(
0613 'text' => '',
0614 'allow_bbcode' => true,
0615 'allow_smilies' => true,
0616 'allow_urls' => true
0617 );
0618 $group_rank = 0;
0619 $group_type = GROUP_OPEN;
0620 }
0621 else
0622 {
0623 $group_desc_data = generate_text_for_edit($group_row['group_desc'], $group_row['group_desc_uid'], $group_row['group_desc_options']);
0624 $group_rank = $group_row['group_rank'];
0625 }
0626
0627 $sql = 'SELECT *
0628 FROM ' . RANKS_TABLE . '
0629 WHERE rank_special = 1
0630 ORDER BY rank_title';
0631 $result = $db->sql_query($sql);
0632
0633 $rank_options = '<option value="0"' . ((!$group_rank) ? ' selected="selected"' : '') . '>' . $user->lang['USER_DEFAULT'] . '</option>';
0634 while ($row = $db->sql_fetchrow($result))
0635 {
0636 $selected = ($group_rank && $row['rank_id'] == $group_rank) ? ' selected="selected"' : '';
0637 $rank_options .= '<option value="' . $row['rank_id'] . '"' . $selected . '>' . $row['rank_title'] . '</option>';
0638 }
0639 $db->sql_freeresult($result);
0640
0641 $type_free = ($group_type == GROUP_FREE) ? ' checked="checked"' : '';
0642 $type_open = ($group_type == GROUP_OPEN) ? ' checked="checked"' : '';
0643 $type_closed = ($group_type == GROUP_CLOSED) ? ' checked="checked"' : '';
0644 $type_hidden = ($group_type == GROUP_HIDDEN) ? ' checked="checked"' : '';
0645
0646 // Load up stuff for avatars
0647 if ($config['allow_avatar'])
0648 {
0649 $avatars_enabled = false;
0650 $selected_driver = $phpbb_avatar_manager->clean_driver_name($request->variable('avatar_driver', $avatar_data['avatar_type']));
0651
0652 foreach ($avatar_drivers as $current_driver)
0653 {
0654 $driver = $phpbb_avatar_manager->get_driver($current_driver);
0655
0656 $avatars_enabled = true;
0657 $template->set_filenames(array(
0658 'avatar' => $driver->get_template_name(),
0659 ));
0660
0661 if ($driver->prepare_form($request, $template, $user, $avatar_data, $avatar_error))
0662 {
0663 $driver_name = $phpbb_avatar_manager->prepare_driver_name($current_driver);
0664 $driver_upper = strtoupper($driver_name);
0665 $template->assign_block_vars('avatar_drivers', array(
0666 'L_TITLE' => $user->lang($driver_upper . '_TITLE'),
0667 'L_EXPLAIN' => $user->lang($driver_upper . '_EXPLAIN'),
0668
0669 'DRIVER' => $driver_name,
0670 'SELECTED' => $current_driver == $selected_driver,
0671 'OUTPUT' => $template->assign_display('avatar'),
0672 ));
0673 }
0674 }
0675 }
0676
0677 if (isset($phpbb_avatar_manager) && !$update)
0678 {
0679 // Merge any avatars errors into the primary error array
0680 $error = array_merge($error, $phpbb_avatar_manager->localize_errors($user, $avatar_error));
0681 }
0682
0683 $template->assign_vars(array(
0684 'S_EDIT' => true,
0685 'S_INCLUDE_SWATCH' => true,
0686 'S_FORM_ENCTYPE' => ' enctype="multipart/form-data"',
0687 'S_ERROR' => (sizeof($error)) ? true : false,
0688 'S_SPECIAL_GROUP' => ($group_type == GROUP_SPECIAL) ? true : false,
0689 'S_AVATARS_ENABLED' => ($config['allow_avatar'] && $avatars_enabled),
0690 'S_GROUP_MANAGE' => true,
0691
0692 'ERROR_MSG' => (sizeof($error)) ? implode('<br />', $error) : '',
0693 'GROUP_RECEIVE_PM' => (isset($group_row['group_receive_pm']) && $group_row['group_receive_pm']) ? ' checked="checked"' : '',
0694 'GROUP_MESSAGE_LIMIT' => (isset($group_row['group_message_limit'])) ? $group_row['group_message_limit'] : 0,
0695 'GROUP_MAX_RECIPIENTS' => (isset($group_row['group_max_recipients'])) ? $group_row['group_max_recipients'] : 0,
0696
0697 'GROUP_DESC' => $group_desc_data['text'],
0698 'S_DESC_BBCODE_CHECKED' => $group_desc_data['allow_bbcode'],
0699 'S_DESC_URLS_CHECKED' => $group_desc_data['allow_urls'],
0700 'S_DESC_SMILIES_CHECKED'=> $group_desc_data['allow_smilies'],
0701
0702 'S_RANK_OPTIONS' => $rank_options,
0703
0704 'GROUP_TYPE_FREE' => GROUP_FREE,
0705 'GROUP_TYPE_OPEN' => GROUP_OPEN,
0706 'GROUP_TYPE_CLOSED' => GROUP_CLOSED,
0707 'GROUP_TYPE_HIDDEN' => GROUP_HIDDEN,
0708 'GROUP_TYPE_SPECIAL' => GROUP_SPECIAL,
0709
0710 'GROUP_FREE' => $type_free,
0711 'GROUP_OPEN' => $type_open,
0712 'GROUP_CLOSED' => $type_closed,
0713 'GROUP_HIDDEN' => $type_hidden,
0714
0715 'S_UCP_ACTION' => $this->u_action . "&action=$action&g=$group_id",
0716 'L_AVATAR_EXPLAIN' => phpbb_avatar_explanation_string(),
0717 ));
0718
0719 break;
0720
0721 case 'list':
0722
0723 if (!$group_id)
0724 {
0725 trigger_error($user->lang['NO_GROUP'] . $return_page);
0726 }
0727
0728 if (!($row = group_memberships($group_id, $user->data['user_id'])))
0729 {
0730 trigger_error($user->lang['NOT_MEMBER_OF_GROUP'] . $return_page);
0731 }
0732 list(, $row) = each($row);
0733
0734 if (!$row['group_leader'])
0735 {
0736 trigger_error($user->lang['NOT_LEADER_OF_GROUP'] . $return_page);
0737 }
0738
0739 $user->add_lang(array('acp/groups', 'acp/common'));
0740 $start = request_var('start', 0);
0741
0742 // Grab the leaders - always, on every page...
0743 $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
0744 FROM ' . USERS_TABLE . ' u, ' . USER_GROUP_TABLE . " ug
0745 WHERE ug.group_id = $group_id
0746 AND u.user_id = ug.user_id
0747 AND ug.group_leader = 1
0748 ORDER BY ug.user_pending DESC, u.username_clean";
0749 $result = $db->sql_query($sql);
0750
0751 while ($row = $db->sql_fetchrow($result))
0752 {
0753 $template->assign_block_vars('leader', array(
0754 'USERNAME' => $row['username'],
0755 'USERNAME_COLOUR' => $row['user_colour'],
0756 'USERNAME_FULL' => get_username_string('full', $row['user_id'], $row['username'], $row['user_colour']),
0757 'U_USER_VIEW' => get_username_string('profile', $row['user_id'], $row['username']),
0758 'S_GROUP_DEFAULT' => ($row['group_id'] == $group_id) ? true : false,
0759 'JOINED' => ($row['user_regdate']) ? $user->format_date($row['user_regdate']) : ' - ',
0760 'USER_POSTS' => $row['user_posts'],
0761 'USER_ID' => $row['user_id'])
0762 );
0763 }
0764 $db->sql_freeresult($result);
0765
0766 // Total number of group members (non-leaders)
0767 $sql = 'SELECT COUNT(user_id) AS total_members
0768 FROM ' . USER_GROUP_TABLE . "
0769 WHERE group_id = $group_id
0770 AND group_leader = 0";
0771 $result = $db->sql_query($sql);
0772 $total_members = (int) $db->sql_fetchfield('total_members');
0773 $db->sql_freeresult($result);
0774
0775 // Grab the members
0776 $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
0777 FROM ' . USERS_TABLE . ' u, ' . USER_GROUP_TABLE . " ug
0778 WHERE ug.group_id = $group_id
0779 AND u.user_id = ug.user_id
0780 AND ug.group_leader = 0
0781 ORDER BY ug.user_pending DESC, u.username_clean";
0782 $result = $db->sql_query_limit($sql, $config['topics_per_page'], $start);
0783
0784 $pending = false;
0785 $approved = false;
0786
0787 while ($row = $db->sql_fetchrow($result))
0788 {
0789 if ($row['user_pending'] && !$pending)
0790 {
0791 $template->assign_block_vars('member', array(
0792 'S_PENDING' => true)
0793 );
0794 $template->assign_var('S_PENDING_SET', true);
0795
0796 $pending = true;
0797 }
0798 else if (!$row['user_pending'] && !$approved)
0799 {
0800 $template->assign_block_vars('member', array(
0801 'S_APPROVED' => true)
0802 );
0803 $template->assign_var('S_APPROVED_SET', true);
0804
0805 $approved = true;
0806 }
0807
0808 $template->assign_block_vars('member', array(
0809 'USERNAME' => $row['username'],
0810 'USERNAME_COLOUR' => $row['user_colour'],
0811 'USERNAME_FULL' => get_username_string('full', $row['user_id'], $row['username'], $row['user_colour']),
0812 'U_USER_VIEW' => get_username_string('profile', $row['user_id'], $row['username']),
0813 'S_GROUP_DEFAULT' => ($row['group_id'] == $group_id) ? true : false,
0814 'JOINED' => ($row['user_regdate']) ? $user->format_date($row['user_regdate']) : ' - ',
0815 'USER_POSTS' => $row['user_posts'],
0816 'USER_ID' => $row['user_id'])
0817 );
0818 }
0819 $db->sql_freeresult($result);
0820
0821 $s_action_options = '';
0822 $options = array('default' => 'DEFAULT', 'approve' => 'APPROVE', 'deleteusers' => 'DELETE');
0823
0824 foreach ($options as $option => $lang)
0825 {
0826 $s_action_options .= '<option value="' . $option . '">' . $user->lang['GROUP_' . $lang] . '</option>';
0827 }
0828
0829 $pagination = $phpbb_container->get('pagination');
0830 $base_url = $this->u_action . "&action=$action&g=$group_id";
0831 $start = $pagination->validate_start($start, $config['topics_per_page'], $total_members);
0832 $pagination->generate_template_pagination($base_url, 'pagination', 'start', $total_members, $config['topics_per_page'], $start);
0833
0834 $template->assign_vars(array(
0835 'S_LIST' => true,
0836 'S_ACTION_OPTIONS' => $s_action_options,
0837
0838 'U_ACTION' => $this->u_action . "&g=$group_id",
0839 'S_UCP_ACTION' => $this->u_action . "&g=$group_id",
0840 'U_FIND_USERNAME' => append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=searchuser&form=ucp&field=usernames'),
0841 ));
0842
0843 break;
0844
0845 case 'approve':
0846
0847 if (!$group_id)
0848 {
0849 trigger_error($user->lang['NO_GROUP'] . $return_page);
0850 }
0851
0852 if (!($row = group_memberships($group_id, $user->data['user_id'])))
0853 {
0854 trigger_error($user->lang['NOT_MEMBER_OF_GROUP'] . $return_page);
0855 }
0856 list(, $row) = each($row);
0857
0858 if (!$row['group_leader'])
0859 {
0860 trigger_error($user->lang['NOT_LEADER_OF_GROUP'] . $return_page);
0861 }
0862
0863 $user->add_lang('acp/groups');
0864
0865 // Approve, demote or promote
0866 group_user_attributes('approve', $group_id, $mark_ary, false, false);
0867
0868 trigger_error($user->lang['USERS_APPROVED'] . '<br /><br />' . sprintf($user->lang['RETURN_PAGE'], '<a href="' . $this->u_action . '&action=list&g=' . $group_id . '">', '</a>'));
0869
0870 break;
0871
0872 case 'default':
0873
0874 if (!$group_id)
0875 {
0876 trigger_error($user->lang['NO_GROUP'] . $return_page);
0877 }
0878
0879 if (!($row = group_memberships($group_id, $user->data['user_id'])))
0880 {
0881 trigger_error($user->lang['NOT_MEMBER_OF_GROUP'] . $return_page);
0882 }
0883 list(, $row) = each($row);
0884
0885 if (!$row['group_leader'])
0886 {
0887 trigger_error($user->lang['NOT_LEADER_OF_GROUP'] . $return_page);
0888 }
0889
0890 $group_row['group_name'] = ($group_row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $group_row['group_name']] : $group_row['group_name'];
0891
0892 if (confirm_box(true))
0893 {
0894 if (!sizeof($mark_ary))
0895 {
0896 $start = 0;
0897
0898 do
0899 {
0900 $sql = 'SELECT user_id
0901 FROM ' . USER_GROUP_TABLE . "
0902 WHERE group_id = $group_id
0903 ORDER BY user_id";
0904 $result = $db->sql_query_limit($sql, 200, $start);
0905
0906 $mark_ary = array();
0907 if ($row = $db->sql_fetchrow($result))
0908 {
0909 do
0910 {
0911 $mark_ary[] = $row['user_id'];
0912 }
0913 while ($row = $db->sql_fetchrow($result));
0914
0915 group_user_attributes('default', $group_id, $mark_ary, false, $group_row['group_name'], $group_row);
0916
0917 $start = (sizeof($mark_ary) < 200) ? 0 : $start + 200;
0918 }
0919 else
0920 {
0921 $start = 0;
0922 }
0923 $db->sql_freeresult($result);
0924 }
0925 while ($start);
0926 }
0927 else
0928 {
0929 group_user_attributes('default', $group_id, $mark_ary, false, $group_row['group_name'], $group_row);
0930 }
0931
0932 $user->add_lang('acp/groups');
0933
0934 trigger_error($user->lang['GROUP_DEFS_UPDATED'] . '<br /><br />' . sprintf($user->lang['RETURN_PAGE'], '<a href="' . $this->u_action . '&action=list&g=' . $group_id . '">', '</a>'));
0935 }
0936 else
0937 {
0938 $user->add_lang('acp/common');
0939
0940 confirm_box(false, $user->lang['CONFIRM_OPERATION'], build_hidden_fields(array(
0941 'mark' => $mark_ary,
0942 'g' => $group_id,
0943 'i' => $id,
0944 'mode' => $mode,
0945 'action' => $action))
0946 );
0947 }
0948
0949 // redirect to last screen
0950 redirect($this->u_action . '&action=list&g=' . $group_id);
0951
0952 break;
0953
0954 case 'deleteusers':
0955
0956 $user->add_lang(array('acp/groups', 'acp/common'));
0957
0958 if (!($row = group_memberships($group_id, $user->data['user_id'])))
0959 {
0960 trigger_error($user->lang['NOT_MEMBER_OF_GROUP'] . $return_page);
0961 }
0962 list(, $row) = each($row);
0963
0964 if (!$row['group_leader'])
0965 {
0966 trigger_error($user->lang['NOT_LEADER_OF_GROUP'] . $return_page);
0967 }
0968
0969 $group_row['group_name'] = ($group_row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $group_row['group_name']] : $group_row['group_name'];
0970
0971 if (confirm_box(true))
0972 {
0973 if (!$group_id)
0974 {
0975 trigger_error($user->lang['NO_GROUP'] . $return_page);
0976 }
0977
0978 $error = group_user_del($group_id, $mark_ary, false, $group_row['group_name']);
0979
0980 if ($error)
0981 {
0982 trigger_error($user->lang[$error] . '<br /><br />' . sprintf($user->lang['RETURN_PAGE'], '<a href="' . $this->u_action . '&action=list&g=' . $group_id . '">', '</a>'));
0983 }
0984
0985 trigger_error($user->lang['GROUP_USERS_REMOVE'] . '<br /><br />' . sprintf($user->lang['RETURN_PAGE'], '<a href="' . $this->u_action . '&action=list&g=' . $group_id . '">', '</a>'));
0986 }
0987 else
0988 {
0989 confirm_box(false, $user->lang['CONFIRM_OPERATION'], build_hidden_fields(array(
0990 'mark' => $mark_ary,
0991 'g' => $group_id,
0992 'i' => $id,
0993 'mode' => $mode,
0994 'action' => $action))
0995 );
0996 }
0997
0998 // redirect to last screen
0999 redirect($this->u_action . '&action=list&g=' . $group_id);
1000
1001 break;
1002
1003 case 'addusers':
1004
1005 $user->add_lang(array('acp/groups', 'acp/common'));
1006
1007 $names = utf8_normalize_nfc(request_var('usernames', '', true));
1008
1009 if (!$group_id)
1010 {
1011 trigger_error($user->lang['NO_GROUP'] . $return_page);
1012 }
1013
1014 if (!$names)
1015 {
1016 trigger_error($user->lang['NO_USERS'] . $return_page);
1017 }
1018
1019 if (!($row = group_memberships($group_id, $user->data['user_id'])))
1020 {
1021 trigger_error($user->lang['NOT_MEMBER_OF_GROUP'] . $return_page);
1022 }
1023 list(, $row) = each($row);
1024
1025 if (!$row['group_leader'])
1026 {
1027 trigger_error($user->lang['NOT_LEADER_OF_GROUP'] . $return_page);
1028 }
1029
1030 $name_ary = array_unique(explode("\n", $names));
1031 $group_name = ($group_row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $group_row['group_name']] : $group_row['group_name'];
1032
1033 $default = request_var('default', 0);
1034
1035 if (confirm_box(true))
1036 {
1037 // Add user/s to group
1038 if ($error = group_user_add($group_id, false, $name_ary, $group_name, $default, 0, 0, $group_row))
1039 {
1040 trigger_error($user->lang[$error] . $return_page);
1041 }
1042
1043 trigger_error($user->lang['GROUP_USERS_ADDED'] . '<br /><br />' . sprintf($user->lang['RETURN_PAGE'], '<a href="' . $this->u_action . '&action=list&g=' . $group_id . '">', '</a>'));
1044 }
1045 else
1046 {
1047 $s_hidden_fields = array(
1048 'default' => $default,
1049 'usernames' => $names,
1050 'g' => $group_id,
1051 'i' => $id,
1052 'mode' => $mode,
1053 'action' => $action
1054 );
1055
1056 confirm_box(false, $user->lang('GROUP_CONFIRM_ADD_USERS', sizeof($name_ary), implode($user->lang['COMMA_SEPARATOR'], $name_ary)), build_hidden_fields($s_hidden_fields));
1057 }
1058
1059 trigger_error($user->lang['NO_USERS_ADDED'] . '<br /><br />' . sprintf($user->lang['RETURN_PAGE'], '<a href="' . $this->u_action . '&action=list&g=' . $group_id . '">', '</a>'));
1060
1061 break;
1062
1063 default:
1064 $user->add_lang('acp/common');
1065
1066 $sql = 'SELECT g.group_id, g.group_name, g.group_colour, g.group_desc, g.group_desc_uid, g.group_desc_bitfield, g.group_desc_options, g.group_type, ug.group_leader
1067 FROM ' . GROUPS_TABLE . ' g, ' . USER_GROUP_TABLE . ' ug
1068 WHERE ug.user_id = ' . $user->data['user_id'] . '
1069 AND g.group_id = ug.group_id
1070 AND ug.group_leader = 1
1071 ORDER BY g.group_type DESC, g.group_name';
1072 $result = $db->sql_query($sql);
1073
1074 while ($value = $db->sql_fetchrow($result))
1075 {
1076 $template->assign_block_vars('leader', array(
1077 'GROUP_NAME' => ($value['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $value['group_name']] : $value['group_name'],
1078 'GROUP_DESC' => generate_text_for_display($value['group_desc'], $value['group_desc_uid'], $value['group_desc_bitfield'], $value['group_desc_options']),
1079 'GROUP_TYPE' => $value['group_type'],
1080 'GROUP_ID' => $value['group_id'],
1081 'GROUP_COLOUR' => $value['group_colour'],
1082
1083 'U_LIST' => $this->u_action . "&action=list&g={$value['group_id']}",
1084 'U_EDIT' => $this->u_action . "&action=edit&g={$value['group_id']}")
1085 );
1086 }
1087 $db->sql_freeresult($result);
1088
1089 break;
1090 }
1091
1092 break;
1093 }
1094
1095 $this->tpl_name = 'ucp_groups_' . $mode;
1096 }
1097 }
1098