Zufallsthema

06.09.2021 23:00
#1 Zufallsthema
avatar
Mitglied

In meinem Forum KantOpia sind aktuell gut 500 Themen eingestellt.

Da die alten Themen schnell verschwinden, möchte ich diese regelmäßig wieder nach oben holen d.h. zur Auswahl anbieten.

Eignen würde sich dafür eine Box, in der nach dem Zufallsprinzip immer wieder ein anderer Link zu einem Thema angezeigt wird.

Wenn ich dies mit JS realisieren will, müssen bei jedem Neuaufbau der Seite 500 Links in eine Array eingelesen werden - das bedeutet natürlich viel Traffic!

Gibt es eine Möglichkeit, dieses Einlesen der Links z.B. nur direkt nach dem LOGIN einmal durchzuführen (wie eine globale Array oder eine Array als Konstante), so dass bei Aktualisierung der Seite nur noch der Zufallsgenerator seine Arbeit verrichten muss.

Besser wäre es natürlich, man könnte wie bei der Activity Box auf sämtliche Texte mit den dazugehörigen Links direkt zugreifen.

mein neues Forum: https://kantopia.xobor.de

 Antworten

 Beitrag melden
10.09.2021 20:25
#2 RE: Zufallsthema
avatar
Mitglied

Ist eine Antwort zu diesem Thema sehr schwierig oder nicht möglich?

Gerne würde ich wissen, wie ich hier weiter komme!

mein neues Forum: https://kantopia.xobor.de

 Antworten

 Beitrag melden
13.09.2021 11:14 (zuletzt bearbeitet: 13.09.2021 11:14)
avatar  Ingmar
#3 RE: Zufallsthema
avatar
Technik

Klar theoretisch ist so was möglich.

Du könntest z.B. einmal pro Woche manuell irgendwie alle IDs und Titel der Themen in einem Array speichern und diesen in einer Plugin-Variablen speichern. Dann müsstest du nur noch per Zufallsgenerator einen dieser Einträge laden.

Aber so richtig sauber ist das alles nicht, schon allein weil es natürlich mit steigender Themenzahl nicht wirklich gut skaliert. Auch sind Plugins, bei denen bei jedem Seitenabruf per Ajax irgendetwas geladen (in diesem Fall ja zumindest die Plugin-Variable) wird auch immer etwas unschön.

Daher hatte ich dir hier bisher nicht geantwortet - ich habe keine wirklich tolle Lösung parat...

Viele Grüße,
Ingmar


 Technik · Homepagemodules.de · Miranus GmbH

 Antworten

 Beitrag melden
15.09.2021 10:51
#4 RE: Zufallsthema
avatar
Mitglied

Hallo Ingmar,

danke für Deine Antwort.

Es gibt doch diverse Variablen, über die man z.B. den Benutzernamen abfragen kann ( {{user_name}} ) (wo finde ich eine Liste von allen diesen Variablen?)

Kann man nicht mit diesen Variablen ein Array aller Usertexte oder aller Texte im Forum füllen (Titel und Link reichen vollkommen) und dann über dieses den Zufall entscheiden lassen?

LG Rainer

mein neues Forum: https://kantopia.xobor.de

 Antworten

 Beitrag melden
17.09.2021 12:29
avatar  Ingmar
#5 RE: Zufallsthema
avatar
Technik

Zitat von Düsseltal im Beitrag #4
Es gibt doch diverse Variablen, über die man z.B. den Benutzernamen abfragen kann ( {{user_name}} ) (wo finde ich eine Liste von allen diesen Variablen?)


Eine - nicht vollständige - Liste der auf den meisten Seiten verfügbaren Variabeln findest du hier:
Wiki:Liste-der-Forenvariablen

Zitat von Düsseltal im Beitrag #4
Kann man nicht mit diesen Variablen ein Array aller Usertexte oder aller Texte im Forum füllen (Titel und Link reichen vollkommen) und dann über dieses den Zufall entscheiden lassen?

Nein. Es gibt keine Seite, auf der alle Themen inklusive Link in solchen Variabeln verfügbar sind. Das wäre auch nicht sehr performant.

Viele Grüße,
Ingmar


 Technik · Homepagemodules.de · Miranus GmbH

 Antworten

 Beitrag melden
17.09.2021 16:43 (zuletzt bearbeitet: 17.09.2021 16:44)
avatar  creator
#6 RE: Zufallsthema
cr
Mitglied

Eine andere Möglichkeit wäre, mit einer zufälligen Zahl und der Funktion getdeep zu Arbeiten.

Nach einem festgelegtem Zeitpunkt (z.B. alle 14 Tage) wird ein Skript für Administratoren ausgeführt, welches:
1. Die ID (Nummer) von neuestem Thema findet (z.B. indem es den Activity Feed durchsucht und die größte Themen-ID nimmt).
2. Eine Zahl zwischen 1 und der letzten Themen-ID generiert
3. Mit getdeep den Titel und Link von Thema holt
4. Sofern getdeep keinen Treffer zurückgibt, wurde das Thema gelöscht. In dem Fall zurück zu Schritt 1.
5. Thementitel und Zeitpunkt von Speicherung in globaler Variable speichern.


Das einzige Problem, was ich damit sehe, sind die Zugriffsrechte. Es kann vorkommen, dass Mitglieder den Titel von Themen zu sehen bekommen, auf die sie keinen Zugriff haben. Du könntest Themen, die nur für bestimmte Nutzergrupen lesbar sind, von der Suche ausschließen oder die Anzahl begrenzen, allerdings wäre die Funktion in dem Fall nicht mehr so genau.


 Antworten

 Beitrag melden
25.09.2021 01:13
#7 RE: Zufallsthema
avatar
Mitglied

@creator
Liest sich toll, jedoch bin ich mit meinen Kenntnissen nicht dazu in der Lage, dies umzusetzen.
Habe mich zwar inzwischen ein wenig mit Javascript und HTML beschäftigt, so dass ich die Routine (s.o.) erstellen konnte, aber der Einbau der XOBOR Befehle wie indeep ist für mich bisher absolut nicht nachvollziehbar.
Könntest Du vielleicht ein kleines Beispiel mit Doku einstellen, an dem ich mich weiterentwickeln kann?

LG Rainer (Danke für Deine bsherigen Bemühungen!)

mein neues Forum: https://kantopia.xobor.de

 Antworten

 Beitrag melden
25.09.2021 07:46
avatar  creator
#8 RE: Zufallsthema
cr
Mitglied

Zitat von Düsseltal im Beitrag #7
der Einbau der XOBOR Befehle wie indeep ist für mich bisher absolut nicht nachvollziehbar

Bei Unklarheiten zum Plugin-System ist die offizielle Dokumentation die beste Anlaufstelle: https://www.xobor.de/plugin-doc-api.html..._plugin_getDeep
Die Funktion getDeep nimmt einen target type (type 1 = Beitrag) und eine target id, mit der sich ein beliebiger Beitrag abrufen lässt.

Zitat von Düsseltal im Beitrag #7
Könntest Du vielleicht ein kleines Beispiel mit Doku einstellen, an dem ich mich weiterentwickeln kann?


Das "Tutorial für Einsteiger" in der Wiki bietet hier schon einen guten Einstieg, insbesondere Kapitel 1.0, 1.1 und 1.3 zu globalen Variablen: Wiki:Plugin-Tutorial-fuer-Einsteiger-bersicht

Ich würde empfehlen, mit diesem Tutorial anzufangen. Du kannst beispielsweise ein sehr simples Plugin zu schreiben, welches einen beliebigen Text an der Stelle anzeigt, an der ein zufälliges Thema angezeigt werden soll. Dadurch sollten die Begriffe Template-Element, Header, Footer und Inline-Element im Zusammenhang mit der Plugin-Entwicklung etwas klarer sein.

Zu meinem Code: Als ich Beitrag #6 geschrieben habe, wollte ich diesen Ansatz mit einem simplen Plugin testen. Es wird ein beliebiges Thema im Forum ausgewählt und in eine globale Variable geschrieben. Mein Code sollte mit grundlegenden JavaScript-Kenntnissen und dem Wissen aus dem oben genannten Tutorial verständlich sein.

Wenn du das Plugin selbst nachstellen möchtest, solltest du im Code "pluginid" mit deiner gewählten Plugin ID ersetzen.

1
2
3
 
{{plugin_pluginid_global_thread==true.start}}
Zufälliger Thread: {{plugin_pluginid_global_thread}}
{{plugin_pluginid_global_thread==true.end}}
 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
 
{{cur_page_name==index.start}}
{{user_admin==true.start}}
<script>
(function() {
var lastUpdate = parseInt({{plugin_pluginid_global_lastupdate}});
//if(!lastUpdate || (lastUpdate && Date.now() >= lastUpdate + 12096e5)) { //lastupdate + zwei Wochen
if(true) { // Skript wird immer ausgefürt. Zum Testen.
/* Letzte Thread ID finden */
var lastThreadID = 0;
var messages = $('.forum_message a[href^="t"]');
if(!messages) {
return; // Falls keine Threads gefunden wurden, vorher abbrechen
}
messages.each(function() {
var currentThreadID = parseInt($(this).attr("href").split("t")[1].split("f")[0]);
if(currentThreadID > lastThreadID) {
lastThreadID = currentThreadID;
}
});
/* Zufälligen Thread finden und in globale Variable schreiben */
function getRandomThreadID() {
return Math.floor(Math.random() * (lastThreadID) + 1);
}

var usedIDs = [];
function getUniqueRandomThreadID() {
var rand = getRandomThreadID();
while(usedIDs.includes(rand) && usedIDs.length < lastThreadID) {
rand = getRandomThreadID();
}
usedIDs.push(rand);
return rand;
}
 
var randomID;
var foundThread = false;
while(foundThread == false && usedIDs.length < lastThreadID) {
randomID = getUniqueRandomThreadID();
console.log("looking up thread " + randomID)
xobor.plugin("pluginid").getDeep({target_id: randomID, target_type: "1"},function(res) {
if(res) {
foundThread = res;
}
});
}
//console.log(foundThread);
if(foundThread.link && foundThread.title) {
xobor.plugin("pluginid").setGlob("thread", '<a href="' + foundThread.link + '">' + foundThread.title + '</a>');
} else {
alert("Fehler beim Aktualisieren der zufälligen Beiträge: Link und Titel konnten nicht gefunden werden.")
}
xobor.plugin("pluginid").setGlob("lastupdate", Date.now());
}
})()
</script>
{{user_admin==true.end}}
{{cur_page_name==index.end}}
 


1
2
3
4
5
 
Name: thread
Type: text
Doread: all
Dowrite: administrator
Parsing: HTML
 


1
2
3
4
5
 
Name: lastupdate
Type: chars
Doread: all
Dowrite: administrator
Parsing: Plain Text
 


 Antworten

 Beitrag melden
Bereits Mitglied?
Jetzt anmelden!
Mitglied werden?
Jetzt registrieren!