Praxisbeispiel: Plugin "Close Old Threads"

Plugin-Entwicklung



Im folgenden Beispiel wird die Entwicklung des Plugins "Close Old Threads" beschrieben.

0) Anforderungen


Oft passiert es, dass gerade neue Mitglieder ein altes Thema über die Suchfunktion auffinden und dort posten, obwohl bereits eine lange Zeit kein Beitrag mehr in diesem Thema geschrieben wurde. Für den Administrator ist es aber unzumutbar, ständig das Forum zu kontrollieren, um alte Beiträge zu schließen. Das neue Plugin soll dem Admin diese Arbeit abnehmen und beim Aufruf eines Themas automatisch prüfen, ob ein Thema zu alt ist oder nicht.
Für Themen die ein bestimmtes Alter überschritten haben, kann ein Warnhinweis angegeben werden, noch ältere Themen werden komplett geschlossen.

Der Administrator soll festlegen können, nach wie vielen Tagen eine Warnung bzw. eine Schließung erfolgt. Außerdem solle es möglich sein Gruppen zu definieren, die von der Schließung nicht betroffen sind.




1) Neues Plugin erstellen



In der Foren-Administration unter Plugins->Plugin Entwicklung können neue Plugins erstellt werden.

Plugin ID & Plugin Name
Die ersten beiden Werte, die bei der Erstellung eines Plugins angegeben werden müssen sind die Plugin ID und der Plugin Name. Die ID ist der interne Name des Plugins. Er darf keine Sonderzeichen enthalten. Der Pugin Name ist der Name des Plugins, den später der Endbenutzer zu sehen bekommt.


Plugin ID: threadautoclose
Plugin Name: Close Old Threads




2) Elemente des Plugins definieren



Ein Plugin besteht aus folgenden Elementen:

  • Content-Element
    Template-Elemente, Javascript oder HTML-Dateien
  • Config-Variablen
    Einstellungen für das Plugin
  • Daten-Variablen
    In diesen Variablen werden Werte und Daten gespeichert, die das Plugin benötigt. Datenvariablen werden immer einer Quelle (Origin) zugeordnet. Wird eine Variable z.B. dem Benutzerprofil zugeordnet, stehen die gespeicherten Werte später immer zur Verfügung, wenn ein Benutzerprofil geöffnet ist.
  • Globale Variablen
    Funktionieren genau wie Daten-Variablen, allerdings stehen die hier gespeicherten Werte später auf allen Seiten des Forums zur Verfügung. Dies kann die Performanz negativ beeinflusssen und sollte daher vorsichtig eingesetzt werden.



Für das Close Old Threads Plugin benötigen wir keine Variablen, die Daten speichern. Allerdings möchten wir dem Administartor einige Einstellungen ermöglichen, daher legen wir drei Config-Variablen an:

Variablen
1) maxdays_messageage_warning
Nach X Tagen soll eine Warnung angezeigt werden, dass das Thema schon alt ist.
Die Variable ist von Typ int und bekommt den Standardwert 180

2) maxdays_messageage_close
Nach X Tagen soll das Thema ganz geschlossen werden.
Die Variable ist von Typ int und bekommt den Standardwert 360

3) plugin_exceptions
Hier können Gruppen angegeben werden, welche auch nach dem erreichen von maxdays_messageage_close noch antworten können.
Die Variable ist vom Typ grouprights und bekommt den Standardwert administrator

Templates
Das Plugin soll später an zunächst 2 Stellen im Forum aktiv werden: Einmal beim Schreiben eines Beitrags, und einmal in der Themenansicht.

Wir benötigen daher 2 neue Template-Elemente:

Plugin Template Element "New Message"


Wir ordnen unser neues Element dem Foren-Template "Neuen Beitrag Schreiben" zu und erreichen damit, dass der Code des Templates immer ausgeführt wird, wenn das Template "Neuen Beitrag Schreiben" aufgerufen wird.


Desweiteren können wir festlegen, wann genau das Plugin Template ausgeführt werden soll:


Header -> das Plugin-Template wird direkt VOR dem Foren-Template ausgeführt.
Footer -> das Plugin-Template wird direkt NACH dem Foren-Template ausgeführt.
Inline-Element -> Die ermöglich die Ausführung der Plugin-Codes innerhalbt des Foren-Templates. Hierzu gibt es in den Foren-Templates Markierungen. Im "Neuen Beitrag Schreiben"-Template gibt es eine solche Markierung z.B. innerhalb des "Beitrag Schreiben" Formulars. Zu den Markierungen in den Template -Elementen wird es in Kürze noch ein eigenes Tutorial geben.


Unsere Einstellungen für das Element "New Message" lauten also:
Template: Neuen Beitrag Schreiben
Inline-Element: "new_message_in_form" (Name der Markierung im Foren Template)
Template Name: new_message

Analog dazu wird auch das Template "topic" angelegt:
Template: Themen Ansicht
Header: JA - das Plugin-Template soll vor dem Laden der Beiträge angezeigt werden.
Template Name: topic





3) Plugin Elemente schreiben


Wir haben nun alle Elemente des Plugins definiert und den jeweiligen Foren-Templates zugeordnet. Im nächsten Schritt schreiben wir nun den Code des Plugins

Plugin-Templates funktionieren fast genau wie normale Foren-Templates. Es stehen alle Foren-Variablen zur Verfügung, die auch im verknüpften Template-Element verwencet werden. Außerdem stehen die Variablen des Plugins zur Verfügung.

Auf den Wert der Variablen maxdays_messageage_warningzum Beispiel kann im Plugin Template mit {{plugin_threadautoclose_config_maxdays_messageage_warning}} zugegriffen werden.
Für Rechtevariablen erzeugt das System automatisch eine zusätzliche boolean-Variable. D.h während die Variable {{plugin_threadautoclose_config_plugin_exceptions}} die Gruppen-Ids der Gruppen enthält, die von der Themenschließung nicht betroffen sind, enthält {{plugin_threadautoclose_config_plugin_exceptions_boolean}} einen true/false Wert, der für den aktuellen Benutzer angepasst wird.


Das Element new_message setzt folgendes um:

Beim laden von "Neuen Beitrag Schreiben" prüfen wir ob

1) Das maximale Themenalter erreicht wurde
1a) Falls ja: Prüfen Ob das Mitglied in der "Ausnahmen"-Gruppe ist.
1aa) Falls ja: Warnhinweis anzeigen, dass das Thema eigentlich geschlossen wäre
1ab) Falls nein: Thema als geschlossen anzeigen, Laden des "Beitrag schreiben" Templates unterbinden

2) Das Themenalter für eine Warnung reicht:
2a) Falls ja: Warnung anzeigen

Das könnte dann z.B. so aussehen:

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
 
<!--{{reply==true.start}} = Nur laden, wenn geantwortet wird:-->
{{reply==true.start}}
 
<!--Berechnung der Tage seit der letzten Antwort-->
{{secs_since_message.startint}}{{server_time}}-{{thread_lastmessage_ts}}{{secs_since_message.end}}
{{days_inactive.startint}}{{secs_since_message}}/60/60/24{{days_inactive.end}}
 
{{limitreached.start}}0{{limitreached.end}}
 
<!--Thread ist älter als in maxdays_messageage_close definiert-->
{{days_inactive>plugin_threadautoclose_config_maxdays_messageage_close.start}}

 
{{plugin_threadautoclose_config_plugin_exceptions_boolean==true.start}}
<!--Thread ist älter als in maxdays_messageage_close definiert - aber der USer ist in einer ausgenommenen Gruppe-->
{{limitreached.start}}1{{limitreached.end}}
<div class="threadinactive">In diesem Thema wurden seit mehr als {{plugin_threadautoclose_config_maxdays_messageage_close}} Tagen kein Beitrag verfasst. <br/>Bitte überlegen Sie vor dem posten ob es nicht sinnvoller ist, ein neues Thema zu eröffnen</div>
 
{{plugin_threadautoclose_config_plugin_exceptions_boolean==true.else}}
<!--Thread ist älter als in maxdays_messageage_close definiert - Thema wird als geschlossen angezeigt-->
<div class="threadinactive_hardlimit" style="text-align:center;">
Dieses Thema wurde aufgrund von Inaktivität geschlossen. <br/>Bitte eröffnen Sie bei Bedarf ein neues Thema.<br/>
<a href="{{reply_message_link}}" class="button button1">zurück zum Beitrag</a>
</div>

<!--Diese Funktionen veerhindern, dass weitere Templates geladen werden-->
{{template_stoploading(new_message)}}
{{template_stoploading(quote_html)}}
 
{{plugin_threadautoclose_config_plugin_exceptions_boolean==true.end}}
 
{{days_inactive>plugin_threadautoclose_config_maxdays_messageage_close.end}}
 
<!--Thread ist älter als in maxdays_messageage_warning definiert - Warnhinweis anzeigen-->
{{days_inactive>plugin_threadautoclose_config_maxdays_messageage_warning.start}}{{days_inactive<plugin_threadautoclose_config_maxdays_messageage_close.start}}
{{limitreached.start}}1{{limitreached.end}}
<div class="threadinactive">Bitte beachten Sie, dass in diesem Thema schon länger kein Beitrag mehr verfasst wurde.<br/>Überlegen Sie vor dem posten ob es nicht sinnvoller ist, ein neues Thema zu eröffnen.</div>
{{days_inactive<plugin_threadautoclose_config_maxdays_messageage_close.end}}{{days_inactive>plugin_threadautoclose_config_maxdays_messageage_warning.end}}
 

<!--Hier wird der eingefügte Code per Javascript auf der Seite positioniert. Je nach Template wird er an eine unterschiedliche Position geschoben-->
{{limitreached==true.start}}
 
<script>
$(document).ready(function(){
{{template==1.start}}var $infotexttarget = $('#previewbutton').closest('table');{{template==1.end}}
{{template==111.start}}var $infotexttarget = $('#previewbutton').closest('table');{{template==111.end}}
{{template==110.start}}var $infotexttarget = $(".submit-buttons");{{template==110.end}}
{{template==144.start}}var $infotexttarget = $("#newmsg");{{template==144.end}}
$('.threadinactive').insertBefore($infotexttarget);
});</script>
{{limitreached==true.end}}
{{reply==true.end}}
 



Das Element "topic" wird auf der Themen Ansicht geladen. Für die erste Version des Plugins beschränken wir uns darauf, die Schnellantwort auszublenden, wenn das Limit überschritten wurde (da Mitglieder ja sonst auf diesem Wege dennoch Beiträge schreiben könnten).


{{secs_since_message.startint}}{{server_time}}-{{thread_lastmessage_ts}}{{secs_since_message.end}}
{{days_inactive.startint}}{{secs_since_message}}/60/60/24{{days_inactive.end}}

{{limitreached.start}}0{{limitreached.end}}

{{days_inactive>plugin_threadautoclose_config_maxdays_messageage_close.start}}
{{plugin_threadautoclose_config_plugin_exceptions_boolean==true.start}}
{{limitreached.start}}1{{limitreached.end}}
{{plugin_threadautoclose_config_plugin_exceptions_boolean==true.else}}
{{reply_quick.start}}0{{reply_quick.end}}
{{plugin_threadautoclose_config_plugin_exceptions_boolean==true.end}}

{{days_inactive>plugin_threadautoclose_config_maxdays_messageage_close.end}}




4) Testen



Wenn alles klappt, sollten nun beim beantworten alter Themen keine Antwort mehr möglich sein.




5) Veröffentlichen



An dieser Stelle ist die erste Version des Plugins fertig für die Veröffentlichung im Plugin-Store. Dazu geben wir in den Plugin-Einstellungen die gewünschte Versionsnummer an (Falls bereits eine Version des Plugins veröffentlicht wurde muss die versionsnummer höher sein als zuvor!) und klicken auf "In Plugin Store veröffentlichen. Da wir bei den Plugin-Einstellungen festgelegt haben, dass das Plugin sichtbar für alle ist (Public Store) erscheint das Plugin nun im öffentlichen Plugin Store, sobald ein Xobor Mitarbeiter den Code überprüft und für gut befunden hat.

Ist das Plugin erst einmal im Plugin Store, kann es von allen Xobor Foren mit einem Klick installiert und verwendet werden.

6) Erweitern



Die Arbeit hört hier natürlich nicht auf. Man könnte noch Variablen hinzufügen, die dem Admin erlauben, selbst die angezeigten Texte festzulegen. Oder man fügt bei der Themen-Ansicht gleich das "Thema geschlossen"-Icon ein wenn das Antworten nicht gestattet ist.

Nachdem ein Plugin verändert wurde, muss eine neue Versionsnummer angegeben werden, bevor es im Plugin Store veröffentlicht werden kann. Ist eine neue Version verfügbar, können alle Foren das Update mit einem Klick installieren.


Login
Activity Feed
rating rating
Yvy, Gabriella und Ingmar haben sich bedankt!
Beitrag: Wiki
%usernames% haben sich bedankt!
forum_message forum_message
Yvy und Mike48 haben 2 neue Beiträge im Thema Wiki geschrieben.
Vielen Dank :)
forum_topic forum_topic
Yvy hat das Thema Wiki erstellt
Hallo Sicher bin ich nicht die Erste, die mit dem Wiki Probleme hat. Aber ich hätte gern das Inhaltsverzeichnis auf der 1. Seite und nicht die Startseite Liebe Grüße Yvy
forum_message forum_message
l2otbart_57 hat einen neuen Beitrag im Thema Xobor Shoutbox geschrieben.
weiß nicht genau, ob dieser Fehler [[File:xshout_3.png|none|auto]]forumbundle.js?rev=57735:1 Uncaught TypeError: Cannot use 'in' operator to search for 'length' in [] at C (forumbundle.js?rev=57735:1:3527)dafür sorgt, dass keine Shouts angezeigt werden, oder die Box wieder geleert werden möchte?...
forum_message forum_message
Ingmar und CuSF haben 4 neue Beiträge im Thema YouTube Videos werden plötzlich nicht mehr angezeigt geschrieben.
Danke für den Screenshot der JS-Console. Ich denke damit kann ich arbeiten...
rating rating
spotter46 hat sich bedankt!
Beitrag: Springt nicht zum letzten Beitrag der Seite
%usernames% hat sich bedankt!
forum_message forum_message
Ingmar und spotter46 haben 2 neue Beiträge im Thema Springt nicht zum letzten Beitrag der Seite geschrieben.
Ja wie ich vermutet hatte tritt der Fehler immer dann auf, wenn in mehr als einem Beitrag Bilder eingebunden sind, die in einer Lightbox angezeigt werden können. Ist ~intern behoben~ Änderungen werden immer erst mit dem nächsten Update übernommen. Der Zeitpunkt und Umfang des Updates werden unter A...
forum_message forum_message
Ingmar und CuSF haben 2 neue Beiträge im Thema YouTube Videos werden plötzlich nicht mehr angezeigt geschrieben.
Das kann ich nicht reproduzieren.So sieht das bei mir im Chrome aus:[[File:img_1742917761.png|none|fullsize]]Wenn ich dann bestätige wird das Video geladen:[[File:img_1742917798.png|none|fullsize]]
forum_message forum_message
l2otbart_57, Ingmar und spotter46 haben 9 neue Beiträge im Thema Springt nicht zum letzten Beitrag der Seite geschrieben.
Zitat von Ingmar im Beitrag #2Das dürfte damit zusammenhängen: hier taucht der Lightbox Fehler auch auf, ist also nicht nur im Support Forum so
rating rating
spotter46 hat sich bedankt!
Beitrag: Springt nicht zum letzten Beitrag der Seite
%usernames% hat sich bedankt!
forum_message forum_message
l2otbart_57 hat einen neuen Beitrag im Thema Frage zur Rahmen und Textboxen geschrieben.
kennst du den [style=]-Code?ich denke es, ist zu kompliziert, so viele Parameter zu verwenden ...12345 [style=border: 5px outset; padding:20px 30px; border-radius:10px; display:inline-block;]kennst du den [[b]style=[/b]]-Code?[/style][style=border: 2px dotted blue; margin:1em; padding:5px 15px; bor...
forum_topic forum_topic
DevilintheUnknown hat das Thema Frage zur Rahmen und Textboxen erstellt
Hallo ihr Lieben!Ich würde in meinem Forum gerne Rahmen und Textboxen anbieten, welche die Nutzer selbst mitgestalten können.Also Größe anpassen & Farbe und Dicke der Rahmenlinien, abgerundete Ecken.Ich habe als Eingabe für die Nutzer beispielsweise dies hier: [frame-solid{{width}};{{height}};{{bord...
rating rating
Bussinchen hat sich bedankt!
Beitrag: Wo ist denn die Domain .info abgeblieben?
%usernames% hat sich bedankt!
forum_message forum_message
Johannes hat einen neuen Beitrag im Thema Wo ist denn die Domain .info abgeblieben? geschrieben.
Wir können nicht jede Domain Endung anbieten und tun dies bei teuren Endungen auch nicht.info Domains sind in den vergangenen Jahren um ca. 400% teurer geworden, wohingegen .de Domains preislich stanbil geblieben sind. Das bedeutet wir zahlen im Einkauf bereits über 36€ nur für die info Domain im Ja...
forum_topic forum_topic
Bussinchen hat das Thema Wo ist denn die Domain .info abgeblieben? erstellt
Zitat von Johannes im Beitrag #31Im Profi Tarif sind com/net/org/info/eu Domains regulär enthalten. Wir wissen, dass wir mit unseren Tarifen nicht jeden überzeugen können. Das ist schade, denn unsere Firma lebt von den Tarifen und nicht von der Werbung Ich wollte gerade für ein neu erstelltes Forum ...
rating rating
spotter46 hat sich bedankt!
Beitrag: Intere Smileys werden temporär nicht angezeigt.
%usernames% hat sich bedankt!
forum_message forum_message
Ingmar hat einen neuen Beitrag im Thema Intere Smileys werden temporär nicht angezeigt. geschrieben.
Zitat von Lina F. im Beitrag #13Wie kann ich das ändern?Da du ja keinerlei Details nennst wird es schwer sein dir zu helfen.Hast du denn den Rest dieses Themas gelesen? Der Themenersteller hatte seine Smilies von einem externen Anbieter eingebunden, der wohl nicht sehr zuverlässig funktioniert hat.
forum_message forum_message
Lina F. hat einen neuen Beitrag im Thema Intere Smileys werden temporär nicht angezeigt. geschrieben.
Ich hänge mich mit einer Frage daran:Bei mir werden die Smileys nur bei Nutzung bestimmter Browser korrekt oder überhaupt angezeigt. Das ist erst seit kurzen so.Wie kann ich das ändern?https://www.irgend-wie-anders.de/
forum_message forum_message
Olaf hat einen neuen Beitrag im Thema Fehler bei Geburtstagsanzeige geschrieben.
Komisch,daß das bei mir nicht angezeigt wird?Ist aber richtig,denn den Kommentar habe ich außerhalb von der Javascript Variable eingefügt.Ich habe Dir ein "Privates Plugin" mit der Korrektur gesendet (Version 0.151).GrußOlaf
forum_topic forum_topic
seelenwind hat das Thema Fehler bei Geburtstagsanzeige erstellt
Oberhalb im Forum bei der Geburtstagsanzeige sind unliebsame Zeichen zu sehen, die da so nicht hingehören .... Kann mir da jemand helfen .... Bitte Danke schon mal fürs helfen ....[[File:Unbenannt123.jpg|none|auto]]
rating rating
%usernames% hat sich bedankt!
rating rating
Benjaminbe hat sich bedankt!
Blog-Artikel: 7 Tipps für deine Fanseite auf Facebook
%usernames% hat sich bedankt!
rating rating
Olaf hat sich bedankt!
Beitrag: Fehler beim Gästebuch
%usernames% hat sich bedankt!
forum_message forum_message
Dead Inside und 3 weitere haben 10 neue Beiträge im Thema Fehler beim Gästebuch geschrieben.
OMG das hab ich gar nicht gesehen. VIELEN VIELEN VIELEN DANK! 🥰🥰🥰🥰 @Olaf Hast mir den Tag gerettet
forum_message forum_message
River und 2 weitere haben 3 neue Beiträge im Thema Verlinkung zu Kalendereintrag unerklärlich geschrieben.
Zitat von Ingmar im Beitrag #10Das ist aber in allen anderen Templates auch so - oder sehe ich da was falsch?Dazu weiß ich auch mal was, und zwar im V4 ist es auch so und ich meine, das ist schon länger bekannt - gibt sicher noch andere Threads hierzu. Viele GrüßeRiver
rating rating
River hat sich bedankt!
Beitrag: Verlinkung zu Kalendereintrag unerklärlich
%usernames% hat sich bedankt!
rating rating
Mike48 und 2 weitere haben sich bedankt!
Beitrag: Fehler beim Gästebuch
%usernames% haben sich bedankt!
forum_message forum_message
Ingmar und 1 weitere haben 2 neue Beiträge im Thema Fehler beim Gästebuch geschrieben.
Zitat von Dead Inside im Beitrag #27Das Problem wurde behoben aber dadurch ist ein anderer Fehler aufgetauchtWelcher Fehler existiert denn aktuell noch? Ich komme hier langsam nicht mehr mit um ehrlich zu sein.
rsummary rsummary
Benjaminbe und 1 weitere haben 2 Beiträge und 1 Blog-Artikel bewertet (Details)
%usernames% hat sich bedankt!
rsummary rsummary
River und 3 weitere haben 2 Beiträge bewertet (Details)
%usernames% haben sich bedankt!
Wer ist Online?
1 Mitglied und 55 Gäste sind Online
Besucher Statistiken
56 Aktive User
1 Mitglied und 55 Gäste sind Online:
Johannes

Heute waren Online
erich.z, Gabriella, Johannes, nobody

Besucherrekord
1274 Benutzer gleichzeitig online (11.10.2019 18:19)

Besucherzähler
Heute waren 448 Gäste und 4 Mitglieder, gestern 3480 Gäste und 29 Mitglieder online.

Statistiken
Themen 41850
Beiträge 306546
Mitglieder 12.533
Forum empfehlen