Hallo, Gast! (Registrieren)

Wir wünschen allen Besuchern frohe Ostern!

Letzte Ankündigung: MyBB 1.8.37 veröffentlicht (04.11.23)


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste
Anzeige neuer Postings
#1
Hallo,

ich habe noch eine Frage, und zwar zur Anzeige neuer Postings. Im Standardtheme sind die Buttons neben den Foren ja grau, wenn es nichts neues gibt, und hellblau mit Pfeil wenn es etwas neues in dem Forum gibt. Das funktioniert eigentlich auch ganz wunderbar, erst kürzlich habe ich herausgefunden daß man sogar auf den blauen Pfeil klicken kann, um ein Forum als gelesen zu markieren. Sowas hatte ich noch in keinem anderen Forum.

Äh ja ich wollte was fragen. Und zwar, wenn ich ein Unterforum habe, und ich mache ein neues Posting oder eine neue Antwort in diesem Unterforum. Dann wird mir in der Hauptübersicht das Forum als neu angezeigt. Obwohl das Posting ja von mir selbst geschrieben ist.

Daher meine Frage wie das bei MyBB mit der gelesen / neu Markierung in den Foren überhaupt gedacht ist - ist das eine individuelle Einstellung für jeden User, also werden jedem User nur die Threads als neu angezeigt, die er noch nicht gelesen hat? Oder ist das einfach nur eine Hervorhebung für kürzlich gemachte Postings?

Mir wäre es lieber, wenn die Neu Markierung nur aktiv werden würde, wenn jemand anderes etwas neues geschrieben hat. Kann man dazu irgendwo irgendwas einstellen?

Vielen Dank für Tips und Hinweise Blush
#2
Zitat:Daher meine Frage wie das bei MyBB mit der gelesen / neu Markierung in den Foren überhaupt gedacht ist - ist das eine individuelle Einstellung für jeden User, also werden jedem User nur die Threads als neu angezeigt, die er noch nicht gelesen hat? Oder ist das einfach nur eine Hervorhebung für kürzlich gemachte Postings?
Es werden natürlich für jeden Benutzer individuell die Beiträge markiert, die noch nicht gelesen sind. Wenn du deinen eigenen Beitrag nicht gelesen hast, gehört der halt dazu und wird auch als neu angezeigt. Das ist aber im Regelfall nicht so, weil du ja nach der Beitragserstellung direkt zu dem Beitrag weitergeleitet wirst.
#3
(09.11.2008, 18:39)Mak schrieb: Wenn du deinen eigenen Beitrag nicht gelesen hast, gehört der halt dazu und wird auch als neu angezeigt.

Ja, auf den Beitrag werde ich eh immer weitergeleitet. Nur wenn der Beitrag in einem Unterforum eines anderen Forums gemacht wird, erscheint das Forum trotzdem als neu. Ist das dann einfach wieder ein Bug? Sad
#4
Bei Unterforen ist das Problem bekannt. Das kann man leider auch nicht so einfach lösen.
[Bild: banner.png]

Bitte die Foren-Regeln beachten und im Profil die verwendete MyBB-Version angeben.
#5
(09.11.2008, 19:41)Dragon schrieb: Bei Unterforen ist das Problem bekannt. Das kann man leider auch nicht so einfach lösen.

Danke für die Info. Gibt es zu dem Thema einen (öffentlich einsehbaren) Bugreport?

Wie stellt MyBB denn fest ob ein Forum neu ist? Die meisten Foren arbeiten ja mit User-zuletzt gelesen-Timestamp vs. Forum-zuletzt geändert-Timestamp, und ggf. eine zusätzliche (un)gelesene-Threads-Liste falls der User fieserweise neue Threads liest aber alte ungelesen läßt.

Falls das Problem vom Timestamp kommt könnte man es mit einem weiteren Timestamp Feld im Forum leicht lösen... ShyRolleyes

Habe einen Bug-Report dazu gefunden:
http://community.mybboard.net/thread-39298.html

Steht leider nicht viel an Details drin. Muss mich wohl mal durch den PHP-Code wühlen um das nachzuvollziehen. Sad
#6
Es wäre denkbar diese Funktion mit ausreichenden Kenntnissen als Plugin nachzurüsten. Das wäre sicherlich für viele interessant.

Gruß,
Michael
[Bild: banner.png]
Support erfolgt NUR im Forum!
Bitte gelöste Themen als "erledigt" markieren.
Beiträge mit mangelhafter Rechtschreibung/Grammatik werden kommentarlos gelöscht.
#7
Ich hab mir grad den Code dazu durchgelesen. Ich hab das noch nicht getestet, aber es scheint daran zu liegen, daß zuerst das neueste Posting aus einem Subforum geholt wird, das dann aber gegen den Hauptforums-zuletzt gelesen-Timestamp verglichen wird. Wenn man dann nur das Subforum, aber nicht das Hauptforum gelesen hat, geht das halt schief. Muss ich mal mit Debugmeldungen testen ob ich das so richtig verstanden habe...

Wenn es das ist, dann ist das ein kleiner Logikfehler. Warum der Developer das mit zu rechenintensiv begründet, versteh ich noch nicht. Mal schauen...
#8
(09.11.2008, 21:34)frostschutz schrieb: Wenn es das ist, dann ist das ein kleiner Logikfehler. Warum der Developer das mit zu rechenintensiv begründet, versteh ich noch nicht. Mal schauen...
Solltest du wirklich auf einen Fehler stossen, bitte ich dich diesen hier zu melden. Das rechenintensive daran ist, dass bei jedem Aufruf für jeden Benutzer und jedes Forum alle Unterforen rekursiv auf neue und gelesene Beiträge überprüft werden müssen. Je nach Größe des Forums und der Intensität der Verschachtelung der einzelnen Foren kann das u.a. den Datenbankserver übermäßig belasten.

Gruß,
Michael
[Bild: banner.png]
Support erfolgt NUR im Forum!
Bitte gelöste Themen als "erledigt" markieren.
Beiträge mit mangelhafter Rechtschreibung/Grammatik werden kommentarlos gelöscht.
#9
Also was ich bisher gemacht habe ist eine Debugmeldung in get_forum_lightbulb() eingebaut.

Bei mir hat das Hauptforum die ID 27, das Subforum die ID 33.

Wenn man nun die Forenliste aufruft, wird das letzte Posting gesucht. Dazu wird das Hauptforum sowie alle Subforen rekursiv durchgegangen. Damit in der rechten Spalte eben das letzte neuste Posting angezeigt werden kann. Dieses Posting hat bei mir den Timestamp 1226263826 (Sekunden seit 1970 oder weiss der Geier, also je höher die Zahl desto neuer).

Jeder User hat jetzt zu jedem Forum und Subforum auch einen "zuletzt gelesen" Timestamp gespeichert. Ist dieser Timestamp kleiner (älter) als der Timestamp vom Lastpost gilt das Forum als neu.

Bei mir ist der "zuletzt gelesen" Timestamp des Subforums 33 den Wert 1226263828. Das ist größer (neuer) als 1226263826, ergo gilt das Subforum als gelesen (lightbulb aus). Beim Hauptforum 27 ist der zuletzt gelesen Wert 1226186946. Das ist kleiner (älter) als 1226263826 ergo ist die Lightbulb an. Obwohl das falsch ist.

Problem ist daß die lightbulb-Forum an der Stelle nicht weiß, das der lastpost aus einem Subforum kommt und das Subforum schon als gelesen gilt. Man kann die Lightbulb aber auch nicht einfach auf off setzen bloss weil das letzte Posting aus dem Subforum schon gelesen ist. In dem Forum kann es ja trotzdem noch weitere ungelesene Postings geben (auch in einem anderen Subforum) die halt bloss etwas älter sind als das letzte Posting.

Diese Information holt sich build_forumbits() bereits rekursiv, nur schmeisst sie die Information wieder weg weil sie an der Stelle nur am lastpost interessiert ist. Die lightbulb-Funktion würde die Information brauchen bekommt dann aber nur den lastpost übergeben, was nicht ausreicht.

Ich halte den Fehler für behebbar, mal weiterprobieren...
Hier ist ein erster Versuch (Geänderte Datei: functions_forumlist.php). Die Idee ist, bei dem Code, der sowieso schon die Foren rekursiv durchläuft, den "Ungelesen" Status ans Parent-Forum weiterzuvererben und eben "Ungelesen" nicht mehr nur am "Last Post" festzumachen. Ich habe das mit mehreren Subsubsubsubforen getestet und es scheint immer korrekt anzuzeigen, ob und in welchen Foren es ein neues Posting gibt.

Allerdings treten durch diese Änderung eine ganze Reihe an anderen Problemen zutage:

- Forum als gelesen markieren, markiert nicht alle Unterforen als gelesen (wenn man nach dem als Gelesen markieren ins Forum reingeht kommen tatsächlich ungelesene Postings zutage, liegt also nicht an mir).

- Es werden ja nicht alle Unterforen angezeigt, sondern nur 2 und dann steht "7 weitere" dabei. Hier wäre es schön so umsortieren daß die Unterforen in denen es etwas neues gibt, am Anfang in der Liste stehen... Wink

- Der alte Code hat vorher nicht alle Unterforen nach neuen Postings abgesucht, also das Forum nicht als neu markiert, auch wenns im 5. Unterforum was neues gab. Wenn der Thread aus dem 5. Unterforum der neuste war hat er den schon angezeigt, nur das als neu markieren vergessen Rolleyes

Also die ganze Logik mit Unterforen ist hier etwas problematisch und sollte vielleicht nochmal analysiert und neu konzipiert werden.

PHP-Code:
/**
* Build a list of forum bits.
*
* @param int The parent forum to fetch the child forums for (0 assumes all)
* @param int The depth to return forums with.
* @return array Array of information regarding the child forums of this parent forum
*/
function build_forumbits($pid=0$depth=1)
{
    global 
$fcache$moderatorcache$forumpermissions$theme$mybb$templates$bgcolor$collapsed$lang$showdepth$plugins$parser$forum_viewers;

    
$forum_listing '';
        
$bulb_was_on 0;

    
// If no forums exist with this parent, do nothing
    
if(!is_array($fcache[$pid]))
    {
        return;
    }

    
// Foreach of the forums in this parent
    
foreach($fcache[$pid] as $parent)
    {
        foreach(
$parent as $forum)
        {
            
$forums $subforums $sub_forums '';
            
$lastpost_data '';
            
$counters '';
                        
$bulb_is_on 0;

            
// Get the permissions for this forum
            
$permissions $forumpermissions[$forum['fid']];

            
// If this user doesnt have permission to view this forum and we're hiding private forums, skip this forum
            
if($permissions['canview'] != && $mybb->settings['hideprivateforums'] == 1)
            {
                continue;
            }
            
            
$plugins->run_hooks_by_ref("build_forumbits_forum"$forum);

            
// Build the link to this forum
            
$forum_url get_forum_link($forum['fid']);

            
// This forum has a password, and the user isn't authenticated with it - hide post information
            
$hideinfo false;
            if(
$forum['password'] != '' && $mybb->cookies['forumpass'][$forum['fid']] != md5($mybb->user['uid'].$forum['password']))
            {
                
$hideinfo true;
            }
            
            
$lastpost_data = array(
                
"lastpost" => $forum['lastpost'],
                
"lastpostsubject" => $forum['lastpostsubject'],
                
"lastposter" => $forum['lastposter'],
                
"lastposttid" => $forum['lastposttid'],
                
"lastposteruid" => $forum['lastposteruid']
            );
            
            
// Fetch subforums of this forum
            
if(isset($fcache[$forum['fid']]))
            {
                
$forum_info build_forumbits($forum['fid'], $depth+1);

                                if(
$bulb_is_on == && $forum_info['bulb'] == 1)
                                {
                                    
$bulb_was_on $bulb_is_on 1;
                                }

                
// Increment forum counters with counters from child forums
                
$forum['threads'] += $forum_info['counters']['threads'];
                
$forum['posts'] += $forum_info['counters']['posts'];
                
$forum['unapprovedthreads'] += $forum_info['counters']['unapprovedthreads'];
                
$forum['unapprovedposts'] += $forum_info['counters']['unapprovedposts'];
                
$forum['viewers'] += $forum_info['counters']['viewing'];

                
// If the child forums' lastpost is greater than the one for this forum, set it as the child forums greatest.
                
if($forum_info['lastpost']['lastpost'] > $lastpost_data['lastpost'])
                {
                    
$lastpost_data $forum_info['lastpost'];
                }

                
$sub_forums $forum_info['forum_list'];
            }

            
// If we are hiding information (lastpost) because we aren't authenticated against the password for this forum, remove them
            
if($hideinfo == true)
            {
                unset(
$lastpost_data);
            }
            
            
// If the current forums lastpost is greater than other child forums of the current parent, overwrite it
            
if($lastpost_data['lastpost'] > $parent_lastpost['lastpost'])
            {
                
$parent_lastpost $lastpost_data;
            }

            if(
is_array($forum_viewers) && $forum_viewers[$forum['fid']] > 0)
            {
                
$forum['viewers'] = $forum_viewers[$forum['fid']];
            }

            
// Increment the counters for the parent forum (returned later)
            
if($hideinfo != true)
            {
                
$parent_counters['threads'] += $forum['threads'];
                
$parent_counters['posts'] += $forum['posts'];
                
$parent_counters['unapprovedposts'] += $forum['unapprovedposts'];
                
$parent_counters['unapprovedthreads'] += $forum['unapprovedthreads'];
                
$parent_counters['viewers'] += $forum['viewers'];
            }

            
// Get the lightbulb status indicator for this forum based on the lastpost
            
$lightbulb get_forum_lightbulb($forum$lastpost_data$hideinfo$bulb_is_on);

                        if(
$lightbulb['folder'] == "on")
                        {
                            
$bulb_was_on $bulb_is_on 1;
                        }

            
// Done with our math, lets talk about displaying - only display forums which are under a certain depth
            
if($depth $showdepth)
            {
                continue;
            }

            
// Fetch the number of unapproved threads and posts for this forum
            
$unapproved get_forum_unapproved($forum);
            
            if(
$hideinfo == true)
            {
                unset(
$unapproved);
            }

            
// Sanitize name and description of forum.
            
$forum['name'] = preg_replace("#&(?!\#[0-9]+;)#si""&"$forum['name']); // Fix & but allow unicode
            
$forum['description'] = preg_replace("#&(?!\#[0-9]+;)#si""&"$forum['description']); // Fix & but allow unicode
            
$forum['name'] = preg_replace("#&([^\#])(?![a-z1-4]{1,10};)#i""&$1"$forum['name']);
            
$forum['description'] = preg_replace("#&([^\#])(?![a-z1-4]{1,10};)#i""&$1"$forum['description']);

            
// If this is a forum and we've got subforums of it, load the subforums list template
            
if($depth == && $sub_forums)
            {
                eval(
"\$subforums = \"".$templates->get("forumbit_subforums")."\";");
            }
            
// A depth of three indicates a comma separated list of forums within a forum
            
else if($depth == 3)
            {
                if(
$donecount $mybb->settings['subforumsindex'])
                {
                    
$statusicon '';

                    
// Showing mini status icons for this forum
                    
if($mybb->settings['subforumsstatusicons'] == 1)
                    {
                        
$lightbulb['folder'] = "mini".$lightbulb['folder'];
                        eval(
"\$statusicon = \"".$templates->get("forumbit_depth3_statusicon"10)."\";");
                    }

                    
// Fetch the template and append it to the list
                    
eval("\$forum_list .= \"".$templates->get("forumbit_depth3"10)."\";");
                    
$comma ', ';
                }

                
// Have we reached our max visible subforums? put a nice message and break out of the loop
                
++$donecount;
                if(
$donecount == $mybb->settings['subforumsindex'])
                {
                    if(
subforums_count($fcache[$pid]) > $donecount)
                    {
                        
$forum_list .= $comma.$lang->sprintf($lang->more_subforums, (subforums_count($fcache[$pid]) - $donecount));
                    }
                }
                continue;
            }


            
// Forum is a category, set template type
            
if($forum['type'] == 'c')
            {
                
$forumcat '_cat';
            }
            
// Forum is a standard forum, set template type
            
else
            {
                
$forumcat '_forum';
            }

            if(
$forum['linkto'] == '')
            {
                
// No posts have been made in this forum - show never text
                
if(($lastpost_data['lastpost'] == || $lastpost_data['lastposter'] == '') && $hideinfo != true)
                {
                    
$lastpost "<div style=\"text-align: center;\">{$lang->lastpost_never}</div>";
                }
                elseif(
$hideinfo != true)
                {
                    
// Format lastpost date and time
                    
$lastpost_date my_date($mybb->settings['dateformat'], $lastpost_data['lastpost']);
                    
$lastpost_time my_date($mybb->settings['timeformat'], $lastpost_data['lastpost']);

                    
// Set up the last poster, last post thread id, last post subject and format appropriately
                    
$lastpost_profilelink build_profile_link($lastpost_data['lastposter'], $lastpost_data['lastposteruid']);
                    
$lastpost_link get_thread_link($lastpost_data['lastposttid'], 0"lastpost");
                    
$lastpost_subject $full_lastpost_subject $parser->parse_badwords($lastpost_data['lastpostsubject']);
                    if(
my_strlen($lastpost_subject) > 25)
                    {
                        
$lastpost_subject my_substr($lastpost_subject025)."...";
                    }
                    
$lastpost_subject htmlspecialchars_uni($lastpost_subject);
                    
$full_lastpost_subject htmlspecialchars_uni($full_lastpost_subject);
                    
                    
// Call lastpost template
                    
if($depth != 1)
                    {                        
                        eval(
"\$lastpost = \"".$templates->get("forumbit_depth{$depth}_forum_lastpost")."\";");
                    }
                }

                
$forum_viewers_text '';
                if(
$mybb->settings['showforumviewing'] != && $forum['viewers'] > 0)
                {
                    if(
$forum['viewers'] == 1)
                    {
                        
$forum_viewers_text $lang->viewing_one;
                    }
                    else
                    {
                        
$forum_viewers_text $lang->sprintf($lang->viewing_multiple$forum['viewers']);
                    }
                    
$forum_viewers_text "<span class=\"smalltext\">{$forum_viewers_text}</span>";
                }
            }
            
// If this forum is a link or is password protected and the user isn't authenticated, set lastpost and counters to "-"
            
if($forum['linkto'] != '' || $hideinfo == true)
            {
                
$lastpost "<div style=\"text-align: center;\">-</div>";
                
$posts "-";
                
$threads "-";
            }
            
// Otherwise, format thread and post counts
            
else
            {
                
$posts my_number_format($forum['posts']);
                
$threads my_number_format($forum['threads']);
            }

            
// Moderator column is not off
            
if($mybb->settings['modlist'] != 0)
            {
                
$done_moderators = array();
                
$moderators '';
                
// Fetch list of moderators from this forum and its parents
                
$parentlistexploded explode(','$forum['parentlist']);
                foreach(
$parentlistexploded as $mfid)
                {
                    
// This forum has moderators
                    
if(is_array($moderatorcache[$mfid]))
                    {
                        
// Fetch each moderator from the cache and format it, appending it to the list
                        
foreach($moderatorcache[$mfid] as $moderator)
                        {
                            if(
in_array($moderator['uid'], $done_moderators))
                            {
                                continue;
                            }
            
                            
$moderators .= "{$comma}<a href=\"".get_profile_link($moderator['uid'])."\">".htmlspecialchars_uni($moderator['username'])."</a>";
                            
$comma ', ';
                            
                            
$done_moderators[] = $moderator['uid'];
                        }
                    }
                }
                
$comma '';

                
// If we have a moderators list, load the template
                
if($moderators)
                {
                    eval(
"\$modlist = \"".$templates->get("forumbit_moderators")."\";");
                }
                else
                {
                    
$modlist '';
                }
            }

            
// Descriptions aren't being shown - blank them
            
if($mybb->settings['showdescriptions'] == 0)
            {
                
$forum['description'] = '';
            }

            
// Check if this category is either expanded or collapsed and hide it as necessary.
            
$expdisplay '';
            
$collapsed_name "cat_{$forum['fid']}_c";
            if(isset(
$collapsed[$collapsed_name]) && $collapsed[$collapsed_name] == "display: show;")
            {
                
$expcolimage "collapse_collapsed.gif";
                
$expdisplay "display: none;";
                
$expaltext "[+]";
            }
            else
            {
                
$expcolimage "collapse.gif";
                
$expaltext "[-]";
            }

            
// Swap over the alternate backgrounds
            
$bgcolor alt_trow();

            
// Add the forum to the list
            
eval("\$forum_list .= \"".$templates->get("forumbit_depth$depth$forumcat")."\";");
        }
    }

    
// Return an array of information to the parent forum including child forums list, counters and lastpost information
    
return array(
        
"forum_list" => $forum_list,
        
"counters" => $parent_counters,
        
"lastpost" => $parent_lastpost,
                
"bulb" => $bulb_was_on
    
);
}

/**
 * Fetch the status indicator for a forum based on its last post and the read date
 *
 * @param array Array of information about the forum
 * @param array Array of information about the lastpost date
 * @return array Array of the folder image to be shown and the alt text
 */
function get_forum_lightbulb($forum$lastpost$locked=0$bulb_is_on=0)
{
    global 
$mybb$lang$db$unread_forums;

    
// This forum is closed, so override the folder icon with the "offlock" icon.
    
if($forum['open'] == || $locked)
    {
        
$folder "offlock";
        
$altonoff $lang->forum_locked;
    }
    else
    {
        
// Fetch the last read date for this forum
        
if($forum['lastread'])
        {
            
$forum_read $forum['lastread'];
        }
        else
        {
             
$forum_read my_get_array_cookie("forumread"$forum['fid']);
        }

        if(!
$forum_read)
        {
            
$forum_read $mybb->user['lastvisit'];
        }
        
        
$folder "on";
        
$altonoff $lang->new_posts;

        
// If the lastpost is greater than the last visit and is greater than the forum read date, we have a new post 
        
if($forum['lastpost'] > $forum_read && $forum['lastpost'] != 0
        {
            
$unread_forums++;
        }
        
// Otherwise, no new posts
        
else if($bulb_is_on == 0)
        {
            
$folder "off";
            
$altonoff $lang->no_new_posts;
        }
    }

    return array(
        
"folder" => $folder,
        
"altonoff" => $altonoff
    
);


Sorry, die Formatierung des Codes ist etwas im Eimer wegen Tabs vs. Spaces.
Korrektur: Dass das Forum nicht mehr als neu markiert wurde, liegt (auch) an meinen Änderungen. Das war also vorher nicht so ganz falsch, aber nur weils vorher das falsche Posting als Grundlage zur Neumarkierung genommen hat.
Auch interessant: Ich darf das Posting nicht mehr bearbeiten weil es 120 Minuten alt sind. Antworten werden dann aber an das Posting angehängt. Und das AJAX der Schnellantwort bleibt dabei hängen.
Michael, was meinst du, soll ich das nochmal sauberer und dann als Bugreport im englischen Forum posten?
http://community.mybboard.net/thread-40284.html (schon abgeschoben ins Bogus).

Wenns wenigstens ne ordentliche Begründung gäbe. Aber das ist nun das zweite Mal, dass ein Bugreport von mir dort genixt wird. Der Typ hat das was ich da geschrieben habe vermutlich nicht einmal gelesen. Eigentlich schade...
#10
Das Problem ist ja bekannt. Und eine Begründung gabs ja auch. Wink
Ein weiteres Problem ist, dass der übergeordnete Forum auch markiert werden müsste, wenn man ein Thema im Unterforum liest. Rein mit timestamps geht das nicht mehr. Ich habe mich mit der Thematik schon beschäftigt und könnte dir da einige Schwierigkeiten aufzählen.
[Bild: banner.png]

Bitte die Foren-Regeln beachten und im Profil die verwendete MyBB-Version angeben.