Refactored memberlist.php 🎓 (#1181)

* Refactored memberlist.php 🎓

* Update memberlist.php
This commit is contained in:
Roman Kelesidis 2023-12-01 17:36:53 +07:00 committed by GitHub
commit 926f57c048
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 17 additions and 102 deletions

View file

@ -1309,10 +1309,6 @@ $lang['COOKIES_REQUIRED'] = 'Cookies must be enabled!';
$lang['SESSION_EXPIRED'] = 'Session expired';
// Sort memberlist per letter
$lang['SORT_PER_LETTER'] = 'Show only usernames starting with';
$lang['OTHERS'] = 'others';
$lang['ALL'] = 'all';
$lang['POST_LINK'] = 'Post link';
$lang['GOTO_QUOTED_POST'] = 'Go to the quoted post';
$lang['LAST_VISITED'] = 'Last Visited';
@ -2599,6 +2595,8 @@ $lang['RELEASE_WELCOME'] = 'Please fill in the release form';
$lang['NEW_RELEASE'] = 'New release';
$lang['NEXT'] = 'Continue';
$lang['OTHER'] = 'Other';
$lang['OTHERS'] = 'Others';
$lang['ALL'] = 'All';
$lang['TPL_EMPTY_FIELD'] = 'You must fill the field <b>%s</b>';
$lang['TPL_EMPTY_SEL'] = 'You must select <b>%s</b>';

View file

@ -19,43 +19,19 @@ $start = abs((int)request_var('start', 0));
$mode = (string)request_var('mode', 'joined');
$sort_order = (request_var('order', 'ASC') == 'ASC') ? 'ASC' : 'DESC';
$username = request_var('username', '');
$paginationusername = $username;
//
// Memberlist sorting
//
$mode_types_text = [
$lang['SORT_JOINED'],
$lang['SORT_USERNAME'],
$lang['SORT_LOCATION'],
$lang['SORT_POSTS'],
$lang['SORT_EMAIL'],
$lang['SORT_WEBSITE'],
$lang['SORT_TOP_TEN']
];
$mode_types_text = [$lang['SORT_JOINED'], $lang['SORT_USERNAME'], $lang['SORT_LOCATION'], $lang['SORT_POSTS'], $lang['SORT_EMAIL'], $lang['SORT_WEBSITE'], $lang['SORT_TOP_TEN']];
$mode_types = ['joined', 'username', 'location', 'posts', 'email', 'website', 'topten'];
$mode_types = [
'joined',
'username',
'location',
'posts',
'email',
'website',
'topten'
];
// <select> mode
$select_sort_mode = '<select name="mode">';
for ($i = 0, $iMax = count($mode_types_text); $i < $iMax; $i++) {
$selected = ($mode == $mode_types[$i]) ? ' selected' : '';
$select_sort_mode .= '<option value="' . $mode_types[$i] . '"' . $selected . '>' . $mode_types_text[$i] . '</option>';
}
$select_sort_mode .= '</select>';
// <select> order
$select_sort_order = '<select name="order">';
if ($sort_order == 'ASC') {
$select_sort_order .= '<option value="ASC" selected>' . $lang['ASC'] . '</option><option value="DESC">' . $lang['DESC'] . '</option>';
} else {
@ -64,9 +40,6 @@ if ($sort_order == 'ASC') {
$select_sort_order .= '</select>';
switch ($mode) {
case 'joined':
$order_by = "user_id $sort_order LIMIT $start, " . $bb_cfg['topics_per_page'];
break;
case 'username':
$order_by = "username $sort_order LIMIT $start, " . $bb_cfg['topics_per_page'];
break;
@ -85,59 +58,14 @@ switch ($mode) {
case 'topten':
$order_by = "user_posts $sort_order LIMIT 10";
break;
case 'joined':
default:
$order_by = "user_regdate $sort_order LIMIT $start, " . $bb_cfg['topics_per_page'];
$mode = 'joined';
break;
}
// per-letter selection
$by_letter = 'all';
$letters_range = 'a-z';
$letters_range .= iconv('windows-1251', 'UTF-8', chr(224));
$letters_range .= '-';
$letters_range .= iconv('windows-1251', 'UTF-8', chr(255));
$select_letter = $letter_sql = '';
$by_letter_req = isset($_REQUEST['letter']) ? strtolower(trim($_REQUEST['letter'])) : false;
if ($by_letter_req) {
if ($by_letter_req === 'all') {
$by_letter = 'all';
$letter_sql = '';
} elseif ($by_letter_req === 'others') {
$by_letter = 'others';
$letter_sql = "username REGEXP '^[!-@\\[-`].*$'";
} elseif ($letter_req = preg_replace("#[^$letters_range]#ui", '', iconv('windows-1251', 'UTF-8', $by_letter_req))) {
$by_letter = DB()->escape($letter_req);
$letter_sql = "LOWER(username) LIKE '$by_letter%'";
}
}
// ENG
for ($i = ord('A'), $cnt = ord('Z'); $i <= $cnt; $i++) {
$select_letter .= (strtoupper($by_letter) == chr($i)) ? '<b>' . chr($i) . '</b>&nbsp;' : '<a class="genmed" href="' . ("memberlist.php?letter=" . chr($i) . "&amp;mode=$mode&amp;order=$sort_order") . '">' . chr($i) . '</a>&nbsp;';
}
// RUS
$select_letter .= ': ';
for ($i = 224, $cnt = 255; $i <= $cnt; $i++) {
$select_letter .= (strtoupper($by_letter) == iconv('windows-1251', 'UTF-8', chr($i))) ? '<b>' . iconv('windows-1251', 'UTF-8', chr($i - 32)) . '</b>&nbsp;' : '<a class="genmed" href="' . ("memberlist.php?letter=%" . strtoupper(base_convert($i, 10, 16)) . "&amp;mode=$mode&amp;order=$sort_order") . '">' . iconv('windows-1251', 'UTF-8', chr($i - 32)) . '</a>&nbsp;';
}
$select_letter .= ':&nbsp;';
$select_letter .= ($by_letter == 'others') ? '<b>' . $lang['OTHERS'] . '</b>&nbsp;' : '<a class="genmed" href="' . ("memberlist.php?letter=others&amp;mode=$mode&amp;order=$sort_order") . '">' . $lang['OTHERS'] . '</a>&nbsp;';
$select_letter .= ':&nbsp;';
$select_letter .= ($by_letter == 'all') ? '<b>' . $lang['ALL'] . '</b>' : '<a class="genmed" href="' . ("memberlist.php?letter=all&amp;mode=$mode&amp;order=$sort_order") . '">' . $lang['ALL'] . '</a>';
// per-letter selection end
$sql = "SELECT username, user_id, user_rank, user_opt, user_posts, user_regdate, user_from, user_website, user_email, avatar_ext_id FROM " . BB_USERS . " WHERE user_id NOT IN(" . EXCLUDED_USERS . ")";
if ($username) {
$username = str_replace("\*", '%', clean_username($username));
$letter_sql = "username LIKE '" . DB()->escape($username) . "'";
}
$sql .= ($letter_sql) ? " AND $letter_sql" : '';
$sql .= " ORDER BY $order_by";
// Generate user information
$sql = "SELECT username, user_id, user_rank, user_opt, user_posts, user_regdate, user_from, user_website, user_email, avatar_ext_id FROM " . BB_USERS . " WHERE user_id NOT IN(" . EXCLUDED_USERS . ") ORDER BY $order_by";
if ($result = DB()->fetch_rowset($sql)) {
foreach ($result as $i => $row) {
$user_id = $row['user_id'];
@ -163,13 +91,12 @@ if ($result = DB()->fetch_rowset($sql)) {
$template->assign_block_vars('no_username', ['NO_USER_ID_SPECIFIED' => $lang['NO_USER_ID_SPECIFIED']]);
}
$paginationurl = "memberlist.php?letter=$by_letter&amp;mode=$mode&amp;order=$sort_order";
if ($paginationusername) {
$paginationurl .= "&amp;username=$paginationusername";
}
// Pagination
$paginationurl = "memberlist.php?mode=$mode&amp;order=$sort_order";
$paginationurl .= $username ? "&amp;username=$username" : '';
if ($mode != 'topten' || $bb_cfg['topics_per_page'] < 10) {
$sql = "SELECT COUNT(*) AS total FROM " . BB_USERS;
$sql .= ($letter_sql) ? " WHERE $letter_sql" : " WHERE user_id NOT IN(" . EXCLUDED_USERS . ")";
$sql = "SELECT COUNT(*) AS total FROM " . BB_USERS . " WHERE user_id NOT IN(" . EXCLUDED_USERS . ")";
if (!$result = DB()->sql_query($sql)) {
bb_die('Error getting total users');
}
@ -180,20 +107,13 @@ if ($mode != 'topten' || $bb_cfg['topics_per_page'] < 10) {
DB()->sql_freeresult($result);
}
//
// Generate page
//
$template->assign_vars([
'S_MODE_SELECT' => $select_sort_mode,
'S_ORDER_SELECT' => $select_sort_order,
'S_MODE_ACTION' => "memberlist.php?letter=$by_letter&amp;mode=$mode&amp;order=$sort_order",
'S_USERNAME' => $paginationusername,
]);
// Generate output
$template->assign_vars([
'PAGE_TITLE' => $lang['MEMBERLIST'],
'S_LETTER_SELECT' => $select_letter,
'S_LETTER_HIDDEN' => '<input type="hidden" name="letter" value="' . $by_letter . '">'
'S_MODE_SELECT' => $select_sort_mode,
'S_ORDER_SELECT' => $select_sort_order,
'S_MODE_ACTION' => "memberlist.php?mode=$mode&amp;order=$sort_order",
'S_USERNAME' => $username,
]);
print_page('memberlist.tpl');

View file

@ -12,9 +12,6 @@
</span>
</td>
</tr>
<tr>
<td align="right" class="med">{L_SORT_PER_LETTER}:&nbsp;{S_LETTER_SELECT}{S_LETTER_HIDDEN}</td>
</tr>
</table>
</form>