TopStats modyfikacja - zależne od ostatniej aktywności użytkownika

Założony przez  ficus.

Hej!
Zastanawiam się nad przerobieniem pluginu TopStats, tak, aby największych posterów uwarunkować od ostatniego logowania. Forum jest dość stare, panowały inne zasady etc. i obecna topka posterów składa się z dawno nieaktywnych kont w większości. 

global $db$lang$mybb$templates$theme$topStats;

 
$tpl['ignore_groups'] = '';
 
 if(!empty(
$mybb->settings['topStats_IgnoreGroups_Posters']))
 {
 
$tpl['ignore_groups'] = " AND usergroup NOT IN ({$mybb->settings['topStats_IgnoreGroups_Posters']})";
 } 
 
 
$lang->topStats_topPosters $lang->sprintf($lang->topStats_topPosters, (int)$this->getConfig('Limit_Posters'));
 
 
       $tpl['row'] = '';
 
   
        $sql 
"SELECT username, usergroup, displaygroup, postnum, uid, avatar, avatardimensions
                FROM "
.TABLE_PREFIX."users 
 WHERE uid != '' "
$tpl['ignore_groups'] . "
                ORDER BY postnum DESC 
                LIMIT "
.(int)$this->getConfig('Limit_Posters')."";
 
       $result $db->query($sql);
 
       while ($row $db->fetch_array($result))
 
       {
 
           $tpl['username'] = format_name($row['username'], $row['usergroup'], $row['displaygroup']);
 
    $tpl['profilelink'] = build_profile_link($tpl['username'], $row['uid']);
 
    $tpl['postnum'] = my_number_format($row['postnum']);
 
           $useravatar format_avatar(htmlspecialchars_uni($row['avatar']), $row['avatardimensions'], my_strtolower($this->getConfig('AvatarWidth')));
 
           (!$this->getConfig('Status_Avatar')) ? '' : eval("\$tpl['avatar'] = \"".$templates->get("topStats_PostersAvatar")."\";"); 
 
           eval("\$tpl['row'] .= \"" $templates->get("topStats_PostersRow") . "\";");
 
       }
 
       eval("\$topStats['Posters'] = \"" $templates->get("topStats_Posters") . "\";"); 

To jest fragment pluginu odpowiadający za omawiany widget. 
Pierwsza myśl była by kombinować w tym miejscu z dodaniem kolumny lastactive do zapytania mysql. Ogarnąć funkcję do pobrania obecnej daty w wymaganym formacie i napisać prosty warunek dla funkcji eval. 
Problem w tym, że nie wiem czy ten pomysł jest dobry. Druga kwestia - znam tylko i wyłącznie podstawy języka, tak więc miałbym problem z stworzeniem funkcji do odczytu obecnego czasu. 
Jakieś sugestie czy tok rozumowania jest dobry, a może ktoś się skusi dopomóc :)?
"Try not. Do... or do not. There is no try."
Poświęć 5 minut. Nie bądź ignorantem!  -  Jak zbadać element?
problem jednak tyczy sie mybbb :)

(14.03.2016, 13:18)ficus napisał(a): Pierwsza myśl była by kombinować w tym miejscu z dodaniem kolumny lastactive do zapytania mysql

Plan jest dobry i w sumie tyle wystarczy bo po co więcej, lepszym rozwiązaniem bylo by lastvisit. Trzeba będzie trochę więcej zmodyfikować zapytanie ale to optymalniejsze niżeli wyciągać wszystkie posty i sprawdzać ich date

(14.03.2016, 13:18)ficus napisał(a): Ogarnąć funkcję do pobrania obecnej daty w wymaganym formacie i napisać prosty warunek dla funkcji eval.

nie rozumiem, po co tak?

TIME_NOW - jako stala z MyBB
time() - jako funkcja PHP
Zwracają obecny czas w zapisie unixowym, wystarczy obrobić, nie wiem na jakim formacie Ci zależy.

Dobry z Ciebie użytkownik więc trzymaj gotowca :)

$sql "SELECT u.username, u.usergroup, u.displaygroup, COUNT(p.pid) as postnum, u.uid, u.avatar, u.avatardimensions, u.lastactive, p.pid, p.dateline, p.uid
                FROM "
.TABLE_PREFIX."users as u
                LEFT JOIN "
.TABLE_PREFIX."posts as p ON (u.uid=p.uid)
                WHERE 1=1 "
$tpl['ignore_groups'] . " AND p.dateline >= u.lastactive
                ORDER BY postnum DESC 
                LIMIT "
.(int)$this->getConfig('Limit_Posters').""

Napisane z palca więc nie wiem co będzie - sprawdź i koniecznie daj znać.
(14.03.2016, 16:21)Supryk napisał(a): Plan jest dobry i w sumie tyle wystarczy bo po co więcej, lepszym rozwiązaniem bylo by lastvisit.

W zasadzie miałem na myśli właśnie Lastvisit.

(14.03.2016, 16:21)Supryk napisał(a): optymalniejsze niżeli wyciągać wszystkie posty i sprawdzać ich date

I tu zastanawiam się czy się nie rozminęliśmy w założeniach. Data samych postów nie jest istotna sama w sobie. Modyfikacja miałaby na celu wykluczenie z listy posterów tych użytkowników, którzy od X czasu byli nieaktywni - opcja a) data ostatniego logowania b) ostatnia aktywność (post).

(14.03.2016, 16:21)Supryk napisał(a): Dobry z Ciebie użytkownik więc trzymaj gotowca

Aż się ciepło na sercu zrobiło :D
Gotowca sprawdziłem i efekt był jeden - wyświetlanie jednego użytkownika, nieaktywnego od 5 lat, z id ok. 80, liczbą postów: 1. W tabeli wyświetlił się tylko i wyłącznie on, a liczba 279 została uznana jako jego suma postów. ID jego jedynego, a więc i ostatniego posta było inne, ok. 1600.

Nie bardzo rozumiem dlaczego p.pid jest traktowany jako postnum w tym kodzie, a także p.dateline >= u.lastactive.

Pozostaje jeszcze kwestia określenia długości dozwolonej nieaktywności - po jakim czasie poza forum wylatuje się z tabeli.
Dzięki za zainteresowanie! :)
"Try not. Do... or do not. There is no try."
Poświęć 5 minut. Nie bądź ignorantem!  -  Jak zbadać element?
aaahhh teraz rozumiem

to powiedz mi

$czasnieaktywnosci TIME_NOW-(60*60*24// 24 godziny od ostatniej wizyty
$sql "SELECT username, usergroup, displaygroup, postnum, uid, avatar, avatardimensions, lastvisit
                FROM "
.TABLE_PREFIX."users 
                WHERE uid != '' "
$tpl['ignore_groups'] . " AND lastvisit > '{$czasnieaktywnosci}'
                ORDER BY postnum DESC 
                LIMIT "
.(int)$this->getConfig('Limit_Posters').""
Zjadłeś średnik po time_now();, ale poza tym wygląda na to, że działa! :)
W zasadzie myślałem, że będzie to bardziej skomplikowane.

Dzięki @Supryk! :)
"Try not. Do... or do not. There is no try."
Poświęć 5 minut. Nie bądź ignorantem!  -  Jak zbadać element?
Średnik zjadłem po całym wyrażeniu, zobacz że pomiędzy TIME_NOW a resztą wyrażenia jest minus, bo to działanie. TIME_NOW to nie funkcja tylko stała MyBB.
Rzeczywiście, zły dobór słów z mojej strony. Jak najbardziej chodziło średnik na koniec wyrażenia.
"Try not. Do... or do not. There is no try."
Poświęć 5 minut. Nie bądź ignorantem!  -  Jak zbadać element?



Użytkownicy przeglądający ten wątek:

1 gości