Mercurial > hg > vamp-website
comparison forum/Sources/Memberlist.php @ 76:e3e11437ecea website
Add forum code
author | Chris Cannam |
---|---|
date | Sun, 07 Jul 2013 11:25:48 +0200 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
75:72f59aa7e503 | 76:e3e11437ecea |
---|---|
1 <?php | |
2 | |
3 /** | |
4 * Simple Machines Forum (SMF) | |
5 * | |
6 * @package SMF | |
7 * @author Simple Machines http://www.simplemachines.org | |
8 * @copyright 2011 Simple Machines | |
9 * @license http://www.simplemachines.org/about/smf/license.php BSD | |
10 * | |
11 * @version 2.0.2 | |
12 */ | |
13 | |
14 if (!defined('SMF')) | |
15 die('Hacking attempt...'); | |
16 | |
17 /* This file contains the functions for displaying and searching in the | |
18 members list. It does so with these functions: | |
19 | |
20 void MemberList() | |
21 - shows a list of registered members. | |
22 - if a subaction is not specified, lists all registered members. | |
23 - allows searching for members with the 'search' sub action. | |
24 - calls MLAll or MLSearch depending on the sub action. | |
25 - uses the Memberlist template with the main sub template. | |
26 - requires the view_mlist permission. | |
27 - is accessed via ?action=mlist. | |
28 | |
29 void MLAll() | |
30 - used to display all members on a page by page basis with sorting. | |
31 - called from MemberList(). | |
32 - can be passed a sort parameter, to order the display of members. | |
33 - calls printMemberListRows to retrieve the results of the query. | |
34 | |
35 void MLSearch() | |
36 - used to search for members or display search results. | |
37 - called by MemberList(). | |
38 - if variable 'search' is empty displays search dialog box, using the | |
39 search sub template. | |
40 - calls printMemberListRows to retrieve the results of the query. | |
41 | |
42 void printMemberListRows(resource request) | |
43 - retrieves results of the request passed to it | |
44 - puts results of request into the context for the sub template. | |
45 */ | |
46 | |
47 // Show a listing of the registered members. | |
48 function Memberlist() | |
49 { | |
50 global $scripturl, $txt, $modSettings, $context, $settings, $modSettings; | |
51 | |
52 // Make sure they can view the memberlist. | |
53 isAllowedTo('view_mlist'); | |
54 | |
55 loadTemplate('Memberlist'); | |
56 | |
57 $context['listing_by'] = !empty($_GET['sa']) ? $_GET['sa'] : 'all'; | |
58 | |
59 // $subActions array format: | |
60 // 'subaction' => array('label', 'function', 'is_selected') | |
61 $subActions = array( | |
62 'all' => array($txt['view_all_members'], 'MLAll', $context['listing_by'] == 'all'), | |
63 'search' => array($txt['mlist_search'], 'MLSearch', $context['listing_by'] == 'search'), | |
64 ); | |
65 | |
66 // Set up the sort links. | |
67 $context['sort_links'] = array(); | |
68 foreach ($subActions as $act => $text) | |
69 $context['sort_links'][] = array( | |
70 'label' => $text[0], | |
71 'action' => $act, | |
72 'selected' => $text[2], | |
73 ); | |
74 | |
75 $context['num_members'] = $modSettings['totalMembers']; | |
76 | |
77 // Set up the columns... | |
78 $context['columns'] = array( | |
79 'is_online' => array( | |
80 'label' => $txt['status'], | |
81 'width' => '60', | |
82 'class' => 'first_th', | |
83 ), | |
84 'real_name' => array( | |
85 'label' => $txt['username'] | |
86 ), | |
87 'email_address' => array( | |
88 'label' => $txt['email'], | |
89 'width' => '25' | |
90 ), | |
91 'website_url' => array( | |
92 'label' => $txt['website'], | |
93 'width' => '70', | |
94 'link_with' => 'website', | |
95 ), | |
96 'icq' => array( | |
97 'label' => $txt['icq'], | |
98 'width' => '30' | |
99 ), | |
100 'aim' => array( | |
101 'label' => $txt['aim'], | |
102 'width' => '30' | |
103 ), | |
104 'yim' => array( | |
105 'label' => $txt['yim'], | |
106 'width' => '30' | |
107 ), | |
108 'msn' => array( | |
109 'label' => $txt['msn'], | |
110 'width' => '30' | |
111 ), | |
112 'id_group' => array( | |
113 'label' => $txt['position'] | |
114 ), | |
115 'registered' => array( | |
116 'label' => $txt['date_registered'] | |
117 ), | |
118 'posts' => array( | |
119 'label' => $txt['posts'], | |
120 'width' => '115', | |
121 'colspan' => '2', | |
122 'default_sort_rev' => true, | |
123 ) | |
124 ); | |
125 | |
126 $context['colspan'] = 0; | |
127 $context['disabled_fields'] = isset($modSettings['disabled_profile_fields']) ? array_flip(explode(',', $modSettings['disabled_profile_fields'])) : array(); | |
128 foreach ($context['columns'] as $key => $column) | |
129 { | |
130 if (isset($context['disabled_fields'][$key]) || (isset($column['link_with']) && isset($context['disabled_fields'][$column['link_with']]))) | |
131 { | |
132 unset($context['columns'][$key]); | |
133 continue; | |
134 } | |
135 | |
136 $context['colspan'] += isset($column['colspan']) ? $column['colspan'] : 1; | |
137 } | |
138 | |
139 // Aesthetic stuff. | |
140 end($context['columns']); | |
141 $context['columns'][key($context['columns'])]['class'] = 'last_th'; | |
142 | |
143 $context['linktree'][] = array( | |
144 'url' => $scripturl . '?action=mlist', | |
145 'name' => $txt['members_list'] | |
146 ); | |
147 | |
148 $context['can_send_pm'] = allowedTo('pm_send'); | |
149 | |
150 // Jump to the sub action. | |
151 if (isset($subActions[$context['listing_by']])) | |
152 $subActions[$context['listing_by']][1](); | |
153 else | |
154 $subActions['all'][1](); | |
155 } | |
156 | |
157 // List all members, page by page. | |
158 function MLAll() | |
159 { | |
160 global $txt, $scripturl, $user_info; | |
161 global $modSettings, $context, $smcFunc; | |
162 | |
163 // The chunk size for the cached index. | |
164 $cache_step_size = 500; | |
165 | |
166 // Only use caching if: | |
167 // 1. there are at least 2k members, | |
168 // 2. the default sorting method (real_name) is being used, | |
169 // 3. the page shown is high enough to make a DB filesort unprofitable. | |
170 $use_cache = $modSettings['totalMembers'] > 2000 && (!isset($_REQUEST['sort']) || $_REQUEST['sort'] === 'real_name') && isset($_REQUEST['start']) && $_REQUEST['start'] > $cache_step_size; | |
171 | |
172 if ($use_cache) | |
173 { | |
174 // Maybe there's something cached already. | |
175 if (!empty($modSettings['memberlist_cache'])) | |
176 $memberlist_cache = @unserialize($modSettings['memberlist_cache']); | |
177 | |
178 // The chunk size for the cached index. | |
179 $cache_step_size = 500; | |
180 | |
181 // Only update the cache if something changed or no cache existed yet. | |
182 if (empty($memberlist_cache) || empty($modSettings['memberlist_updated']) || $memberlist_cache['last_update'] < $modSettings['memberlist_updated']) | |
183 { | |
184 $request = $smcFunc['db_query']('', ' | |
185 SELECT real_name | |
186 FROM {db_prefix}members | |
187 WHERE is_activated = {int:is_activated} | |
188 ORDER BY real_name', | |
189 array( | |
190 'is_activated' => 1, | |
191 ) | |
192 ); | |
193 | |
194 $memberlist_cache = array( | |
195 'last_update' => time(), | |
196 'num_members' => $smcFunc['db_num_rows']($request), | |
197 'index' => array(), | |
198 ); | |
199 | |
200 for ($i = 0, $n = $smcFunc['db_num_rows']($request); $i < $n; $i += $cache_step_size) | |
201 { | |
202 $smcFunc['db_data_seek']($request, $i); | |
203 list($memberlist_cache['index'][$i]) = $smcFunc['db_fetch_row']($request); | |
204 } | |
205 $smcFunc['db_data_seek']($request, $memberlist_cache['num_members'] - 1); | |
206 list ($memberlist_cache['index'][$i]) = $smcFunc['db_fetch_row']($request); | |
207 $smcFunc['db_free_result']($request); | |
208 | |
209 // Now we've got the cache...store it. | |
210 updateSettings(array('memberlist_cache' => serialize($memberlist_cache))); | |
211 } | |
212 | |
213 $context['num_members'] = $memberlist_cache['num_members']; | |
214 } | |
215 | |
216 // Without cache we need an extra query to get the amount of members. | |
217 else | |
218 { | |
219 $request = $smcFunc['db_query']('', ' | |
220 SELECT COUNT(*) | |
221 FROM {db_prefix}members | |
222 WHERE is_activated = {int:is_activated}', | |
223 array( | |
224 'is_activated' => 1, | |
225 ) | |
226 ); | |
227 list ($context['num_members']) = $smcFunc['db_fetch_row']($request); | |
228 $smcFunc['db_free_result']($request); | |
229 } | |
230 | |
231 // Set defaults for sort (real_name) and start. (0) | |
232 if (!isset($_REQUEST['sort']) || !isset($context['columns'][$_REQUEST['sort']])) | |
233 $_REQUEST['sort'] = 'real_name'; | |
234 | |
235 if (!is_numeric($_REQUEST['start'])) | |
236 { | |
237 if (preg_match('~^[^\'\\\\/]~' . ($context['utf8'] ? 'u' : ''), $smcFunc['strtolower']($_REQUEST['start']), $match) === 0) | |
238 fatal_error('Hacker?', false); | |
239 | |
240 $_REQUEST['start'] = $match[0]; | |
241 | |
242 $request = $smcFunc['db_query']('substring', ' | |
243 SELECT COUNT(*) | |
244 FROM {db_prefix}members | |
245 WHERE LOWER(SUBSTRING(real_name, 1, 1)) < {string:first_letter} | |
246 AND is_activated = {int:is_activated}', | |
247 array( | |
248 'is_activated' => 1, | |
249 'first_letter' => $_REQUEST['start'], | |
250 ) | |
251 ); | |
252 list ($_REQUEST['start']) = $smcFunc['db_fetch_row']($request); | |
253 $smcFunc['db_free_result']($request); | |
254 } | |
255 | |
256 $context['letter_links'] = ''; | |
257 for ($i = 97; $i < 123; $i++) | |
258 $context['letter_links'] .= '<a href="' . $scripturl . '?action=mlist;sa=all;start=' . chr($i) . '#letter' . chr($i) . '">' . strtoupper(chr($i)) . '</a> '; | |
259 | |
260 // Sort out the column information. | |
261 foreach ($context['columns'] as $col => $column_details) | |
262 { | |
263 $context['columns'][$col]['href'] = $scripturl . '?action=mlist;sort=' . $col . ';start=0'; | |
264 | |
265 if ((!isset($_REQUEST['desc']) && $col == $_REQUEST['sort']) || ($col != $_REQUEST['sort'] && !empty($column_details['default_sort_rev']))) | |
266 $context['columns'][$col]['href'] .= ';desc'; | |
267 | |
268 $context['columns'][$col]['link'] = '<a href="' . $context['columns'][$col]['href'] . '" rel="nofollow">' . $context['columns'][$col]['label'] . '</a>'; | |
269 $context['columns'][$col]['selected'] = $_REQUEST['sort'] == $col; | |
270 } | |
271 | |
272 $context['sort_by'] = $_REQUEST['sort']; | |
273 $context['sort_direction'] = !isset($_REQUEST['desc']) ? 'up' : 'down'; | |
274 | |
275 // Construct the page index. | |
276 $context['page_index'] = constructPageIndex($scripturl . '?action=mlist;sort=' . $_REQUEST['sort'] . (isset($_REQUEST['desc']) ? ';desc' : ''), $_REQUEST['start'], $context['num_members'], $modSettings['defaultMaxMembers']); | |
277 | |
278 // Send the data to the template. | |
279 $context['start'] = $_REQUEST['start'] + 1; | |
280 $context['end'] = min($_REQUEST['start'] + $modSettings['defaultMaxMembers'], $context['num_members']); | |
281 | |
282 $context['can_moderate_forum'] = allowedTo('moderate_forum'); | |
283 $context['page_title'] = sprintf($txt['viewing_members'], $context['start'], $context['end']); | |
284 $context['linktree'][] = array( | |
285 'url' => $scripturl . '?action=mlist;sort=' . $_REQUEST['sort'] . ';start=' . $_REQUEST['start'], | |
286 'name' => &$context['page_title'], | |
287 'extra_after' => ' (' . sprintf($txt['of_total_members'], $context['num_members']) . ')' | |
288 ); | |
289 | |
290 // List out the different sorting methods... | |
291 $sort_methods = array( | |
292 'is_online' => array( | |
293 'down' => allowedTo('moderate_forum') ? 'IFNULL(lo.log_time, 1) ASC, real_name ASC' : 'CASE WHEN mem.show_online THEN IFNULL(lo.log_time, 1) ELSE 1 END ASC, real_name ASC', | |
294 'up' => allowedTo('moderate_forum') ? 'IFNULL(lo.log_time, 1) DESC, real_name DESC' : 'CASE WHEN mem.show_online THEN IFNULL(lo.log_time, 1) ELSE 1 END DESC, real_name DESC' | |
295 ), | |
296 'real_name' => array( | |
297 'down' => 'mem.real_name DESC', | |
298 'up' => 'mem.real_name ASC' | |
299 ), | |
300 'email_address' => array( | |
301 'down' => allowedTo('moderate_forum') ? 'mem.email_address DESC' : 'mem.hide_email DESC, mem.email_address DESC', | |
302 'up' => allowedTo('moderate_forum') ? 'mem.email_address ASC' : 'mem.hide_email ASC, mem.email_address ASC' | |
303 ), | |
304 'website_url' => array( | |
305 'down' => 'LENGTH(mem.website_url) > 0 ASC, IFNULL(mem.website_url, 1=1) DESC, mem.website_url DESC', | |
306 'up' => 'LENGTH(mem.website_url) > 0 DESC, IFNULL(mem.website_url, 1=1) ASC, mem.website_url ASC' | |
307 ), | |
308 'icq' => array( | |
309 'down' => 'LENGTH(mem.icq) > 0 ASC, mem.icq = 0 DESC, mem.icq DESC', | |
310 'up' => 'LENGTH(mem.icq) > 0 DESC, mem.icq = 0 ASC, mem.icq ASC' | |
311 ), | |
312 'aim' => array( | |
313 'down' => 'LENGTH(mem.aim) > 0 ASC, IFNULL(mem.aim, 1=1) DESC, mem.aim DESC', | |
314 'up' => 'LENGTH(mem.aim) > 0 DESC, IFNULL(mem.aim, 1=1) ASC, mem.aim ASC' | |
315 ), | |
316 'yim' => array( | |
317 'down' => 'LENGTH(mem.yim) > 0 ASC, IFNULL(mem.yim, 1=1) DESC, mem.yim DESC', | |
318 'up' => 'LENGTH(mem.yim) > 0 DESC, IFNULL(mem.yim, 1=1) ASC, mem.yim ASC' | |
319 ), | |
320 'msn' => array( | |
321 'down' => 'LENGTH(mem.msn) > 0 ASC, IFNULL(mem.msn, 1=1) DESC, mem.msn DESC', | |
322 'up' => 'LENGTH(mem.msn) > 0 DESC, IFNULL(mem.msn, 1=1) ASC, mem.msn ASC' | |
323 ), | |
324 'registered' => array( | |
325 'down' => 'mem.date_registered DESC', | |
326 'up' => 'mem.date_registered ASC' | |
327 ), | |
328 'id_group' => array( | |
329 'down' => 'IFNULL(mg.group_name, 1=1) DESC, mg.group_name DESC', | |
330 'up' => 'IFNULL(mg.group_name, 1=1) ASC, mg.group_name ASC' | |
331 ), | |
332 'posts' => array( | |
333 'down' => 'mem.posts DESC', | |
334 'up' => 'mem.posts ASC' | |
335 ) | |
336 ); | |
337 | |
338 $limit = $_REQUEST['start']; | |
339 $query_parameters = array( | |
340 'regular_id_group' => 0, | |
341 'is_activated' => 1, | |
342 'sort' => $sort_methods[$_REQUEST['sort']][$context['sort_direction']], | |
343 ); | |
344 | |
345 // Using cache allows to narrow down the list to be retrieved. | |
346 if ($use_cache && $_REQUEST['sort'] === 'real_name' && !isset($_REQUEST['desc'])) | |
347 { | |
348 $first_offset = $_REQUEST['start'] - ($_REQUEST['start'] % $cache_step_size); | |
349 $second_offset = ceil(($_REQUEST['start'] + $modSettings['defaultMaxMembers']) / $cache_step_size) * $cache_step_size; | |
350 | |
351 $where = 'mem.real_name BETWEEN {string:real_name_low} AND {string:real_name_high}'; | |
352 $query_parameters['real_name_low'] = $memberlist_cache['index'][$first_offset]; | |
353 $query_parameters['real_name_high'] = $memberlist_cache['index'][$second_offset]; | |
354 $limit -= $first_offset; | |
355 } | |
356 | |
357 // Reverse sorting is a bit more complicated... | |
358 elseif ($use_cache && $_REQUEST['sort'] === 'real_name') | |
359 { | |
360 $first_offset = floor(($memberlist_cache['num_members'] - $modSettings['defaultMaxMembers'] - $_REQUEST['start']) / $cache_step_size) * $cache_step_size; | |
361 if ($first_offset < 0) | |
362 $first_offset = 0; | |
363 $second_offset = ceil(($memberlist_cache['num_members'] - $_REQUEST['start']) / $cache_step_size) * $cache_step_size; | |
364 | |
365 $where = 'mem.real_name BETWEEN {string:real_name_low} AND {string:real_name_high}'; | |
366 $query_parameters['real_name_low'] = $memberlist_cache['index'][$first_offset]; | |
367 $query_parameters['real_name_high'] = $memberlist_cache['index'][$second_offset]; | |
368 $limit = $second_offset - ($memberlist_cache['num_members'] - $_REQUEST['start']) - ($second_offset > $memberlist_cache['num_members'] ? $cache_step_size - ($memberlist_cache['num_members'] % $cache_step_size) : 0); | |
369 } | |
370 | |
371 // Select the members from the database. | |
372 $request = $smcFunc['db_query']('', ' | |
373 SELECT mem.id_member | |
374 FROM {db_prefix}members AS mem' . ($_REQUEST['sort'] === 'is_online' ? ' | |
375 LEFT JOIN {db_prefix}log_online AS lo ON (lo.id_member = mem.id_member)' : '') . ($_REQUEST['sort'] === 'id_group' ? ' | |
376 LEFT JOIN {db_prefix}membergroups AS mg ON (mg.id_group = CASE WHEN mem.id_group = {int:regular_id_group} THEN mem.id_post_group ELSE mem.id_group END)' : '') . ' | |
377 WHERE mem.is_activated = {int:is_activated}' . (empty($where) ? '' : ' | |
378 AND ' . $where) . ' | |
379 ORDER BY {raw:sort} | |
380 LIMIT ' . $limit . ', ' . $modSettings['defaultMaxMembers'], | |
381 $query_parameters | |
382 ); | |
383 printMemberListRows($request); | |
384 $smcFunc['db_free_result']($request); | |
385 | |
386 // Add anchors at the start of each letter. | |
387 if ($_REQUEST['sort'] == 'real_name') | |
388 { | |
389 $last_letter = ''; | |
390 foreach ($context['members'] as $i => $dummy) | |
391 { | |
392 $this_letter = $smcFunc['strtolower']($smcFunc['substr']($context['members'][$i]['name'], 0, 1)); | |
393 | |
394 if ($this_letter != $last_letter && preg_match('~[a-z]~', $this_letter) === 1) | |
395 { | |
396 $context['members'][$i]['sort_letter'] = htmlspecialchars($this_letter); | |
397 $last_letter = $this_letter; | |
398 } | |
399 } | |
400 } | |
401 } | |
402 | |
403 // Search for members... | |
404 function MLSearch() | |
405 { | |
406 global $txt, $scripturl, $context, $user_info, $modSettings, $smcFunc; | |
407 | |
408 $context['page_title'] = $txt['mlist_search']; | |
409 $context['can_moderate_forum'] = allowedTo('moderate_forum'); | |
410 | |
411 // Can they search custom fields? | |
412 $request = $smcFunc['db_query']('', ' | |
413 SELECT col_name, field_name, field_desc | |
414 FROM {db_prefix}custom_fields | |
415 WHERE active = {int:active} | |
416 ' . (allowedTo('admin_forum') ? '' : ' AND private < {int:private_level}') . ' | |
417 AND can_search = {int:can_search} | |
418 AND (field_type = {string:field_type_text} OR field_type = {string:field_type_textarea})', | |
419 array( | |
420 'active' => 1, | |
421 'can_search' => 1, | |
422 'private_level' => 2, | |
423 'field_type_text' => 'text', | |
424 'field_type_textarea' => 'textarea', | |
425 ) | |
426 ); | |
427 $context['custom_search_fields'] = array(); | |
428 while ($row = $smcFunc['db_fetch_assoc']($request)) | |
429 $context['custom_search_fields'][$row['col_name']] = array( | |
430 'colname' => $row['col_name'], | |
431 'name' => $row['field_name'], | |
432 'desc' => $row['field_desc'], | |
433 ); | |
434 $smcFunc['db_free_result']($request); | |
435 | |
436 // They're searching.. | |
437 if (isset($_REQUEST['search']) && isset($_REQUEST['fields'])) | |
438 { | |
439 $_POST['search'] = trim(isset($_GET['search']) ? $_GET['search'] : $_POST['search']); | |
440 $_POST['fields'] = isset($_GET['fields']) ? explode(',', $_GET['fields']) : $_POST['fields']; | |
441 | |
442 $context['old_search'] = $_REQUEST['search']; | |
443 $context['old_search_value'] = urlencode($_REQUEST['search']); | |
444 | |
445 // No fields? Use default... | |
446 if (empty($_POST['fields'])) | |
447 $_POST['fields'] = array('name'); | |
448 | |
449 $query_parameters = array( | |
450 'regular_id_group' => 0, | |
451 'is_activated' => 1, | |
452 'blank_string' => '', | |
453 'search' => '%' . strtr($smcFunc['htmlspecialchars']($_POST['search'], ENT_QUOTES), array('_' => '\\_', '%' => '\\%', '*' => '%')) . '%', | |
454 ); | |
455 | |
456 // Search for a name? | |
457 if (in_array('name', $_POST['fields'])) | |
458 $fields = array('member_name', 'real_name'); | |
459 else | |
460 $fields = array(); | |
461 // Search for messengers... | |
462 if (in_array('messenger', $_POST['fields']) && (!$user_info['is_guest'] || empty($modSettings['guest_hideContacts']))) | |
463 $fields += array(3 => 'msn', 'aim', 'icq', 'yim'); | |
464 // Search for websites. | |
465 if (in_array('website', $_POST['fields'])) | |
466 $fields += array(7 => 'website_title', 'website_url'); | |
467 // Search for groups. | |
468 if (in_array('group', $_POST['fields'])) | |
469 $fields += array(9 => 'IFNULL(group_name, {string:blank_string})'); | |
470 // Search for an email address? | |
471 if (in_array('email', $_POST['fields'])) | |
472 { | |
473 $fields += array(2 => allowedTo('moderate_forum') ? 'email_address' : '(hide_email = 0 AND email_address'); | |
474 $condition = allowedTo('moderate_forum') ? '' : ')'; | |
475 } | |
476 else | |
477 $condition = ''; | |
478 | |
479 $customJoin = array(); | |
480 $customCount = 10; | |
481 // Any custom fields to search for - these being tricky? | |
482 foreach ($_POST['fields'] as $field) | |
483 { | |
484 $curField = substr($field, 5); | |
485 if (substr($field, 0, 5) == 'cust_' && isset($context['custom_search_fields'][$curField])) | |
486 { | |
487 $customJoin[] = 'LEFT JOIN {db_prefix}themes AS t' . $curField . ' ON (t' . $curField . '.variable = {string:t' . $curField . '} AND t' . $curField . '.id_theme = 1 AND t' . $curField . '.id_member = mem.id_member)'; | |
488 $query_parameters['t' . $curField] = $curField; | |
489 $fields += array($customCount++ => 'IFNULL(t' . $curField . '.value, {string:blank_string})'); | |
490 } | |
491 } | |
492 | |
493 $query = $_POST['search'] == '' ? '= {string:blank_string}' : 'LIKE {string:search}'; | |
494 | |
495 $request = $smcFunc['db_query']('', ' | |
496 SELECT COUNT(*) | |
497 FROM {db_prefix}members AS mem | |
498 LEFT JOIN {db_prefix}membergroups AS mg ON (mg.id_group = CASE WHEN mem.id_group = {int:regular_id_group} THEN mem.id_post_group ELSE mem.id_group END)' . | |
499 (empty($customJoin) ? '' : implode(' | |
500 ', $customJoin)) . ' | |
501 WHERE (' . implode( ' ' . $query . ' OR ', $fields) . ' ' . $query . $condition . ') | |
502 AND mem.is_activated = {int:is_activated}', | |
503 $query_parameters | |
504 ); | |
505 list ($numResults) = $smcFunc['db_fetch_row']($request); | |
506 $smcFunc['db_free_result']($request); | |
507 | |
508 $context['page_index'] = constructPageIndex($scripturl . '?action=mlist;sa=search;search=' . $_POST['search'] . ';fields=' . implode(',', $_POST['fields']), $_REQUEST['start'], $numResults, $modSettings['defaultMaxMembers']); | |
509 | |
510 // Find the members from the database. | |
511 // !!!SLOW This query is slow. | |
512 $request = $smcFunc['db_query']('', ' | |
513 SELECT mem.id_member | |
514 FROM {db_prefix}members AS mem | |
515 LEFT JOIN {db_prefix}log_online AS lo ON (lo.id_member = mem.id_member) | |
516 LEFT JOIN {db_prefix}membergroups AS mg ON (mg.id_group = CASE WHEN mem.id_group = {int:regular_id_group} THEN mem.id_post_group ELSE mem.id_group END)' . | |
517 (empty($customJoin) ? '' : implode(' | |
518 ', $customJoin)) . ' | |
519 WHERE (' . implode( ' ' . $query . ' OR ', $fields) . ' ' . $query . $condition . ') | |
520 AND mem.is_activated = {int:is_activated} | |
521 LIMIT ' . $_REQUEST['start'] . ', ' . $modSettings['defaultMaxMembers'], | |
522 $query_parameters | |
523 ); | |
524 printMemberListRows($request); | |
525 $smcFunc['db_free_result']($request); | |
526 } | |
527 else | |
528 { | |
529 // These are all the possible fields. | |
530 $context['search_fields'] = array( | |
531 'name' => $txt['mlist_search_name'], | |
532 'email' => $txt['mlist_search_email'], | |
533 'messenger' => $txt['mlist_search_messenger'], | |
534 'website' => $txt['mlist_search_website'], | |
535 'group' => $txt['mlist_search_group'], | |
536 ); | |
537 | |
538 foreach ($context['custom_search_fields'] as $field) | |
539 $context['search_fields']['cust_' . $field['colname']] = sprintf($txt['mlist_search_by'], $field['name']); | |
540 | |
541 // What do we search for by default? | |
542 $context['search_defaults'] = array('name', 'email'); | |
543 | |
544 $context['sub_template'] = 'search'; | |
545 $context['old_search'] = isset($_GET['search']) ? $_GET['search'] : (isset($_POST['search']) ? htmlspecialchars($_POST['search']) : ''); | |
546 } | |
547 | |
548 $context['linktree'][] = array( | |
549 'url' => $scripturl . '?action=mlist;sa=search', | |
550 'name' => &$context['page_title'] | |
551 ); | |
552 } | |
553 | |
554 function printMemberListRows($request) | |
555 { | |
556 global $scripturl, $txt, $user_info, $modSettings; | |
557 global $context, $settings, $memberContext, $smcFunc; | |
558 | |
559 // Get the most posts. | |
560 $result = $smcFunc['db_query']('', ' | |
561 SELECT MAX(posts) | |
562 FROM {db_prefix}members', | |
563 array( | |
564 ) | |
565 ); | |
566 list ($MOST_POSTS) = $smcFunc['db_fetch_row']($result); | |
567 $smcFunc['db_free_result']($result); | |
568 | |
569 // Avoid division by zero... | |
570 if ($MOST_POSTS == 0) | |
571 $MOST_POSTS = 1; | |
572 | |
573 $members = array(); | |
574 while ($row = $smcFunc['db_fetch_assoc']($request)) | |
575 $members[] = $row['id_member']; | |
576 | |
577 // Load all the members for display. | |
578 loadMemberData($members); | |
579 | |
580 $context['members'] = array(); | |
581 foreach ($members as $member) | |
582 { | |
583 if (!loadMemberContext($member)) | |
584 continue; | |
585 | |
586 $context['members'][$member] = $memberContext[$member]; | |
587 $context['members'][$member]['post_percent'] = round(($context['members'][$member]['real_posts'] * 100) / $MOST_POSTS); | |
588 $context['members'][$member]['registered_date'] = strftime('%Y-%m-%d', $context['members'][$member]['registered_timestamp']); | |
589 } | |
590 } | |
591 | |
592 ?> |