Custom PHP block:
Display Frequent Posters for SMF 2.0x using horizontal javascript pages
Submitted upon request.
Adjustable variables/integers are at the top of the block code.
/* Display Frequent Posters for SMF 2.0x by Underdog @http://askusaquestion.net */
/* Format: Horizontal javascript pages */
/* v1.1 */
global $smcFunc, $scripturl, $boardurl;
/* Adjust these */
$number_users = 24;
$lang = ' Posts';
$show_posts = 'Show posts from this user';
$show_profile = 'Show the user profile of ';
$none = 'No users selected';
$show_name = true;
$avatar_width = 50;
$avatar_height = 50;
$row_height = 100; /* <-- adjust depending on amount of text shown under avatar */
$user_name_max = 35; /* <-- max chars for user name display */
$per_row = 4;
$rows = 1;
$prev = 'Prev';
$next = 'Next';
/* Do not edit below this line */
$query = '(users.posts > 0 AND is_activated = 1)';
$datum = array( 'id_member', 'posts', 'real_name', 'avatar', 'filename', 'id_attach');
$x = 0;
$count = 0;
$users = array();
$limit = !empty($number_users) ? (int)$number_users : 20;
$cell_width = 100 / (int)$per_row;
$pages = '<script type="text/javascript"><!--
var pager = new frequentPager("new", '.(int)$rows.');
pager.init();
pager.showPageNav("pager", "l8stPagePosition");
pager.showPage(1);
//--></script>';
/* Some js to control the pages */
echo '<script type="text/javascript">
function frequentPager(tableName, itemsPerPage) {
this.tableName = tableName;
this.itemsPerPage = itemsPerPage;
this.currentPage = 1;
this.pages = 0;
this.initiated = false;
this.showRecords = function(from, to) {
var rows = document.getElementById(tableName).rows;
// i starts from 1 to skip table header row';
echo "
for (var i = 1; i < rows.length; i++) {
if (i < from || i > to)
rows[i].style.display = 'none';
else
rows[i].style.display = '';
}";
echo '
}
this.showPage = function(pageNumberFrequent) {
if (! this.initiated) {
alert("not initiated");
return;
}';
echo "
var oldPageAnchor = document.getElementById('pg'+this.currentPage);
oldPageAnchor.className = 'smalltext pg-normal';
this.currentPage = pageNumberFrequent;
var newPageAnchor = document.getElementById('pg'+this.currentPage);
newPageAnchor.className = 'largetext pg-selected';
var from = (pageNumberFrequent - 1) * itemsPerPage + 1;
var to = from + itemsPerPage - 1;
this.showRecords(from, to);
}
this.prev = function() {
if (this.currentPage > 1)
this.showPage(this.currentPage - 1);
}
this.next = function() {
if (this.currentPage < this.pages) {
this.showPage(this.currentPage + 1);
}
}
this.init = function() {
var rows = document.getElementById(tableName).rows;
var records = (rows.length - 1);
this.pages = Math.ceil(records / itemsPerPage);
this.initiated = true;
}";
echo '
this.showPageNav = function(pagerName, positionId) {
if (! this.initiated) {
alert("not initiated");
return;
}
var element = document.getElementById(positionId);';
echo "
var pagerHtml = '<span onclick=";
echo '"';
echo "' + pagerName + '.prev();";
echo '" class="smalltext pg-normal"> « ', $prev, ' </span> | ';
echo "';
for (var page = 1; page <= this.pages; page++)
pagerHtml += '<span id=";
echo '"';
echo "pg' + page + '";
echo '" class="smalltext pg-normal" onclick="';
echo "' + pagerName + '.showPage(' + page + ');";
echo '">';
echo "' + page + '</span> | ';
pagerHtml += '<span onclick=";
echo '"';
echo "'+pagerName+'.next();";
echo '" class="smalltext pg-normal"> ', $next,' »</span>';
echo "';
element.innerHTML = pagerHtml;
}
}
function regenerateFrequent()
{
window.location.reload()
}
function regenerateFrequentPosters()
{
if (document.layers)
{
appearFrequent()
setTimeout(";
echo '"window.onresize=regenerateFrequent",450)
}
}
function changeFrequentText(whichcontent)
{
if (document.all||document.getElementById)
{
cross_el=document.getElementById? document.getElementById("descriptions"):document.all.descriptions
cross_el.innerHTML=';
echo "'<div style=";
echo '"font-family:Arial Narrow Bold;font-size:small;">';
echo "'+whichcontent+'</div>'
}
else if (document.layers)
{
document.d1.document.d2.document.write('<div style=";
echo '"font-family:Arial Narrow Bold;font-size:small;">';
echo "'+whichcontent+'</div>')
document.d1.document.d2.document.close()
}
}
function appearFrequent()
{
document.d1.visibility='show'
}
</script>";
/* end of js controller */
$result = $smcFunc['db_query']('', "SELECT users.id_member, users.posts, users.real_name, users.avatar, users.is_activated, att.id_attach, att.filename FROM {db_prefix}members AS users
LEFT JOIN {db_prefix}attachments AS att ON (att.id_member = users.id_member)
WHERE {$query} ORDER BY users.posts DESC LIMIT {$limit}");
while ($val = $smcFunc['db_fetch_assoc']($result))
{
foreach ($datum as $data)
{
if (empty($val[$data]))
$val[$data] = false;
$users[$count][$data] = $val[$data];
}
$count++;
}
$smcFunc['db_free_result']($result);
echo '
<script type="text/javascript">
<!--
window.onload=regenerateFrequentPosters
//-->
</script>';
if ($count == 0)
echo '
<div style="text-align:center">', $none, '</div>';
else
{
echo '
<table id ="new" style="width:100%;">
<tr>
<td> </td>
</tr>';
foreach ($users as $user)
{
if ((empty($user['posts'])) || !$user['posts'])
continue;
if ($x == 0)
echo '
<tr>';
$x++;
if (!$user['avatar'] && !$user['filename'])
$user['avatar'] = $boardurl . '/avatars/noavatar.gif';
elseif (!$user['avatar'])
$user['avatar'] = $scripturl . '?action=dlattach;attach='.$user['id_attach'].';type=avatar';
elseif (substr($user['avatar'], 0, 4) != 'http')
$user['avatar'] = $boardurl .'/avatars/' . $user['avatar'];
$name = strlen($user['real_name']) >= (int)$user_name_max ? $name = substr($user['real_name'],0,(int)$user_name_max).'...':$user['real_name'];
echo '
<td style="text-align:center;width:'.(int)$cell_width.'%;">
<div style="height:'.$row_height.'px;overflow:hidden;">
<a href="'.$scripturl.'?action=profile;u='.$user['id_member'].'" title="'.$show_profile,$user['real_name'].'">
<img src="'. $user['avatar'] . '" style="max-height:'.$avatar_height.'px;max-width:'.$avatar_width.'px;" alt="" />
</a>
<br />';
if ($show_name)
echo '
<a href="'.$scripturl.'?action=profile;u='.$user['id_member'].'" title="'.$user['real_name'].'">',$name,'</a>
<br />';
echo '
<a href="'.$scripturl.'?action=profile;area=showposts;u='.$user['id_member'].'" title="'.$show_posts.'">', $user['posts'], $lang, '</a>
</div>
</td>';
if ($x > ((int)$per_row -1))
{
$x=0;
echo '
</tr>';
}
}
echo '
</table>';
if (((int)$per_row * (int)$rows) != (int)$number_users)
echo '
<br />
<div id="l8stPagePosition" style="text-align:center;"> </div>
<div style="text-align:center;">', $pages, '</div>';
}
Top, Bottom, Header or Footer display is suggested.