Вообщем я почти достиг того чего хотел и в некоторой степени достиг даже большего. Но оно не использует тот же принцип расчета PPD (post per day, количества сообщений в день), который использует phpBB при выводе PPD при просмотре профиля. Теперь собственно решение, и потом снова пояснения.
Для начала на сайте
R45 (
http://www.rasadam.com/) было найдено его решение, которое как я понял одобрил
AbelaJohnB, по поводу того как считать посты не по факту поста, по счетчику (нужно если у вас отключен счетчи в каких либо форумах, дефолтом top 'x' poster считает посты по фактическому наличию их). Предлагалось заменить запрос на такой вариант.
Код: Выделить всё
$sql = "SELECT user_id, username, user_posts, user_level
FROM " . USERS_TABLE . "
WHERE <* смотри ниже пояснение *>
ORDER BY user_posts DESC
LIMIT $str_input";
* - от места этого запроса в коде, там идет выбор кого отображать: всех с модерами/без/с админом/без оного.
Дальше собственно моя модификация. Я пишу её относительно оригинального кода, я использую вариацию
R45.
Код: Выделить всё
##############################################################
## MOD Title: Top 'X' Poster ADD-ON sort by PPD
## MOD Author: VVVas < v[at]vvvas.ru > (Vasiliy V Mishustin) http://www.vvvas.ru
## MOD Description: This ADD-ON for "Top 'X' Poster" by AbelaJohnB < abela@johnabela.com >
## (John B. Abela) http://www.johnabela.com/mods/
## This ADD-ON changes original sorting users for sorting by Post Per Day (PPD).
## And add's after registration the minimum quantity of days function before
## the user will be start considered at display in Top "X" poster section.
##
## MOD Version: 0.0.3
## Compatibility: 2.0.16
##
## Installation Level: easy
## Installation Time: 10 Minutes
## Files To Edit: 2
## index.php
## includes/functions.php
##
## Included files: n/a
##############################################################
## For Security Purposes, Please Check: http://www.phpbbguru.net/mods/ for the
## latest version of this MOD. Downloading this MOD from other sites could cause malicious code
## to enter into your phpBB Forum.
##############################################################
## Installation Notes:
## This mod REQUIRE the "Top 'X' Poster" by AbelaJohnB < abela@johnabela.com > (John B. Abela)
## http://www.johnabela.com/mods/, this is only a ADD-ON for this mod
##
## Author Notes:
## This Add-on using changes offered by R45 <n/a> (n/a) http://www.rasadam.com/.
##
## Negative value corresponds 0. I' m not recommend to use value less than 10.
## Value 0 categorically is not recommended because of that that
## just the registered user in current of the first day will be at top of a rating even with one post.
##
## Thanks:
## sunchess <n/a> (n/a) http://lab.com.ru
##
##############################################################
## MOD History:
##
## 2005-07-17 - Version 0.0.3
## - Initial release
##
##############################################################
## Before Adding This MOD To Your Forum, You Should Back Up All Files Related To This MOD
##############################################################
#
#-----[ OPEN ]------------------------------------------
#
index.php
#
#-----[ FIND ]------------------------------------------
#
// START MOD: TOP 'X' USERS (AbelaJohnB)
// PLEASE SEE THE INSTALL FILE FOR FURTHER INFORMATION ON WHAT TO DISPLAY AND HOW MANY TO DISPLAY.
'TOP_POSTERS' => top_posters('10', 0, 0), // Replace This Line If You Want Alternative Settings Displayed
#
#-----[ REPLACE WITH ]------------------------------------------
#
// START MOD: TOP 'X' USERS (AbelaJohnB)
// PLEASE SEE THE INSTALL FILE FOR FURTHER INFORMATION ON WHAT TO DISPLAY AND HOW MANY TO DISPLAY.
'TOP_POSTERS' => top_posters('10', 0, 0, '10'), // Replace This Line If You Want Alternative Settings Displayed
#
#-----[ OPEN ]------------------------------------------
#
includes/functions.php
#
#-----[ FIND ]------------------------------------------
#
// top_posters('10', x, x) will return Top Ten Members
#
#-----[ REPLACE WITH ]------------------------------------------
#
// top_posters('10', x, x, 'x') will return Top Ten Members
#
#-----[ FIND ]------------------------------------------
#
// top_posters('5', x, x) will return Top Five Members
#
#-----[ REPLACE WITH ]------------------------------------------
#
// top_posters('5', x, x, 'x') will return Top Five Members
#
#-----[ AFTER ADD ]------------------------------------------
#
//
// The minimum quantity of days after registration before the user will start to be
// considered at display in Top 'X' Poster section.
// Negative value corresponds 0. I do not recommend to use value less than 10 because of bias of these
// data. Value 0 categorically is not recommended because of that that just the registered user in
// current of the first day will be at top of a rating even with one message.
// Example:
// top_posters('x', x, x, '10') will return Members 10 days a minimum after registration
//
#
#-----[ FIND ]------------------------------------------
#
// top_posters('10', 1, 1) Top Ten Members, Show both ADMIN & MOD
// top_posters('10', 1, 0) Top Ten Members, Show both ADMIN, but not MOD
// top_posters('10', 0, 1) Top Ten Members, Show both MOD, but not ADMIN
// top_posters('10', 0, 0) Top Ten Members, Show neither ADMIN nor MOD
#
#-----[ REPLACE WITH ]------------------------------------------
#
// top_posters('10', 1, 1, '10') Top Ten Members, Show both ADMIN & MOD, 10 days a minimum after registration
// top_posters('10', 1, 0, '5') Top Ten Members, Show both ADMIN, but not MOD, 5 days a minimum after registration
// top_posters('10', 0, 1, '30') Top Ten Members, Show both MOD, but not ADMIN, 30 days a minimum after registration
// top_posters('10', 0, 0, '100') Top Ten Members, Show neither ADMIN nor MOD, 100 days a minimum after registration
#
#-----[ FIND ]------------------------------------------
#
function top_posters($str_input, $show_admin, $show_mod)
#
#-----[ REPLACE WITH ]------------------------------------------
#
function top_posters($str_input, $show_admin, $show_mod, $min_day)
#
#-----[ FIND ]------------------------------------------
#
$sql = "SELECT u.user_id, u.username, u.user_posts, u.user_level, count(u.user_id) as user_posts
FROM " . USERS_TABLE . " u, " . POSTS_TABLE . " p
WHERE (u.user_id <> " . ANONYMOUS . ") AND (u.user_id = p.poster_id)
GROUP BY user_id, username
ORDER BY user_posts DESC
LIMIT $str_input";
#
#-----[ REPLACE WITH ]------------------------------------------
#
$sql = "SELECT user_id, username, user_posts, user_level, user_regdate
FROM " . USERS_TABLE . "
WHERE (user_id <> " . ANONYMOUS . ") AND (user_regdate < (" . time() . " - $min_day*86400))
ORDER BY ( user_posts / ( ( " . time() . " - user_regdate ) / 86400 )) DESC
LIMIT $str_input";
#
#-----[ FIND ]------------------------------------------
#
$sql = "SELECT u.user_id, u.username, u.user_posts, u.user_level, count(u.user_id) as user_posts
FROM " . USERS_TABLE . " u, " . POSTS_TABLE . " p
WHERE (u.user_id <> " . ANONYMOUS . ") AND (u.user_id = p.poster_id) AND (u.user_level != " . MOD . ")
GROUP BY user_id, username
ORDER BY user_posts DESC
LIMIT $str_input";
#
#-----[ REPLACE WITH ]------------------------------------------
#
$sql = "SELECT user_id, username, user_posts, user_level, user_regdate
FROM " . USERS_TABLE . "
WHERE (user_id <> " . ANONYMOUS . ") AND (user_level != " . MOD . ") AND (user_regdate < (" . time() . " - $min_day*86400))
ORDER BY ( user_posts / ( ( " . time() . " - user_regdate ) / 86400 )) DESC
LIMIT $str_input";
#
#-----[ FIND ]------------------------------------------
#
$sql = "SELECT u.user_id, u.username, u.user_posts, u.user_level, count(u.user_id) as user_posts
FROM " . USERS_TABLE . " u, " . POSTS_TABLE . " p
WHERE (u.user_id <> " . ANONYMOUS . ") AND (u.user_id = p.poster_id) AND (u.user_level != " . ADMIN . ")
GROUP BY user_id, username
ORDER BY user_posts DESC
LIMIT $str_input";
#
#-----[ REPLACE WITH ]------------------------------------------
#
$sql = "SELECT user_id, username, user_posts, user_level, user_regdate
FROM " . USERS_TABLE . "
WHERE (user_id <> " . ANONYMOUS . ") AND (user_level != " . ADMIN . ") AND (user_regdate < (" . time() . " - $min_day*86400))
ORDER BY ( user_posts / ( ( " . time() . " - user_regdate ) / 86400 )) DESC
LIMIT $str_input";
#
#-----[ FIND ]------------------------------------------
#
$sql = "SELECT u.user_id, u.username, u.user_posts, u.user_level, count(u.user_id) as user_posts
FROM " . USERS_TABLE . " u, " . POSTS_TABLE . " p
WHERE (u.user_id <> " . ANONYMOUS . ") AND (u.user_id = p.poster_id) AND (u.user_level != " . ADMIN . ") AND (u.user_level != " . MOD . ")
GROUP BY user_id, username
ORDER BY user_posts DESC
LIMIT $str_input";
#
#-----[ REPLACE WITH ]------------------------------------------
#
$sql = "SELECT user_id, username, user_posts, user_level, user_regdate
FROM " . USERS_TABLE . "
WHERE (user_id <> " . ANONYMOUS . ") AND (user_level != " . ADMIN . ") AND (user_level != " . MOD . ") AND (user_regdate < (" . time() . " - $min_day*86400))
ORDER BY ( user_posts / ( ( " . time() . " - user_regdate ) / 86400 )) DESC
LIMIT $str_input";
#
#-----[ SAVE/CLOSE ALL FILES ]------------------------------------------
#
# EoM
Собственно добавил ещё одну переменную или как это называеться, отвечающую за минимальное количество дней перед тем как пользователь начнет принимать участие в рейтинге. Отрицательно значение соответствуе нулю. Значение 0 использовать категорически не рекомендую, потому что человек в первые сутки после регистрации даже с 1 сообщением будет находиться в рейтинге скорее всего, то есть абсолютно не объективно. И если у вас много регистрируються и они в первый же день оставляют посты, а потом могут исчезать, то с 0 значением дней вам эта моя вариация сделает только каку. Советую ставить значение от 10, ну минимум от 5, но только если у вас очень-очень непопулярный форум. В принципе лучшим значением для большого форума будет 30. Форум класса моего наверное идеально 10. Себе поставил такое.
Добавлено спустя 5 минут 13 секунд:
Если кому придет в голову как считать PPD так как он считаеться в профиле, то пишите, попробуем, буду очень рад.
В профиле это дело считаеться так же, только время жизни пользователя ещё обрабатываеться round, а полученное значени от этой обработки сравнивается с 1 и из ни выбираеться наибольшее.
Добавлено спустя 1 минуту 50 секунд:
Не надо ставит мне в упрек кривой код - я не знаю PHP вообще. Если вы напишите это лучше - молодцы, постите сюда и если это заработает, то я буду вам безмерно благодарен.
Добавлено спустя 1 минуту 26 секунд:
Ещё. Английский я тоже не знаю, там наверняка всё коряво. Если сумеет написать грамотное пояснение на английском, то тоже буду вам признателен.