Seite 1 von 2

[request] Neues "New Posts in this Forum"-System?

Verfasst: 02.09.2004 18:31
von m.sherling
Hallo allerseits,

ich muss gestehen, mich nicht so recht mit dem System anfreunden zu können, das der Markierung von Foren als "enthält neue Beiträge" oder "enthält keine neuen Beiträge" zugrunde liegt. Soweit ich mir die Sache angesehen habe, scheint es so zu funktionieren: Sobald sich in einem Forum ungelesene Beiträge befinden, wird es auf der Index-Seite mit dem "New Posts"-Icon angezeigt. Das ist zwar logisch und macht Sinn, aber stört manchmal, wie zum Beispiel in dieser Situation:

Man besucht ein Forum und findet dort zwei ungelesene Themen vor. Eines davon interessiert einen nicht, das andere hingegen schon. Folglich klickt man letzteres an, liest sich den Inhalt durch und kehrt hernach auf die Index-Seite zurück. Dort angekommen ist aber das Forum immer noch mit dem "New Posts"-Indikator versehen. Wenn man sich nicht gerade die letzte Posting-Zeit und den Benutzernamen des letzten Posters in dem Thread gemerkt hat, den man gerade gelesen hatte, ist es unmöglich, zu unterscheiden, ob dort ein neuer Beitrag auf einen wartet oder das Skript einfach nur das "New Posts"-Symbol darstellt, weil man den zweiten Thread nicht gelesen hat.

Natürlich verstehe ich, dass im Wesentlich für solche Fälle der "mark as read"-Button da ist. Aber er erfordert einen Klick und ein neues Browserfenster (im anderen möchte man ja den interessanten Thread lesen), ist also nicht optimal. Besser wäre – jedenfalls meiner Meinung nach – folgende Handhabung:

Das Forumsskript könnte sich die letzte Zeit meines Besuchs im jeweiligen Forum merken und beim Reload der Index-Seite nur überprüfen, ob nach dieser Zeit noch Beiträge gepostet wurden. Nur in diesem Fall würde es dann den "New Posts"-Indikator für das Forum setzen (der dann auch ein wirklicher "New Posts"-Indikator wäre und kein "unread Posts"-Indikator).

Eine verhältnismäßig einfache Lösung wäre es, nach der Anzeige des Foruminhaltes in der viewforum.php alle Themen automatisch als gelesen markieren zu lassen. Das würde aber in zwei Situationen Probleme bereiten: Erstens dort, wo man mit den Darstellungsoptionen (Anzeige der letzten x Tage/Monate/Wochen ...) experimentiert (nach einem Reload wäre alles als gelesen markiert), zweitens dort, wo man einen Thread vielleicht willentlich nicht liest, um ihn sich für später aufzuheben.

Kann mir jemand helfen? Ich würde mich über jede Unterstützung sehr freuen.

Beste Grüße

M. Sherling

Verfasst: 03.09.2004 16:27
von m.sherling
Müsste doch eigentlich gar nicht so schwierig sein, wenn man in der index.php den richtigen Abschnitt findet. Nur welcher ist das?

Beste Grüße

M. Sherling

Verfasst: 03.09.2004 21:41
von Acid
Einzig mit Änderungen an der index.php ist es nicht getan.
Du kannst dir ja mal dieses Thema anschauen (entspricht zwar nicht ganz deinen Vorstellungen, aber eventuell dennoch interessant für dich).

Verfasst: 05.09.2004 16:18
von m.sherling
Vielen Dank, der Hinweis ist gut. Leider wird das aber wohl doch nicht das richtige für mich sein, da ich weitere Datenbank-Lösungen gerne vermeiden möchte – schon in der derzeitigen Version würde ich mir für mein Board mehr Geschwindigkeit wünschen, weswegen ich ein Mehr an Datenbankabfragen unbedingt vermeiden möchte.

Bez. der index.php: Kommt nicht am Ende alles auf diese Funktion an?

Code: Alles auswählen

        //
        // Obtain a list of topic ids which contain
        // posts made since user last visited
        //
        if ( $userdata['session_logged_in'] )
        {
                $sql = "SELECT t.forum_id, t.topic_id, p.post_time
                        FROM " . TOPICS_TABLE . " t, " . POSTS_TABLE . " p
                        WHERE p.post_id = t.topic_last_post_id
                                AND p.post_time > " . $userdata['user_lastvisit'] . "
                                AND t.topic_moved_id = 0";
                if ( !($result = $db->sql_query($sql)) )
                {
                        message_die(GENERAL_ERROR, 'Could not query new topic information', '', __LINE__, __FILE__, $sql);
                }
         
                $new_topic_data = array();
                while( $topic_data = $db->sql_fetchrow($result) )
                {
                        $new_topic_data[$topic_data['forum_id']][$topic_data['topic_id']] = $topic_data['post_time'];
                }                       
                $db->sql_freeresult($result);
        }
Nur wo lässt sich da die richtige Einstellung treffen? Für mich klingt p.post_time > " . $userdata['user_lastvisit'] . " im Wesentlichen nach der richtigen Abfrage. Aber pro User steht in der Datenbank nur ein Wert für user_lastvisit. Theoretisch müsste doch ein Wert für alle Subforen vorhanden sein?

Vielleicht kann mich jemand, der sich etwas besser in PHP und dem phpBB-code auskennt (was nicht schwierig ist ... ), aufklären? Ich bin für jeden Hinweis dankbar! :-)

Beste Grüße

M. Sherling

Verfasst: 05.09.2004 20:37
von Acid
Ja, aber wenn du es dann für die einzelnen Unterforen speicherst, müsste dies auch in der Datenbank eingetragen werden, womit du wieder bei einer Anpassung dieser wärst. :wink:
Wenn man sich nicht gerade die letzte Posting-Zeit und den Benutzernamen des letzten Posters in dem Thread gemerkt hat, den man gerade gelesen hatte, ist es unmöglich, zu unterscheiden, ob dort ein neuer Beitrag auf einen wartet oder das Skript einfach nur das "New Posts"-Symbol darstellt, weil man den zweiten Thread nicht gelesen hat.
Wenn man dann ins Forum geht, wird ja angezeigt welche der Themen neu ist. Wenn man sich ausloggt oder das Forum verlässt und später wiederkommt, ist das uninteressante Thema als gelesen markiert (wenn kein neuer Beitrag geschrieben wurde).
Natürlich verstehe ich, dass im Wesentlich für solche Fälle der "mark as read"-Button da ist. Aber er erfordert einen Klick und ein neues Browserfenster (im anderen möchte man ja den interessanten Thread lesen)
Man kann ja den Thread zuerst lesen und dann die restlichen Themen als gelesen markieren (und es öffnet sich ja kein neues Browserfenster). ;)
Das Forumsskript könnte sich die letzte Zeit meines Besuchs im jeweiligen Forum merken und beim Reload der Index-Seite nur überprüfen, ob nach dieser Zeit noch Beiträge gepostet wurden.
So ist es ja eigentlich. Allerdings wird die Zeit des letzten Besuches erst neu eingetragen, wenn man das Board verlässt oder die Session abgelaufen ist.

Verfasst: 05.09.2004 21:12
von BigRib
Ich stelle mir das auch ned so einfach vor. Woher soll das Forum wissen ob du die Topic ansicht verlassen hast um ein Topic zu lesen, oder ob du es verlassen hast weil du alle interesannten gelesen hast?

Zum anderen würde ich mich fragen ob das auch im interesse der anderen user ist. Ich hab die erfahrung gemacht das die Themen in einem normalen Forum eh schon viel zu schnell als gelesen markiert werden.

Verfasst: 06.09.2004 10:02
von m.sherling
Acid hat geschrieben:Ja, aber wenn du es dann für die einzelnen Unterforen speicherst, müsste dies auch in der Datenbank eingetragen werden, womit du wieder bei einer Anpassung dieser wärst. :wink:
Da hast Du ja völlig Recht. Aber das ist ja auch nicht der Weg, den ich gehen würde: Ich würde bei der Anzeige der Index-Übersicht folgenden Code (hier mal als "Trivialcode" skizziert) ausführen wollen:

if(this_forum.any_post.posttime > this_forum.user.lastvisit) {$icon = new_threads_in_this_forum.gif} else {$icon = no_new_threads_in_this_forum.gif}

Nur, wie komme ich an diesen Wert für den letzten Besuch des Users in einem Forum heran? Momentan wird der im Cookie gespeichert, oder?
Wenn man dann ins Forum geht, wird ja angezeigt welche der Themen neu ist. Wenn man sich ausloggt oder das Forum verlässt und später wiederkommt, ist das uninteressante Thema als gelesen markiert (wenn kein neuer Beitrag geschrieben wurde).
Das wäre ja in meiner Variante ebenso. Nur würde dann auf der Index-Seite nicht mehr der Neu-Indikator zu sehen sein, weil man das Forum ja schon verlassen hat, ohne die Threads zu lesen (und bei meiner Variante würde auch kein Thread als "gelesen" markiert, nur weil ich mich mal aus dem Forum ausgeloggt habe – das ist meines Erachtens nicht logisch).

Auf den Punkt gebracht wünsche ich mir eben einfach einen "New posts"-Indikator an Stelle des bisherigen "Unread Posts"-Indikators.
Man kann ja den Thread zuerst lesen und dann die restlichen Themen als gelesen markieren (und es öffnet sich ja kein neues Browserfenster). ;)
Hmm. Ich gehe in ein Forum, klicke auf einen Thread, lese ihn, drücke den "Back"-Button des Browsers, klicke auf "Alles gelesen", warte einen Moment und klicke dann auf "Forum" in den Navigationslinks. Umständlich, oder? (Zugegeben, bei mir wird man nach "Alles gelesen" direkt zum Forum geleitet, das habe ich geändert) Warum kann man nicht direkt aus dem Thread heraus auf "Forum" in der Navigationsübersicht (diese hierarchische Struktur: Forum -> Board -> Thread) klicken, um damit zu einer Index-Seite zurückzukehren, auf der das jeweilige Board nicht mehr als "neu" markiert ist?

Meine Variante ist gar nicht so schlecht, wenn man sie sich genau überlegt. Auf diese Art und Weise funktioniert es beispielsweise bei den YaBB-Foren. Eine Software, die ich jahrelang eingesetzt habe, bevor ich auf phpBB umstieg. Nun bin nicht nur ich an das alte Schema gewöhnt, sondern auch meine User – und viele meckern schon.

Es ist ja nicht so, dass man sich nicht umgewöhnen könnte. Nur wenn man beide Systeme kennt, geht es zumindest mir (und vielen Dutzend Board-Besuchern meines Forums) so, dass einem die andere Variante besser gefällt :-).
Ich stelle mir das auch ned so einfach vor. Woher soll das Forum wissen ob du die Topic ansicht verlassen hast um ein Topic zu lesen, oder ob du es verlassen hast weil du alle interesannten gelesen hast? Zum anderen würde ich mich fragen ob das auch im interesse der anderen user ist. Ich hab die erfahrung gemacht das die Themen in einem normalen Forum eh schon viel zu schnell als gelesen markiert werden.
Das Forum würde das gar nicht wissen und auch gar nicht wissen müssen. Und der zweite Punkt: Noch besser, denn "mein Forum" würde niemals auch nur einen einzigen Thread als "gelesen" markieren (es sei denn, der User klickt explizit auf "Alles gelesen"). Nicht einmal dann, wenn sich jemand ausloggt und später wiederkommt. (Das stört mich nämlich auch – wieso bestimmt mein Forum, was ich schon gelesen habe?) Das einzige, was "mein Forum" tun würde, wäre, eben wirklich nur anzuzeigen, ob es "neue" Beiträge in einem Subforum gibt oder nicht – und "neu" im Sinne von "seit dem letzten Besuch hinzugekommen" und nicht im Sinne von "das hier haben Sie noch nicht gelesen. Nun aber los, denken Sie ja nicht, sie werden meinen Hinweis sonst los!". ;-)

Beste Grüße

M. Sherling

Verfasst: 07.09.2004 20:28
von Acid
if(this_forum.any_post.posttime > this_forum.user.lastvisit) {$icon = new_threads_in_this_forum.gif} else {$icon = no_new_threads_in_this_forum.gif}

Nur, wie komme ich an diesen Wert für den letzten Besuch des Users in einem Forum heran? Momentan wird der im Cookie gespeichert, oder?
Ja, der korrekte Wert für´s "last_visit" steht im Cookie. Es gibt zwar ein Feld "user_lastvisit" in der "users" Tabelle, aber dort wird der vorletzte Besuch eines Users gespeichert (um´s dann auf dem Index bei "dein letzter Besuch.." anzeigen zu lassen).
Es gibt einen Last Visit MOD, dessen Änderungen dann einen "korrekten" last_visit-Wert ausgeben (was aber Änderungen an Dateien/Datenbank erfordert).

Was auch immer du versuchst an dem "new post"-System zu verändern... irgendwo müssen die Informationen ja gespeichert werden (an Änderungen an Dateien/Datenbank wirst du nicht herum kommen).
Warum kann man nicht direkt aus dem Thread heraus auf "Forum" in der Navigationsübersicht (diese hierarchische Struktur: Forum -> Board -> Thread) klicken, um damit zu einer Index-Seite zurückzukehren, auf der das jeweilige Board nicht mehr als "neu" markiert ist?
Man könnte versuchen, diese Navigation-Links mit dem mark as read-Code zu verbinden, so das beim Benutzen dieser dann die Foren als gelesen markiert werden, aber ist die Frage, ob die User diese Links auch immer benutzen.

Verfasst: 10.09.2004 17:25
von m.sherling
Um Änderungen nicht herum kommen – vielleicht doch. Ich stelle mir da folgendes vor:

Für jedes Subforum ist also der lastvisit-Timestamp im Cookie gesichert. Und an irgend einer Stelle bei der Darstellung der Foren-Übersicht muss ja nun abfragen können (wieder "Trivialcode"):

if ( forum_xyz.any_post.posttime > readfromcookie(forum_xyz.lastvisit)) {$icon = new_threads_in_forum.gif} else {$icon = no_new_threads_in_forum.gif}

Anstelle der bisherigen Abfrage, die darauf abstellt, ob Themen im Forum noch nicht gelesen wurden. Oder irre ich mich?

Die Idee bez. der Nav-Links ist mir auch schon gekommen, leider ist es keine gute Lösung – immerhin würden ja dann alle anderen Themen auch als gelesen markiert werden (das möchte ich nicht) und zudem gibt es genügend Anwender, die einfach den "Zurück"-Button des Browsers verwenden.

Beste Grüße

M. Sherling

Verfasst: 19.09.2004 10:57
von m.sherling
Na, noch eine kleine Idee? Ein klitzekleiner Hinweis vielleicht? Ich bin für alles dankbar.

Beste Grüße

M. Sherling