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'; $lang['SESSION_EXPIRED'] = 'Session expired';
// Sort memberlist per letter // 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['POST_LINK'] = 'Post link';
$lang['GOTO_QUOTED_POST'] = 'Go to the quoted post'; $lang['GOTO_QUOTED_POST'] = 'Go to the quoted post';
$lang['LAST_VISITED'] = 'Last Visited'; $lang['LAST_VISITED'] = 'Last Visited';
@ -2599,6 +2595,8 @@ $lang['RELEASE_WELCOME'] = 'Please fill in the release form';
$lang['NEW_RELEASE'] = 'New release'; $lang['NEW_RELEASE'] = 'New release';
$lang['NEXT'] = 'Continue'; $lang['NEXT'] = 'Continue';
$lang['OTHER'] = 'Other'; $lang['OTHER'] = 'Other';
$lang['OTHERS'] = 'Others';
$lang['ALL'] = 'All';
$lang['TPL_EMPTY_FIELD'] = 'You must fill the field <b>%s</b>'; $lang['TPL_EMPTY_FIELD'] = 'You must fill the field <b>%s</b>';
$lang['TPL_EMPTY_SEL'] = 'You must select <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'); $mode = (string)request_var('mode', 'joined');
$sort_order = (request_var('order', 'ASC') == 'ASC') ? 'ASC' : 'DESC'; $sort_order = (request_var('order', 'ASC') == 'ASC') ? 'ASC' : 'DESC';
$username = request_var('username', ''); $username = request_var('username', '');
$paginationusername = $username;
//
// Memberlist sorting // 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 = [ $mode_types = ['joined', 'username', 'location', 'posts', 'email', 'website', 'topten'];
$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'
];
// <select> mode
$select_sort_mode = '<select name="mode">'; $select_sort_mode = '<select name="mode">';
for ($i = 0, $iMax = count($mode_types_text); $i < $iMax; $i++) { for ($i = 0, $iMax = count($mode_types_text); $i < $iMax; $i++) {
$selected = ($mode == $mode_types[$i]) ? ' selected' : ''; $selected = ($mode == $mode_types[$i]) ? ' selected' : '';
$select_sort_mode .= '<option value="' . $mode_types[$i] . '"' . $selected . '>' . $mode_types_text[$i] . '</option>'; $select_sort_mode .= '<option value="' . $mode_types[$i] . '"' . $selected . '>' . $mode_types_text[$i] . '</option>';
} }
$select_sort_mode .= '</select>'; $select_sort_mode .= '</select>';
// <select> order
$select_sort_order = '<select name="order">'; $select_sort_order = '<select name="order">';
if ($sort_order == 'ASC') { if ($sort_order == 'ASC') {
$select_sort_order .= '<option value="ASC" selected>' . $lang['ASC'] . '</option><option value="DESC">' . $lang['DESC'] . '</option>'; $select_sort_order .= '<option value="ASC" selected>' . $lang['ASC'] . '</option><option value="DESC">' . $lang['DESC'] . '</option>';
} else { } else {
@ -64,9 +40,6 @@ if ($sort_order == 'ASC') {
$select_sort_order .= '</select>'; $select_sort_order .= '</select>';
switch ($mode) { switch ($mode) {
case 'joined':
$order_by = "user_id $sort_order LIMIT $start, " . $bb_cfg['topics_per_page'];
break;
case 'username': case 'username':
$order_by = "username $sort_order LIMIT $start, " . $bb_cfg['topics_per_page']; $order_by = "username $sort_order LIMIT $start, " . $bb_cfg['topics_per_page'];
break; break;
@ -85,59 +58,14 @@ switch ($mode) {
case 'topten': case 'topten':
$order_by = "user_posts $sort_order LIMIT 10"; $order_by = "user_posts $sort_order LIMIT 10";
break; break;
case 'joined':
default: default:
$order_by = "user_regdate $sort_order LIMIT $start, " . $bb_cfg['topics_per_page']; $order_by = "user_regdate $sort_order LIMIT $start, " . $bb_cfg['topics_per_page'];
$mode = 'joined';
break; break;
} }
// per-letter selection // Generate user information
$by_letter = 'all'; $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";
$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";
if ($result = DB()->fetch_rowset($sql)) { if ($result = DB()->fetch_rowset($sql)) {
foreach ($result as $i => $row) { foreach ($result as $i => $row) {
$user_id = $row['user_id']; $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']]); $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"; // Pagination
if ($paginationusername) { $paginationurl = "memberlist.php?mode=$mode&amp;order=$sort_order";
$paginationurl .= "&amp;username=$paginationusername"; $paginationurl .= $username ? "&amp;username=$username" : '';
}
if ($mode != 'topten' || $bb_cfg['topics_per_page'] < 10) { if ($mode != 'topten' || $bb_cfg['topics_per_page'] < 10) {
$sql = "SELECT COUNT(*) AS total FROM " . BB_USERS; $sql = "SELECT COUNT(*) AS total FROM " . BB_USERS . " WHERE user_id NOT IN(" . EXCLUDED_USERS . ")";
$sql .= ($letter_sql) ? " WHERE $letter_sql" : " WHERE user_id NOT IN(" . EXCLUDED_USERS . ")";
if (!$result = DB()->sql_query($sql)) { if (!$result = DB()->sql_query($sql)) {
bb_die('Error getting total users'); bb_die('Error getting total users');
} }
@ -180,20 +107,13 @@ if ($mode != 'topten' || $bb_cfg['topics_per_page'] < 10) {
DB()->sql_freeresult($result); DB()->sql_freeresult($result);
} }
// // Generate output
// 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,
]);
$template->assign_vars([ $template->assign_vars([
'PAGE_TITLE' => $lang['MEMBERLIST'], 'PAGE_TITLE' => $lang['MEMBERLIST'],
'S_LETTER_SELECT' => $select_letter, 'S_MODE_SELECT' => $select_sort_mode,
'S_LETTER_HIDDEN' => '<input type="hidden" name="letter" value="' . $by_letter . '">' 'S_ORDER_SELECT' => $select_sort_order,
'S_MODE_ACTION' => "memberlist.php?mode=$mode&amp;order=$sort_order",
'S_USERNAME' => $username,
]); ]);
print_page('memberlist.tpl'); print_page('memberlist.tpl');

View file

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