Webboard

Pełna wersja: TopStats modyfikacja - zależne od ostatniej aktywności użytkownika
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
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. 

Kod PHP:
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 :)?
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 :)

Kod PHP:
$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! :)
aaahhh teraz rozumiem

to powiedz mi

Kod PHP:
$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 ! :)
Ś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.