Plugin Tutorial für Einsteiger - 1.3 Daten Speichern und Lesen

Hallo Welt - 1.3 Variablen

In diesem Tutorial beschreiben wir verschiedene Möglichkeiten Daten in einem Plugin zu speichern und wieder auszulesen. Zur Startseite des Tutorials


Allgemeiner Hinweis: Es empfiehlt sich, dieses Tutorial in einem Testforum auszuprobieren, um den laufenden Betrieb im Hauptforum nicht zu beinträchtigen. Erstellen Sie dazu einfach bei Bedarf ein neues Forum unter www.xobor.de
Hinweis




Plugin Hallo Welt - Daten Speichern und Lesen



Beschreibung


Bisher beschränkten wir uns beim "Hallo Welt" Plugin ausschließlich auf die Ausgabe einfacher Texte. Für die meisten Plugins benötigt man jedoch auch die Möglichkeit, Daten zu Speichern und später wieder anzuzeigen.
Das wird über die Daten-Variablen (data Vars) oder die globalen Variablen (global Vars) realisiert.

Für diese Beispiel legen wir eine je eine Variable beider Typen an und erläutern deren Funktion.


Allgemeines


Unterschied zwischen data Vars und global Vars
Beide Variablentypen können verwendet werden um beliebige Arten von Daten zu speichern und später wieder auszugeben. Allerdings ist eine Daten-Variable immer einem bestimmten Inhalt des Forums zugeordnet. So kann man z.B. Daten speichern, die immer einem bestimmten Beitrag oder Benutzerprofil zugeordnet werden. Die Werte dieser Variablen stehen immer dann zur Verfügung, wenn das betroffene Element (also z.B. der Beitrag, zu dem die Variable gehört) gerade angezeigt wird.

Globale Variablen dagegen gelten für das gesamte Plugin und stehen auf jeder Seite des Forums zur Verfügung. Sie können z.B. verwendet werden, um Benutzereinstellungen zu einem Plugin zu speichern.

Wir das Forumlar für die "Neue Globale Variable" oder das Formular für eine "Neue Data Variable" geöffnet, haben beide Type zunächst die gleichen Grundeinstellungen:

Name: Der Name der neuen Variable
Parsing: Welche Art von Code ist erlaubt? BBCode? HTML?
Type: Welche Werte können gespeichert werden?
Rechteeinstellungen: Diverse Rechteeinstellungen, wer die Variable wann genau beschreiben/erstellen oder ändern darf.


Für Variablen gilt natürlich der gleiche Grundsatz wie im Forum auch:
Man sollte NIE den Mitgliedern ermöglichen, HTML abzuspeichern welches dann später im Forum ausgegeben wird. HTML sollte daher nur in Ausnahmefällen und nur für auschließlich vom Admin nutzbare Variablen erlaubt werden.
Hinweis

Hinweis: Neben einigen Standardwerten (Alle, Administratoren/Moderatoren etc.) kann auch eine Konfigurationsvariable vom Typ "grouprights" für die Rechtevergabe verwendet werden.
Das wird im nächsten Abschnitt des Tutorials genauer beschrieben: Grouprights Variablen
Hinweis



Bei den Data-Variablen gibt es zusätzlich noch zwei weitere Felder:

origin type: Hier wird festgelegt, welchem Element im Forum die Datenvariable zugeordnet ist. Soll ein Plugin z.B. Daten zu einem Beitrag speichern, wird hier der Typ "forum_post" ausgewählt.
userseparated: Diese Funktion befindet sich noch in der Betaphase. Wenn userseparated aktiviert wird, wird für jedes Mitglied eine eigene Datenvariable angelegt. Um beim Beispiel des "forum_posts" zu bleiben: Man könnte somit z.B. ein Plugin realisieren, bei dem jedes Mitglied seine eigenen Kommentare zu Beiträgen hinzufügen kann, die dann später auch nur von diesem Mitglied gelesen werden können.



Hallo Welt Beispiel - Globale Variable


Für dieses Tutorial wollen wir eine Variable anlegen die ausgibt wann zuletzt ein Administrator online war.


Plugin-Entwicklung --> Hallo Welt --> Neue globale Variable:

Feldname Wert
Name adminonline
Hidden-Var Nein (die Variable soll immer zur Verfügung stehen)
Parsing Plain Text (BBCode und HTML wird hier nicht benötigt)
Type Chars (es soll ja nur ein Datum gespeichert werden)
Lesen Alle (jeder darf den Wert lesen)
Schreiben Administrator (nur Admins dürfen den Wert ändern)


Globale Variable Beschreiben

Jedesmal, wenn ein Administrator die Seite lädt, wollen wir die die aktuelle Uhrzeit in der globalen Variablen speichern.
Dazu nutzen wir die Javascript-Methode setGlob



für die Speicherung ersetzen wir den Code des Plugin-Templates "Test oben" mit folgedem Code:

1
2
3
4
5
6
7
8
9
10
 

{{user_admin==true.start}}
<script>
var newval = Date.now(); //erzeugt einen aktuellen Timestamp
xobor.plugin("hallowelt").setGlob("adminonline",newval,function(res){
/*Wert gespeichert, keine Ausgabe nötig*/
});
</script>
{{user_admin==true.end}}
 
 



Jetzt wird jedesmal, wenn ein Admin die Seite aufruft. der aktuelle Timestamp in der Variable adminonline gespeichert. Für nicht-Admins können wir das dann auslesen und anzeigen.
Das geschieht mit der getGlob Methode des Pluginsystems.

Globale Variable Lesen und Anzeigen

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 

{{user_admin==false.start}}
 
<div id="admininfo"><!--hier wird später der Wert der Variablen ausgegeben--></div>
 
<script>
 
lastonline = xobor.plugin('hallowelt').getGlob('adminonline');
 
if(lastonline){
timeFormat.displayFormat = 'd.m.Y H:i'; // gewünschtes format des datums
lastonline = timeFormat.format(lastonline); //hier erzuegen wir ein schön formatioertes Datum aus unserem Timestamp - details siehe spoiler unten..
console.log("last:" + lastonline);
$('#admininfo').html("Admin zuletzt online: " + lastonline); //hier wird der Wert in die Div mit der ID admininfo geschrieben
}else{/*Kein Admin war online, nichts ausgeben*/ console.log("nores");}
 

{{user_admin==false.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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
 

{{user_admin==true.start}}
<script>
var newval = Date.now(); //erzeugt einen aktuellen Timestamp
xobor.plugin("hallowelt").setGlob("adminonline",newval,function(res){
/*Wert gespeichert, keine Ausgabe nötig*/
});
</script>
{{user_admin==true.end}}
 
{{user_admin==false.start}}
<div id="admininfo"></div>
 
<script>
 

/**
* man muss ja nicht jedesmal das Rad neu erfinden: Diese Funktion wurde über Google gefunden und formatiert unser Datum im gewünschten Format:
* Return a timestamp with the format "d/m/yy h:MM:ss TT"
* @type {Date}
*/

var timeFormat = {
/**
* Output format.
*
* d - current day
* m - current month
* Y - current Year
*
* H - current hour (24 hour system)
* i - current minute
* s - current second
*/
displayFormat: 'd.m.Y - H:i:s',

/**
* Format given unix-timestamp
*/
format: function(timestamp) {
var d = new Date(timestamp);
var output = this.displayFormat;

output = output.replace(/d/g, this.padZero(d.getDate()))
.replace(/m/g, this.padZero(d.getMonth()+1))
.replace(/Y/g, d.getFullYear())
.replace(/H/g, this.padZero(d.getHours()))
.replace(/i/g, this.padZero(d.getMinutes()))
.replace(/s/g, this.padZero(d.getSeconds()));

return output;

},

/**
* add zero paddings to numbers smaller than 10
*/
padZero: function(number) {
if (number < 10) {
return "0" + number.toString();
}

return number;
}
};
 

lastonline = xobor.plugin('hallowelt').getGlob('adminonline');
 
if(lastonline){
timeFormat.displayFormat = 'd.m.Y H:i'; // gewünschtes format des datums
lastonline = timeFormat.format(lastonline); //hier erzuegen wir ein schön formatioertes Datum aus unserem Timestamp..
console.log("last:" + lastonline);
$('#admininfo').html("Admin zuletzt online: " + lastonline); //hier wird der Wert in die Div mit der ID admininfo geschrieben
}else{/*Kein Admin war online, nichts ausgeben*/ console.log("nores");}

</script>
{{user_admin==false.end}}
 
 





screenshot
Abbildung 1: Anzeige der Online-Zeit unter dem Forum


Hallo Welt Beispiel - Daten Variable


Für dieses Beispiel möchten wir eine variable anlegen, in der gespeichert wird, wann ein Mitglied das letzte Mal sein eigenes Profil aufgerufen hat.
Dabei musss für jedes Mitgllied eine eigene Varaiballe gespeichert werden. Gelöst wird das über eine Datenvariable.


Plugin-Entwicklung --> Hallo Welt --> Neue Data Variable:

Feldname Wert
Name profileonline
Parsing Plain Text (BBCode und HTML wird hier nicht benötigt)
origin_type user_profile (hier legen wiir fest, dass die Variable einem Benutzerprofil zugeordnet wird.)
Type Chars (theoretisch reicht auch ein Int - es soll ja nur ein Timestamp gespeichert werden)
Lesen (alle Leserechte) Alle (jeder darf den Wert lesen)
Schreiben docreate_plugindefault,dochangeall_plugindefault : Administrator (nur der Admin darf immer alles ändern)docreatemyorigin_plugindefault,dochangemyorigin_plugindefault: Alle (Alle dürfen den Wert der Ihnen zugeordneten Variablen ändern)


Daten Variable Beschreiben

Jedesmal, wenn ein Mitglied sein Profil besucht, soll der aktuelle Timestamp gespeichert werden.
Dazu nutzen wir die Javascript-Methode setDataVar



Damit das klappt, müssen wir ein neue Plugin-Template anlegen, welches immer dann geladen wird, wenn ein Benutzerprofil aufgerufen wird.
Das bisher verwendete Element "Test Oben" wird nicht mehr benötigt und kann vorerst gelöscht werden.

Neues Element erstellen -> Plugin Element
Feldname Wert
Template Mitgliederprofil
Footer | Inline Header
Template Name frei wählbar, wir nennen das Element hier Profil Test


In dem neu erstellten Element könnnen wir nun den Code für die Speicherung der Data-Variablen einfügen:
Im Profil gibt es die Variablen
{{userid}} --> Id des Mitglieds, dessen Profil aufgerufen wird
{{user_id}} --> Id des Mitglieds, welches das Profil aufruft

Ist der Wert beider Variablen identisch, wissen wir, dass ein Mitglied gerade sein eigenes Profil aufruft.
In diesem Fall wollen wir den aktuellen Timestamp in der des Nutzerprofils Data-Variablen abspeichern:

1
2
3
4
5
6
7
8
9
10
11
12
 
{{userid=={user_id}.start}}
<script>
var newval = Date.now(); //erzeugt einen aktuellen Timestamp
var origin_type = 3 //siehe https://www.xobor.de/plugin-doc-api.html#Tipps_und_Tricks_Sonstiges_Target_Types
var user_id = {{userid}}; //id des Mitglieds, dem die Variable zugeordnet wird
 
//setdataVar-Aufruf:
xobor.plugin("hallowelt").setDataVar("profileonline",origin_type,user_id,newval,function(res){
/*Wert gespeichert, keine Ausgabe notwendig*/
});
</script>
{{userid=={user_id}.end}}
 



Ruft nun ein Mitglied sein eigenes Profil auf, wird die aktuelle Zeit in der Data-Variablen gespeichert.


Globale Variable Lesen und Anzeigen

Ruft jemand das Profil eines Mitglieds auf möchten wir anzeigen, wann dieses Mitglied zuletzt sein Profil gesehen hat.
Die Abfrage der Variablen geschieht mit der Methode getDataVar()




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 

 
<div id="visitinfo"><!--hier wird später der Wert der Variablen ausgegeben--></div>
 
<script>
//setdataVar-Aufruf:
xobor.plugin("hallowelt").getDataVar("profileonline",3,{{userid}},function(res){
timeFormat.displayFormat = 'd.m.Y H:i'; // gewünschtes format des datums
lastonline = timeFormat.format(res); //hier erzuegen wir ein schön formatiertes Datum aus unserem Timestamp - details siehe spoiler unten..
$('#visitinfo').html('Letzter Profilaufruf dieses Mitglieds: '+lastonline);
});
</script>
 

 
<script>
 
 




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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
 

{{userid=={user_id}.start}}
<script>
var newval = Date.now(); //erzeugt einen aktuellen Timestamp
var origin_type = 3 //siehe https://www.xobor.de/plugin-doc-api.html#Tipps_und_Tricks_Sonstiges_Target_Types
var user_id = {{userid}}; //id des Mitglieds, dem die Variable zugeordnet wird
 
//setdataVar-Aufruf:
xobor.plugin("hallowelt").setDataVar("profileonline",origin_type,user_id,newval,function(res){
/*Wert gespeichert, keine Ausgabe notwendig*/
});
</script>
{{userid=={user_id}.end}}
 

 

<div id="visitinfo"><!--hier wird später der Wert der Variablen ausgegeben--></div>
 
<script>

/**
* man muss ja nicht jedesmal das Rad neu erfinden: Diese Funktion wurde über Google gefunden und formatiert unser Datum im gewünschten Format:
* Return a timestamp with the format "d/m/yy h:MM:ss TT"
* @type {Date}
*/

var timeFormat = {
/**
* Output format.
*
* d - current day
* m - current month
* Y - current Year
*
* H - current hour (24 hour system)
* i - current minute
* s - current second
*/
displayFormat: 'd.m.Y - H:i:s',

/**
* Format given unix-timestamp
*/
format: function(timestamp) {
var d = new Date(timestamp);
var output = this.displayFormat;

output = output.replace(/d/g, this.padZero(d.getDate()))
.replace(/m/g, this.padZero(d.getMonth()+1))
.replace(/Y/g, d.getFullYear())
.replace(/H/g, this.padZero(d.getHours()))
.replace(/i/g, this.padZero(d.getMinutes()))
.replace(/s/g, this.padZero(d.getSeconds()));

return output;

},

/**
* add zero paddings to numbers smaller than 10
*/
padZero: function(number) {
if (number < 10) {
return "0" + number.toString();
}

return number;
}
};
 


//getdataVar-Aufruf:
xobor.plugin("hallowelt").getDataVar("profileonline",3,{{userid}},function(res){
if(res){
timeFormat.displayFormat = 'd.m.Y H:i'; // gewünschtes format des datums
lastonline = timeFormat.format(res); //hier erzuegen wir ein schön formatiertes Datum aus unserem Timestamp - details siehe spoiler unten..
$('#visitinfo').html('Letzter Profilaufruf dieses Mitglieds: '+lastonline);
}else{$('#visitinfo').html('Dieses Mitglied hat sein Profil noch nicht aufgerufen');}
});
</script>
 

 





screenshot
Abbildung 2: Anzeige der Online-Zeit über dem Profil



Du willst es noch genauer wissen?
Weiter geht's im zweiten Teil des Tutorials: Gruppenrechte
Hinweis


Login
Letzte Aktionen im Forum
forum_message forum_message
Ich habe bei meinem Code in Beitrag #5 etwas übersehen. Im newMsg-Array ist die Variable newmsg:pt leider nicht verfügbar. Der Code wird so nicht funktionieren.Ein anderer Ansatz wäre, den bestehenden Activity Feed mit JavaScript (clone()) zu kopieren und bei diesem die Themen oder Beiträge mit CSS ...
forum_message forum_message
Franzi Lück hat einen neuen Beitrag im Thema Mailadressen kein Zugriff geschrieben.
Hallo, Ich habe seit zwei Wochen das selbe Problem wie Lobbo. Weder ich noch meine Moderatoren können auf ihre Mailadresse zugreifen. LG Forennummer: 852020
forum_message forum_message
River, Bruno und Gabriella haben 8 neue Beiträge im Thema PDF Dateien in einem Ordner sammeln geschrieben.
Zitat von Bruno im Beitrag #8Ist sicherlich eine sache für später.Ja, schau dir das später mal an. Es ist auch Ansichts- und Geschmackssache. Für redaktionelle Inhalte dieser Art finde ich eben den Blog ansprechender, zumal es auch dort Kategorien gibt. Rechteeinstellung ist auch vorhanden.Viele Grü...
forum_message forum_message
Zeigt nun wieder alles richtig an
forum_topic forum_topic
Hallo zusammen, bei mir gibt es für jeden Monat einen Rundbrief. Ich würde gerne diese Rundbriefe in einem Ordner sammeln/archivieren , so dass Mitglieder, die später dazukommen oder den Rundbrief verbummelt haben, ihn nochmals aufrufen können. Lässt sich das umsetzen?
forum_topic forum_topic
Mir ist grade aufgefallen das einige Mitglieder die heute online waren nicht in der Liste der online gewesenen aufgelistet werden.hier ein Bsp.[[File:mgliste.PNG|none|auto]]Es gibt auch noch weitere die heute da waren aber in der Liste nicht aufgeführt sind.Foren-Nummer 526321Business Template (v4)
forum_message forum_message
Ingmar hat einen neuen Beitrag im Thema Profil in ein anderes Profil gerutscht geschrieben.
Zitat von Charles im Beitrag #3wie kann das überhaupt passieren, das sich ein Profil in ein anderes drängt?Kann es sein, dass du das Plugin "Alter Ego" verwendest und deine Meldungen damit zusammenhängen? Was soll "das sich ein Profil in ein anderes drängt" bedeuten?`Du hattest gemeldet, dass jemand...
forum_message forum_message
Creator, erst einmal DANKE für die schnelle Antwort.Leider funktioniert es nicht so, wie erhofft. Hier der neue Code inkl. Deiner Ergänzungen (oder habe ich etwas falsch gemacht?){{get_new_messages(newmsg,20)}}<ul class="noimage lastactions forums" id="xActivityFeed">{{newmsg.startlist}}{{msgpos.sta...
forum_message forum_message
Es gibt den index pt im messages-Array, mit dem du die relative Position eines Beitrags bestimmen kannst. Position 1 wäre damit der erste Beitrag eines Themas, den du, wenn ich das richtig verstanden habe, ausschließen möchtest. Da der Vergleich nur in einer Variable funktioniert, musst du vorher ei...
forum_message forum_message
Kordi und Ingmar haben 2 neue Beiträge im Thema Fehlerhafte Sortierung im Familiennamen-Forum geschrieben.
Ingmar, Recht herzlichen Dank für die Antwort. Dann werden wir mal sehn, was es nach dem Update macht.Viele Grüße Kordula
rating rating
Charles hat sich bedankt!
Beitrag: Profil in ein anderes Profil gerutscht
%usernames% hat sich bedankt!
forum_message forum_message
Charles und Ingmar haben 2 neue Beiträge im Thema Profil in ein anderes Profil gerutscht geschrieben.
wie kann das überhaupt passieren, das sich ein Profil in ein anderes drängt?hab ich jetzt auch gemacht
forum_message forum_message
Düsseltal hat einen neuen Beitrag im Thema Activity Feed » Eigene Seite » 50 News geschrieben.
Kann man statt new_messages auch die zuletzt eingestellten 20 Themen anzeigen lassen?
forum_message forum_message
Hallo Ingmar,danke für Deine Antwort.Ich verwende das Business Template (v4)Inzwischen habe ich hier im Forum von der Größenveränderung gelesen. Dies ist schon mal eine große Hilfe.Interessiert wäre ich an mehr als 25 Beiträgen in der Activity Feed Box, zudem wäre ich unendlich froh, könnte ich zwei...
forum_message forum_message
Wo genau ist "im Download"?
forum_message forum_message
Jim hat einen neuen Beitrag im Thema Linien-Farbgebung geschrieben.
Herzlichen Dank euch Beiden. Genau Das war's! Jetzt ist's so, wie ich's mir vorstellte.[[File:HeaderBalken.PNG|none|auto]]
rating rating
Jim hat sich bedankt!
Beitrag: Linien-Farbgebung
%usernames% hat sich bedankt!
rating rating
Jim hat sich bedankt!
Beitrag: Linien-Farbgebung
%usernames% hat sich bedankt!
rating rating
844er hat sich bedankt!
Beitrag: Linien-Farbgebung
%usernames% hat sich bedankt!
forum_topic forum_topic
Halloes hört sich wahrscheinlich unglaublich anDoch ein Mitglied wollte sein Profilbild erneuern und nun ist die Dame männlich gewordenWie kann man diesen Fehler beheben?lg
forum_message forum_message
Mike48 und River haben 2 neue Beiträge im Thema Linien-Farbgebung geschrieben.
Admin → Layout → Farben & Einstellungen → CSS123456 /* Top Navi andere Farbe */.topnavigation_wrap { background-image: unset; border-bottom: unset; background-color: #3f444a;} 
forum_message forum_message
Kordi hat einen neuen Beitrag im Thema Fehlerhafte Sortierung im Familiennamen-Forum geschrieben.
Zu meiner Frage, kann da etwas gemacht werden?Viele Grüße,Kordula
forum_message forum_message
Ingmar und Patty haben 2 neue Beiträge im Thema Forum läd langsam geschrieben.
Zitat von Patty im Beitrag #22Das Problem mit den fehlenden Smilies hab ich auch und ich habe eigentlich nur die die schon drin waren ... auch wechseln die Smilies ständig obwohl niemand etwas ändert---mal kleinere, mal gelbe mal durchsichtige.... Und ich bin der einziǵste der etwas ändern könnte......
rating rating
Wolfgang hat sich bedankt!
Beitrag: Forenkonto bzw Forenspende
%usernames% hat sich bedankt!
forum_topic forum_topic
Jim hat das Thema Linien-Farbgebung erstellt
Ich habe es zwar geschafft, einen Farbverlauf für die Logo- und Navigationszeile hinzukriegen,aber ich komm' einfach nicht drauf, wie sich die dunkle Linie nennt, (Siehe Bild)bzw. welchen CSS-Code ich für die Linien-Farbe #3f444a einsetzen müsste.Hätte mir jemand vielleicht einen Tipp?[[File:Navig...
forum_message forum_message
Bruno hat einen neuen Beitrag im Thema Bildergalerie- Reihenfolge der Fotos geschrieben.
Hallo Mike,danke für den Hinweis. Beim Ausprobieren konnte ich feststellen, dass es noch einfacher geht als mit drag & drop. Über Aktionen>>>Reihenfolge ändern>>>Sortieren nach Name habe ich die gewünschte Reihenfolge bekommen, da ich ja vorher meine Bilder durchnummeriert hatte.
rating rating
Bruno und Gabriella haben sich bedankt!
Beitrag: Bildergalerie- Reihenfolge der Fotos
%usernames% haben sich bedankt!
rsummary rsummary
Jim und 844er haben 3 Beiträge bewertet (Details)
%usernames% hat sich bedankt!
Wer ist Online?
1 Mitglied und 19 Gäste sind Online
Besucher Statistiken
20 Aktive User
1 Mitglied und 19 Gäste sind Online:
844er

Heute waren Online
844er, Ingmar

Besucherrekord
1274 Benutzer gleichzeitig online (11.10.2019 18:19)

Besucherzähler
Heute waren 22 Gäste und 2 Mitglieder, gestern 1585 Gäste und 31 Mitglieder online.

Statistiken
Themen 39360
Beiträge 284551
Mitglieder 11.908
Forum empfehlen