Globale Variablen nur für Zahlen nutzbar

19.06.2014 21:17
#1 Globale Variablen nur für Zahlen nutzbar
avatar
Mitglied

Beim Testen der globalen Variablen für Plugins bin ich auf das Problem gestoßen, dass immer nur Zahlen ausgelesen werden können. Der eingestellte Datentyp ist dafür irrelevant.

Ein Integer speichern, kein Problem, sogar dessen Übergabe als String speichert die Zahl korrekt ab:

1
2
3
 
xobor.plugin("globaltest").setGlob("testvar", 100);
 
xobor.plugin("globaltest").setGlob("testvar", "100");
 



Der Test mit Boolean zeigt bereits, dass ebenfalls true/false nicht funktionieren:

1
 
xobor.plugin("globaltest").setGlob("testvar", true);
 



Aktueller Workaround für Boolean besteht darin nur 0 oder 1 zu speichern:

1
 
xobor.plugin("globaltest").setGlob("testvar", 1);
 


Werte größer 1 wurden zwar nach außen hin nicht verschmissen, aber intern wurde der letzte Wert für den Boolean beibehalten.



Texte werden nicht gespeichert:

1
 
xobor.plugin("globaltest").setGlob("testvar", "Test-Text");
 



Texte mit Zahlen oder reine Zahlen hingegen schon:

1
2
3
 
xobor.plugin("globaltest").setGlob("testvar", "12345");
 
xobor.plugin("globaltest").setGlob("testvar", 12345);
 




Meine Tests habe ich übrigens zusätzlich mit den noch undokumentierten Funktions-Aufrufen mit Callbacks durchgeführt. Damit konnte ich sehen, ob der Speichervorgang auch wirklich geklappt hat:

1
2
3
4
5
 
xobor.plugin("globaltest").setGlob("testvar", 1);
 
xobor.plugin("globaltest").setGlob("testvar", 1, function(res){
console.log('setGlob erfolgreich? ' + res);
});
 


Interessanterweise bekam ich beim Setzen von Chars/Text auch true zurückgeliefert, es könnte letztlich also auch nicht am Speichervorgang selbst liegen, sondern nur daran, dass der Inhalt später nicht mehr als Text ausgelesen werden kann.



Habe auch beim Auslesen der globalen Variable mit und ohne den undokumentierten Funktions-Aufruf getestet:

1
2
3
4
5
6
 
console.log(xobor.plugin("globaltest").getGlob("testvar"));
 
xobor.plugin("globaltest").getGlob("testvar", true, function(res){
console.log('getGlob erfolgreich?');
console.log(res);
});
 



Macht da vielleicht ein standardmäßiges Parsen des Wertes bei get(a)Glob als Integer ein Problem?:

1
 
getIntVal(response.message)
 


Beim Auslesen habe ich übrigens keinen Unterschied zwischen aktiviertem hidden und deaktiviertem festgestellt, falls ihr die Info noch benötigt. Und wenn der Parameter bei getGlob für editable auf true stand, wurde vom Wert her kein Unterschiedliches Ergebnis zurückgeliefert, nur eben als JSON-Objekt, die Eigenschaft editable war darin aber immer irgendwie null, undefined oder ''.


Zu Anfang der Tests bekam ich auch immer wieder v404_3 als Ausgabe, obwohl die Variable angelegt war und das Einspeichern erfolgreich. Nachdem ich mit Integern experimentiert hatte, bekam ich den Fehler dann gar nicht mehr und kann es hierfür jetzt leider auch nicht genau reproduzieren, Änderungen gab es bis auf den Datentyp keine (Gleiche Schreib-/Lese-Rechte und Funktionen zum Speichern/Auslesen). Aber könntet ihr da zumindest noch kurz in der Dokumentation ergänzen, welcher String für welchen Fehler steht? Habe das für mich jetzt einfach mal aus den Funktionen hergeleitet.


 Antworten

 Beitrag melden
19.06.2014 23:53 (zuletzt bearbeitet: 20.06.2014 00:05)
#2 RE: Globale Variablen nur für Zahlen nutzbar
avatar
Techniker

Hmmm bei Boolean scheint wirklich etwas hinsichtlich der JS-API schief zu laufen. Das werde ich morgen gleich mal näher untersuchen.

Bzgl. der Speicherung von Texten kann ich dies leider nicht bestätigen.
Gerade eben ohne Probleme

1
2
 
xobor.plugin('fdhrtehrtsjhzter').setGlob('testi2', 'hi du')
xobor.plugin('fdhrtehrtsjhzter').getGlob('testi2')
 



liefert genau das Ergebnis zurück.
Hast du eventuell dich bei den Rechten vertan oder etwas falsch geschrieben?

Zu HiddenVars ...

Hidden bedeutet ... die Variable wird nicht via Template auf jeder Seite ausgegeben, sondern kann nur über die schon von dir entdeckte callbackfn async geholt werden.


 Antworten

 Beitrag melden
20.06.2014 01:03 (zuletzt bearbeitet: 20.06.2014 01:03)
#3 RE: Globale Variablen nur für Zahlen nutzbar
avatar
Mitglied

Das System scheint mich heute zu veräppeln. Oder ihr habt die Scripts im Verlaufe des Tages geupdatet.

Die Rechte hatte ich beide auf all gestellt. Ich habe mir die Code-Schnipsel abgespeichert, um sie später nicht nochmal alle heraussuchen zu müssen. Der Variablenname habe ich bewusst immer kopiert, um Tippfehler zu vermeiden.

Trotzdem lassen sich jetzt gerade tatsächlich Text (und Chars) abspeichern. Wahrscheinlich ein vorübergehendes Problem, hatte ja auch trotz den gleichen Benennungen zu Beginn v404_3, was dann plötzlich verschwand. Vielleicht auch noch eine Nachwirkung vom Script-Cache.


Warum auch immer trat dafür ein neuer Fehler auf. Beim Auslesen von Texten mit nur drei Buchstaben ist das Ergebnis immer NaN, ob die Variable vom Typ Text oder Chars ist spielt keine Rolle. Strings mit keinen, zwei, vier, oder beliebig vielen anderen Zeichen haben funktioniert.

1
2
3
4
5
6
7
8
 
xobor.plugin("globaltest").setGlob("testvar", "abc", function(res){
console.log('setGlob erfolgreich? ' + res);
});
 
xobor.plugin("globaltest").getGlob("testvar", true, function(res){
console.log('getGlob erfolgreich?');
console.log(res);
});
 


Es ist auch egal, ob die Funktion mit oder ohne Callback aufgerufen wird, immer bei eben genau drei Zeichen. Bei der Callback-Variante habe ich natürlich darauf geachtet, nicht aus Versehen ein get mit falschem Wert vor set abzurufen.


Bei der JSON-Ausgabe war editable wieder gemischt ab und zu null und manchmal "". Hat dieser Member oder allgemein die Ausgabe als JSON später noch einen tieferen Sinn?

Das Auslesen nach aktivieren von hidden hat jetzt noch nicht funktioniert. Jeweils alle Rechte gesetzt. Speichern liefert true, beim Auslesen erhalte ich false. Egal ob Parameter editable auf true oder false gesetzt ist. Ich vermute aber mal, dass sich die hiddenGlobals noch in Entwicklung befinden.


 Antworten

 Beitrag melden
12.07.2014 01:06 (zuletzt bearbeitet: 12.07.2014 01:10)
#4 RE: Globale Variablen nur für Zahlen nutzbar
avatar
Mitglied

So, ich habe nun nochmals einige Varianten ausprobiert, um zu sehen, ob und wie jetzt die globalen Variablen funktionieren. Diesmal habe ich auch ein paar Screenshots angefertigt, damit die Ergebnisse etwas anschaulicher werden.

Für alle Aufrufe habe ich folgendes Konstrukt verwendet, wobei sich eigentlich nur 'abcd' durch die jeweils im entsprechenden Screenshot zu sehenden Werte ändert:

1
2
3
4
5
6
7
8
9
10
11
 
xobor.plugin('globaltest').setGlob('testvar', 'abcd', function (res) {
console.log('setGlob erfolgreich? ' + res);
 
if (res) {
console.log('Aufruf dokumentiert: ' + xobor.plugin('globaltest').getGlob('testvar'));
 
xobor.plugin('globaltest').getGlob('testvar', false, function (res) {
console.log('Aufruf undokumentiert: ' + res);
});
}
});
 




Zitat von Christian im Beitrag #2
Hidden bedeutet ... die Variable wird nicht via Template auf jeder Seite ausgegeben, sondern kann nur über die schon von dir entdeckte callbackfn async geholt werden.

Dann beginne ich mal mit dem Abruf als Hidden-Var. Der ständige Aufruf der undokumentierten Methode macht zwar eigentlich nur bedingt Sinn, sie ist jedoch in allen Tests einbezogen, weil sie jedesmal anders (und manchmal unerwartet) reagiert. Steht die globale Variable also auf Hidden, funktioniert keine der beiden Methoden zum Abrufen. Es erfolgt eine Ausgabe von v404_3 bzw. false, unabhängig vom Datentyp. false deute ich hier als Fehler beim Auslesen. An den Rechten kann es nicht liegen, da es nach Entfernen des Häkchens bei Hidden-Var ohne weitere Änderungen prinzipiell funktioniert.




Bei allen weiteren Tests ist die Einstellung Hidden-Var jetzt also nicht aktiv. Das Speichern und Auslesen von Strings funktioniert dabei in den meisten Fällen.



Ein leerer String kann zwar gespeichert werden, gibt beim Auslesen allerdings v404_1 bzw. v404 zurück. Hier weiß ich leider nicht, ob das wirklich so beabsichtigt ist. Ungewollt scheint hingegen zu sein, dass ein String mit drei Zeichen nie mehr ausgelesen werden kann. Welche Zeichen das sind, ist dabei egal. Es funktioniert einfach mit dreien an der Zahl nicht. Egal ob synchroner oder asynchroner Aufruf, ein Fehler oder NaN sind die Folge.




Bleiben noch die Booleans. Ein gespeichertes false oder eine 0 liefern immer v404_1 und false zurück. Letzteres beim asynchronen Aufruf wäre zwar noch (zufällig?) korrekt, aber wahrscheinlich deutet false auch hier wieder wie zuvor nur auf einen Fehler beim Auslesen hin.




Übergibt man für den Boolean eine 1, dann erhält man wie gewünscht true (falls 1 auch als solches intepretiert werden soll) beim asynchronen Aufruf, auch wenn es sich ja nichtmal um eine Hidden-Var handelt. Das synchrone Auslesen gibt dann jedoch wieder eine 1 zurück. Ich vermute mal, dass eigentlich true/false sowohl reingehen als auch rauskommen müssten. Wäre diese Annahme richtig, wenn die Booleans korrekt arbeiten?


 Antworten

 Beitrag melden
15.07.2014 13:30
#5 RE: Globale Variablen nur für Zahlen nutzbar
avatar
Techniker

mit dem nächsten Update kommen einige Problembehebungen bzgl. der API

Generell bzgl. zu Boolean
eine 0 oder 1 ist als Boolean in JS genauso gültig wie ein true oder false. Demzufolge kann bei uns in einem Boolean eine 0/1 oder ein true/false gespeichert werden. Letztlich wird aber immer ein "true" oder "false" nach dem Update zurückkommen.

Das bei einer "hidden-Var" der dokumentierte Aufruf ein false zurückgibt ist normal. Der dokumentierte Aufruf erzeugt keine Verbindung zum Server, sondern fragt eines mit der Seitenausgabe erstelltes Objekt ab.


 Antworten

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