Seite 1 von 2

Top Poster

Verfasst: 05.04.2014 21:35
von Maugrim
Hallo :)

Ich suche eine Möglichkeit den Top-Poster mit einem Icon zu kennzeichnen.

Der Top-Poster Mod den ich bisher gefunden habe, erzeugt nur eine Liste auf dem Index in welcher die Top-X Poster angezeigt werden
Genau das möchte ich nicht.

Ich möchte nur, dass in den Beiträgen und auch im Profil des postingstärksten Users ein kleines Icon zu sehen ist.



EIgentlich suche ich einen Mod um den User mit den meisten Points (femus ultimate points mod) derart hervorzuheben. Wenn es aber eine Mod gibt, die das mit den Beiträgen macht, kann ich ja vielleicht die Abfrage auf die Points umschreiben :)


Weiß jemand vielleicht einen Rat?

Re: Top Poster

Verfasst: 05.04.2014 21:47
von Miriam
Ein Ansatz könnte sein, die User ID des aktuellen Top-Posters in der config Tabelle zu speichern. Diese gespeicherte ID wird dann mit der des zu untersuchenden Users verglichen.
Somit wäre es möglich, mittels einer Templatevariablen, meinetwegen TOPUSER, eine Entscheidung zutreffen, die, wenn sie wahr ist, per CSS Style ein Top-Poster-Icon zuweist.

Aber hey, Du kannst es auch ganz anders machen.

Re: Top Poster

Verfasst: 05.04.2014 22:23
von Maugrim
Miriam hat geschrieben:Aber hey, Du kannst es auch ganz anders machen.
wie denn? :D
von Hand jedes Mal eintragen? :D

Re: Top Poster

Verfasst: 05.04.2014 22:30
von Miriam
Wieviele Ansätze / Wege zur Lösung Deines Problems brauchst Du denn?

Re: Top Poster

Verfasst: 05.04.2014 22:44
von Maugrim
äh, ich denke mal einen :-?
Aber mit nem Ansatz alleine kann ich nur wenig anfangen. Ich kann vllt einen bestehenden Mod an meine Bedürfnisse anpassen, aber einen eigenen machen nicht.

Ich dachte ja dass man einfach die user_points Tabelle (dort stehen die Points drin, die der User hat, wie eben auch die user_posts tabelle) mit einer SQL Abfrage absteigend auswertet und nur das höchste ergebnis ausliest.

Re: Top Poster

Verfasst: 05.04.2014 22:47
von Miriam
Das kannst Du so machen. Wo genau brauchst Du Hilfe?

Re: Top Poster

Verfasst: 06.04.2014 00:18
von Maugrim
wie muss die sql abfrage aussehen?

und wie übergebe ich das ergebnis an die viewtopic sowie an die memberlist?

Re: Top Poster

Verfasst: 06.04.2014 10:59
von Miriam
Die Datenbank könntest Du so auf Stand bringen:
In der includes/functions_posting.php
  • finde:

    Code: Alles auswählen

        $url = append_sid($url, 'f=' . $data['forum_id'] . $params) . $add_anchor;
    danach füge ein:

    Code: Alles auswählen

        // start find top poster
        $sql_array = array(
            'SELECT'    => 'COUNT(p.post_id) AS max_posts, p.poster_id, u.username',
            
            'FROM'        => array(
                POSTS_TABLE => 'p',
            ),
            
            'LEFT_JOIN' => array(
                array(
                    'FROM'    => array(USERS_TABLE => 'u',),
                    'ON'    => 'p.poster_id = u.user_id',
                )
            ),
            
            'ORDER_BY'        => 'max_posts DESC',
        );
                
        $sql = $db->sql_build_query('SELECT', $sql_array);        
        $result = $db->sql_query_limit($sql, 1);
        $row = $db->sql_fetchrow($result);    
    
        set_config('top_poster_id', $row['poster_id']);
        set_config('top_poster_name', $row['username']);
        // end find top poster               
Jetzt hast Du die Variablen $config['top_poster_id'] und $config['top_poster_name'], die Dir immer den aktuellen Top-Poster angeben.
Diese werden immer aus der Anzahl der im Forum vorhandenen Beiträge errechnet.
Wenn Du das so nicht möchtest, weil Du bspw. immer mal wieder Themen / Beiträge löschst, kannst Du die Query auch einfacher gestalten und die Daten nur aus der Usertabelle auslesen.

Im neuen Code finde:
  • Code: Alles auswählen

        $sql_array = array(
            'SELECT'    => 'COUNT(p.post_id) AS max_posts, p.poster_id, u.username',
            
            'FROM'        => array(
                POSTS_TABLE => 'p',
            ),
            
            'LEFT_JOIN' => array(
                array(
                    'FROM'    => array(USERS_TABLE => 'u',),
                    'ON'    => 'p.poster_id = u.user_id',
                )
            ),
            
            'ORDER_BY'        => 'max_posts DESC',
        );
                
        $sql = $db->sql_build_query('SELECT', $sql_array);
und tausche es aus gegen:
  • Code: Alles auswählen

        $sql = 'SELECT user_id AS poster_id, username FROM ' . USERS_TABLE . '
                ORDER BY user_posts DESC';

In der includes/functions.php
  • finde:

    Code: Alles auswählen

        // The following assigns all _common_ variables that may be used at any point in a template.
        $template->assign_vars(array(
    danach füge ein:

    Code: Alles auswählen

            'TOP_POSTER_ID'                    => $config['top_poster_id'],
            'TOP_POSTER_NAME'                => $config['top_poster_name'],
Jetzt hast Du eine Template Variable TOP_POSTER_ID und TOP_POSTER_NAME überall verfügbar.

Nun noch flink ein Beispiel der Nutzung in der Themenanzeige:
In der /styles/prosilver/template/viewtopic_body.html
  • finde:

    Code: Alles auswählen

                    <!-- IF not postrow.U_POST_AUTHOR --><strong>{postrow.POST_AUTHOR_FULL}</strong><!-- ELSE -->{postrow.POST_AUTHOR_FULL}<!-- ENDIF -->
    davor füge ein:

    Code: Alles auswählen

    <!-- IF postrow.POSTER_ID eq TOP_POSTER_ID -->hier kommt dein Bild hin <!-- ENDIF -->
Das kannst Du dann noch ein bißchen hübscher machen.
Für die memberlist sollte das genauso passen. Brauchst Du nur abkupfern.

Denke dran: KB:tippstyles

Re: Top Poster

Verfasst: 06.04.2014 13:49
von Maugrim
also ich habe jetzt in der funktions-posting

Code: Alles auswählen

        // start find top poster
        $sql = 'SELECT user_id AS poster_id, username FROM ' . USERS_TABLE . '
                ORDER BY user_posts DESC';
    $result = $db->sql_query_limit($sql, 1);
    $row = $db->sql_fetchrow($result);    

    set_config('top_poster_id', $row['poster_id']);
    set_config('top_poster_name', $row['username']);
    // end find top poster  
 
in der functions habe ich

Code: Alles auswählen

        'TOP_POSTER_ID'                    => $config['top_poster_id'],
        'TOP_POSTER_NAME'                => $config['top_poster_name'],
 
und in der viewtopic_body das hier

Code: Alles auswählen

<!-- IF postrow.POSTER_ID eq TOP_POSTER_ID -->hier kommt dein Bild hin <!-- ENDIF -->
leider wird nichts ausgegeben

wenn ich nur {postrow.POSTER_ID} im Template setze zeigt mir die korrekte ID des Autors an
wenn ich {TOP_POSTER_ID} oder {TOP_POSTER_NAME} ins Template schreibe wird nichts ausgegeben
die IF Funktion kann also nichts vergleichen.
:-?

Re: Top Poster

Verfasst: 06.04.2014 14:40
von Miriam
Sie vergleicht schon.
Aber die Prüfung auf Gleichheit gibt false, weil die Werte eben nicht gleich sind.
Hast du mal einen Blick in die config Tabelle geworfen und gecheckt, ob die neuen Werte eingetragen wurden?