• Wenn du hier im Forum ein neues Thema erstellst, sind schon Punkte aufgeführt die du ausfüllen musst. Das dient im Allgemeinen dazu die notwendigen Informationen direkt mit der Frage bereitzustellen.
    Da in letzter Zeit immer wieder gerne das Formular gelöscht wurde und erst nach 3 Seiten Nachfragen die benötigten Infos für eine Hilfe kommen, werde ich nun jede Fragestellung die nicht einmal annähernd das Formular benutzt, sofort in den Sondermüll schicken.
    Füllt einfach die abgefragte Daten aus und alle können euch viel schneller helfen.

XF2.2 Sidebar, letzte Beiträge, Problem mit Anzeige und Dauer

Silmarillion

Bekanntes Mitglied
Lizenzinhaber
Registriert
7. Nov. 2013
Beiträge
373
Punkte
93
Hallo zusammen,

ich meine ich hätte die Thematik hier irgendwo schon einmal in einem anderen Thread gestellt. Wenn, dann ist das aber dort untergegangen, da die Grundthematik eine ganz andere war.

Von daher folgt jetzt ein separater Thread. Im offiziellen Supportforum habe ich die Frage schon vor anderthalb Jahren gestellt. Ohne auch nur einen entscheidenden Tipp. Also schaun mer mal, ob es hier in unserem kleinen, kuscheligen aber sehr kompetenten deutschen Forum womöglich anders/besser läuft.

249421-5746d72ab3ad2bb2a5c626e26b411fac.jpg


Voreingestellt sind 5 Beiträge! Die IMMER angezeigt werden sollten/müssten. Im obigen Beispiel zeigt sich die Problematik: es werden statt der letzten 5 nur die letzten 3 Beiträge angezeigt. Es kommt auch mal vor, dass gar keine Beiträge mehr angezeigt werden...oder nur einer.

Ich habe bis dato noch immer keine Idee, woran das liegen könnte. Eventuell ein Rechte-Problem? Alle öffentlichen Foren sind für die Anzeige in der Sidebar (für Gäste) zugelassen. Mir erschließt sich erst gar nicht, warum dann diverse Beiträge in öffentlichen Foren entweder erst gar nicht angezeigt werden, oder eben viel zu kurz. Ein Mysterium. Wäre schön, wenn wir das hier gemeinsam entschlüsseln könnten.

Wichtig: die Thematik betrifft nur die Anzeige für Gäste/Leser.

Euch allen ein schönes Wochenende,
Christian
 
Aktuell wird Gästen wieder nur ein Beitrag (obwohl es innerhalb der letzten 60 Minuten etliche neue Beiträge in unterschiedlichen Themen gibt) angezeigt.



Es ist echt zum Haareraufen. :wtf:
 
Ins blaue hinein und ohne Gewähr: Meines Wissens werden solche Widgets mittels "Overfetching" gefüllt. Das heißt: Es werden erst X Datensätze (mehr als nötig) aus der Datenbank geholt und dann werden die nicht zutreffenden (in dem Fall die, wo der Gast keine Rechte hat) ausgefiltert. Es kann sein, dass die Rechnung "geholte Beiträge minus Beiträge, auf die Gäste keinen Zugriff haben" von Zeit zu Zeit weniger als 5 ergibt. Das könnte passieren, wenn du viele aktive private Foren hast.
 
... aber wird mir als Gast dann nicht einfach die Auswahl der letzten X die ich sehen darf angezeigt? OK, man kann meist noch ein Zeitraum angeben, vielleicht ist der zu eng gesetzt... aber wenn der auf z.B. 14 Tage steht sollten auch für Gäste genug neue Beiträge zusammen kommen. Oder?
 
... aber wird mir als Gast dann nicht einfach die Auswahl der letzten X die ich sehen darf angezeigt? OK, man kann meist noch ein Zeitraum angeben, vielleicht ist der zu eng gesetzt... aber wenn der auf z.B. 14 Tage steht sollten auch für Gäste genug neue Beiträge zusammen kommen. Oder?
Wenn das Overfetching zu klein ist, kann das passieren, ja. Und ja, so macht XF das.
 
Danke schon einmal für die Bereitschaft sich der Thematik überhaupt anzunehmen. Da hat Xendach der großen Xenforo-Community schon einmal etwas Voraus. :)

Meine Widget-Einstellungen sehen wie folgt aus:



(wie kann ich hier Bilder hochladen? Habe ich noch immer nicht herausgfunden :oops:)

Es kann eigentlich nur an den Einstellungen/Rechten für Gäste liegen. Bei allen anderen Gruppen wird schließlich immer alles angezeigt. Auch ohne Zeitlimit. Wie es ja auch sein soll.
 
Zuletzt bearbeitet:
Ins blaue hinein und ohne Gewähr: Meines Wissens werden solche Widgets mittels "Overfetching" gefüllt. Das heißt: Es werden erst X Datensätze (mehr als nötig) aus der Datenbank geholt und dann werden die nicht zutreffenden (in dem Fall die, wo der Gast keine Rechte hat) ausgefiltert. Es kann sein, dass die Rechnung "geholte Beiträge minus Beiträge, auf die Gäste keinen Zugriff haben" von Zeit zu Zeit weniger als 5 ergibt. Das könnte passieren, wenn du viele aktive private Foren hast.
Overfetching sagt mir gar nichts @nocte. Aber eventuell ist das wirklich ein Ansatzpunkt, die Lösung des Problems. Private Foren haben wir aktuell deren 3. Die sind auch sehr gut besucht. Hinzukommt die "Hotline", die für Gäste zwar einsehbar ist, aber keine Leserechte für die Threads vorhanden sind. Ich kann mich auch nicht erinnern ein Zeitlimit für die Anzeige der letzten Themen gesetzt zu haben. Falls ja, WO müsste ich hierfür nachschauen? Normalerweise sollten doch von Haus aus IMMER die letzten fünf aktuellen Beiträge (egal wann diese verfasst wurden) angezeigt werden!?
 
Hab jetzt nachgesehen. In der Klasse XF\Widget\NewPosts findest du diesen Code-Part:

PHP:
        $threadFinder
            ->with('Forum.Node.Permissions|' . $visitor->permission_combination_id)
            ->limit(max($limit * 2, 10));

Hier wird auf maximal 10 Einträge limitiert - das ist das Overfetching (das heißt es werden erst mal mehr Einträge geholt, als am Ende angezeigt werden).

Hier werden dann die unpassenden Threads aussortiert:

PHP:
        foreach ($threads = $threadFinder->fetch() AS $threadId => $thread)
        {
            if (!$thread->canView()
                || $thread->isIgnored()
                || $visitor->isIgnoring($thread->last_post_user_id)
            )
            {
                unset($threads[$threadId]);
            }
        }

Das, was bei dir passiert, ist also völlig normal, da du private Foren hast. Also nochmal: Es werden maximal 10 Threads geholt und dann alle aussortiert, die der User (z.B. Gast) nicht sehen kann/darf. Wenn alle 10 Threads privat sind, würde sogar gar kein Widget mehr angezeigt werden.
 
Hab jetzt nachgesehen. In der Klasse XF\Widget\NewPosts findest du diesen Code-Part:

PHP:
        $threadFinder
            ->with('Forum.Node.Permissions|' . $visitor->permission_combination_id)
            ->limit(max($limit * 2, 10));

Hier wird auf maximal 10 Einträge limitiert - das ist das Overfetching (das heißt es werden erst mal mehr Einträge geholt, als am Ende angezeigt werden).

Hier werden dann die unpassenden Threads aussortiert:

PHP:
        foreach ($threads = $threadFinder->fetch() AS $threadId => $thread)
        {
            if (!$thread->canView()
                || $thread->isIgnored()
                || $visitor->isIgnoring($thread->last_post_user_id)
            )
            {
                unset($threads[$threadId]);
            }
        }

Das, was bei dir passiert, ist also völlig normal, da du private Foren hast. Also nochmal: Es werden maximal 10 Threads geholt und dann alle aussortiert, die der User (z.B. Gast) nicht sehen kann/darf. Wenn alle 10 Threads privat sind, würde sogar gar kein Widget mehr angezeigt werden.
Danke für den technischen Input/Hintergrund. Die Frage, die sich mir jetzt aber stellt: warum wird dann, allem Anschein nach, ein Zeitlimit für Gäste gesetzt? Ich habe das noch nie, in keinem anderen XF so gesehen. Was mir auch auffällt: es steckt keine Logik dahinter. Es kann sein, dass es in öffentlichen Foren Beiträge gibt, die gerade mal wenige Minuten alt sind und Gästen nicht angezeigt werden. Das Ganze scheint einer Art Zufallsprinzip zu folgen. Es bleibt, für mich, schräg und mysteriös.
 
Das zeitliche Limit ist für gewöhnlich 30 Tage - also irrelevant. Außer du hast hier die Einstellung geändert:
admin.php?options/groups/discussionOptions/#readMarkingDataLifetime
 
(wie kann ich hier Bilder hochladen? Habe ich noch immer nicht herausgfunden :oops:)
Datei hochladen neben dem Button Antwort erstellen. :D

warum wird dann, allem Anschein nach, ein Zeitlimit für Gäste gesetzt?
Falls du den limit befehl meinst, das ist die Anzahl.

Wo das her kommt hatr Nocte genau und richtig erklärt. Es werden die 10 neusten geladen, und davon alle ausgeblendet die der User nicht sehen darf. Wenn davon 9 in privaten Foren sind, wird nur eins angezeigt. Eine Zeit kommt hier überhaupt nicht ins Spiel.

Deine Lösung wäre:
Ein Widget nur für Gäste, und du wählst nur die Foren aus, die auch die Gäste sehen dürfen.

Das Widget oben dann für alle Nicht-Gäste.
 
Zuletzt bearbeitet:
Datei hochladen neben dem Button Antwort erstellen. :D


Falls du den limit befehl meinst, das ist die Anzahl.

Wo das her kommt hatr Nocte genau und richtig erklärt. Es werden die 10 neusten geladen, und davon alle ausgeblendet die der User nicht sehen darf. Wenn davon 9 in privaten Foren sind, wird nur eins angezeigt. Eine Zeit kommt hier überhaupt nicht ins Spiel.

Deine Lösung wäre:
Ein Widget nur für Gäste, und du wählst nur die Foren aus, die auch die Gäste sehen dürfen.

Das Widget oben dann für alle Nicht-Gäste.
Moinsen Hoffi!

DAS könnte eine/die Lösung sein! Ich bin gespannt! :)

Ich erstelle also ein neues Widget, mit den selben Einstellungen, aber der Bedingung dieses nur für Gäste anzuzeigen. Welche Condition muss ich dann unter "Bedingung anzeigen:" eintragen?

Gruß!
 
Condition für Gäste in Widget definition
Code:
!$xf.visitor.user_id

Für eingeloggte User das ! weglassen.

Für bestimmte primäre Benutzergruppen:
Code:
$xf.visitor.user_group_id
 
Eine Zeit kommt hier überhaupt nicht ins Spiel.
Kleine Korrektur: wie oben beschrieben, wird bei Default-Einstellungen auf 30 Tage limitiert; siehe Thread Repo (XF\Repository\Thread):
PHP:
    public function findThreadsWithLatestPosts()
    {
        return $this->finder('XF:Thread')
            ->with(['Forum', 'User'])
            ->where('Forum.find_new', true)
            ->where('discussion_state', 'visible')
            ->where('discussion_type', '<>', 'redirect')
            ->where('last_post_date', '>', $this->getReadMarkingCutOff())
            ->order('last_post_date', 'DESC')
            ->indexHint('FORCE', 'last_post_date');
    }
und:
PHP:
    public function getReadMarkingCutOff()
    {
        return \XF::$time - $this->options()->readMarkingDataLifetime * 86400;
    }
 
Condition für Gäste in Widget definition
Code:
!$xf.visitor.user_id

Für eingeloggte User das ! weglassen.

Für bestimmte primäre Benutzergruppen:
Code:
$xf.visitor.user_group_id
Kurzzeitig dachte ich das Problem wäre hiermit tatsächlich gelöst.

Aktuell werden aber wieder nur drei Themen angezeigt.

Es ist und bleibt ein absolutes Mysterium. :(
 
Es ist und bleibt ein absolutes Mysterium. :(
Also der Code ist hier ziemlich klar:

PHP:
        if ($nodeIds && !in_array(0, $nodeIds))
        {
            $threadFinder->where('node_id', $nodeIds);
        }
bevor die Threads aus der Datenbank geholt werden, wird noch auf die angegebenen Node-IDs limitiert. Ich kann mir nur vorstellen, dass du doch irgendwelche privaten Foren versehentlich für die Gäste ausgewählt hast. Bedenke: Es geht darum, ob der Besucher den Thread selbst wirklich lesen kann; ein Ansichtsrecht für das Forum (ohne Inhalte) reicht nicht aus. ODER: Du hast zusätzlich zu den passenden Foren auch die oberste Option "Alle Foren" ausgewählt (dann wird deine restliche Auswahl ignoriert).

Siehe den "!$thread->canView()" part hier:
PHP:
            if (!$thread->canView()
                || $thread->isIgnored()
                || $visitor->isIgnoring($thread->last_post_user_id)
            )
            {
                unset($threads[$threadId]);
            }
 
Man kann natürlich herumrätseln und alles mögliche ausprobieren - oder man macht strukturierte Fehlersuche:

Debug-Mode einschalten, ansehen was für ein Query tatsächlich ausgeführt wird.

Dann gibt es zwei Möglichkeiten:
  1. Das Query liefert weniger als die erwartete Anzahl Ergebnisse. Hier müsste man dann genauer schauen wieso.
  2. Das Query liefert min. die erwartete Anzahl Ergebnisse. In diesem Fall werden also Threads in PHP ausgefiltert und man müsste sich da anschauen wieso.
 
Also der Code ist hier ziemlich klar:

PHP:
        if ($nodeIds && !in_array(0, $nodeIds))
        {
            $threadFinder->where('node_id', $nodeIds);
        }
bevor die Threads aus der Datenbank geholt werden, wird noch auf die angegebenen Node-IDs limitiert. Ich kann mir nur vorstellen, dass du doch irgendwelche privaten Foren versehentlich für die Gäste ausgewählt hast. Bedenke: Es geht darum, ob der Besucher den Thread selbst wirklich lesen kann; ein Ansichtsrecht für das Forum (ohne Inhalte) reicht nicht aus. ODER: Du hast zusätzlich zu den passenden Foren auch die oberste Option "Alle Foren" ausgewählt (dann wird deine restliche Auswahl ignoriert).

Siehe den "!$thread->canView()" part hier:
PHP:
            if (!$thread->canView()
                || $thread->isIgnored()
                || $visitor->isIgnoring($thread->last_post_user_id)
            )
            {
                unset($threads[$threadId]);
            }
Mahlzeit, @nocte. Ich hatte tatsächlich ein Forum ohne Leserechte mit "reingeschmuggelt". Voller Hoffnung entfernt...aber leider wiederum ohne den gewünschten Erfolg. Könnte es vielleicht an den Forenkategorien liegen? Da sind nämlich welche dabei die versteckte Foren enthalten. Eher nicht, oder?
 
Zurück
Oben