Array speichern in dataVar ergibt Object

06.05.2020 14:19 (zuletzt bearbeitet: 06.05.2020 14:23)
avatar  Mike48
#1 Array speichern in dataVar ergibt Object
avatar
Mitglied

Hallo @Ingmar

Wenn ich ein Array in eine dataVar speichere kommt bein lesen immer ein Object zurück.

testArray = ["Wert1","Wert2","Wert3","Wert4"];
Speichern mit getDataVar.

Nach getDataVar habe ich aber ein Object statt Array
{"0":"Wert1","1":"Wert2","2":"Wert3","3":"Wert4"}

Ist das ein Bug?
Wie kann man erreichen dass nach dem getDataVar wieder ein Array vorhanden ist?

Edit:
Wenn ich das Array aber in ein Object setze dann bleibt es erhalten.
testArray = {
array: ["Wert1","Wert2","Wert3","Wert4"]
}

Dann habe ich nach getDataVar wieder ein Array, aber im Object
testArray .array // ["Wert1","Wert2","Wert3","Wert4"]


www.friends-of-xobor.de (621181 - Template kann wechsel bei Pluin Tests)
www.seniorenclub-sel-koeln.de (578865 - V6 Template)

 Antworten

 Beitrag melden
06.05.2020 14:30
avatar  Ingmar
#2 RE: Array speichern in dataVar ergibt Object
avatar
Technik

Interessant. Da müsste ich selbst nachschauen, ob das ein Fehler oder so gewollt ist.

Unabhängig davon lässt sich das vermutlich schlecht ändern, da sonst ja alte Plugins ggf. nicht funktionieren.

Du kannst dir das recht einfach zwischen Object und Array umwandeln wie du es brauchst...

1
2
3
4
5
6
7
8
 

function toArray(_Object){
var _Array = new Array();
for(var name in _Object){
_Array[name] = _Object[name];
}
return _Array;
}
 



1
2
3
4
5
6
7
 
function toObject(_Array){
var _Object = new Object();
for(var key in _Array){
_Object[key] = _Array[key];
}
return _Object;
}
 



geklaut von hier: https://www.hiren.dev/2011/10/convert-ja...-object-to.html

Viele Grüße,
Ingmar


 Technik · Homepagemodules.de · Miranus GmbH

 Antworten

 Beitrag melden
06.05.2020 15:40 (zuletzt bearbeitet: 06.05.2020 15:46)
avatar  Mike48
#3 RE: Array speichern in dataVar ergibt Object
avatar
Mitglied

Ich werde es wahrscheinlich so machen, daß ich das Array vor dem Speichern in ein Objekt packe und beim Einlesen wieder aus dem Object hole.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
var array_1 = [];
var arrayobj = {
'array':[]
};
 
for(i=0; i<4; i++) {
array_1.push("Wert_"+i); // Array fuellen
}
 
arrayobj.array = array_1; // Array in Object packen und speichern
xobor.plugin('mike48test1a').setDataVar('userdata', 5, tuserID, arrayobj, function(res) {
console.log("Plugin Variablentest - array_1 gespeichert: " + res);
});
 
xobor.plugin('mike48test1a').getDataVar('userdata', 5, tuserID, function(res) {
array_1 = res.array; // Array aus Object holen
});
 
array_1.push("neuerEintrag1"); // mit Array Methode Eintrag einfuegen
 


So brauche ich nur bei setDataVar und getDataVar etwas Code ergänzen und kann die Array-Methoden wie gehabt verwenden.

Ich hatte bisher auch Schleifen benutzt um beim getDataVar wieder Arrays aus den Objecten zu machen.
Das ist aber umständlich und benötigt Zeit. Ich dachte, ich hätte mir das sparen können.
Es gab aber immer zusätzliche Problem wenn das Array mal leer war.

Die Lösung die jetzt gefunden habe löst das Problem auch und ist schneller.


www.friends-of-xobor.de (621181 - Template kann wechsel bei Pluin Tests)
www.seniorenclub-sel-koeln.de (578865 - V6 Template)

 Antworten

 Beitrag melden
03.09.2024 15:48
#4 RE: Array speichern in dataVar ergibt Object
TW
Mitglied

Hi @Mike48

Der Thread ist zwar schon ein paar Jahre alt, doch ich hoffe ich bin hier trotzdem mit meiner Frage richtig.

Ich versuche ein Plugin zu schreiben, womit man eine Freundesliste anlegen kann. Wenn man (aktuell noch per ID und nicht Nutzernamen) die ID in das erste Textfeld eingibt, kann man das Profilbild samt verlinkten Usernamen aufrufen und dazu noch eine Kontaktbeschreibung abgeben. Später sollen diese Daten auch im Profil erscheinen, der Code aktuell ist aus "Einstellungen - Profil editieren"

Da man natürlich mehr als nur einen Kontakt hat, habe ich einen Array erstellt und es funktioniert auch wunderbar, dass man mehrere Kontakte eintippt, die dann in der Übersicht angezeigt werden. Aktuell speichert es nur noch nicht, da ich es nicht hinkriege den Array in einer DataVariable zu speichern.
Mit "localStorage.setItem('KontaktArray', JSON.stringify(KontaktArray));" hat es gut funktioniert, aber es ist eben dann lokal, was nicht Sinn und Zweck der Sache ist, aber es hat mir wenigstens schon einmal gezeigt, dass es generell funktioniert, sobald das speichern und aufrufen klappt

Aktuell suche ich gerade also nach einer Lösung wie ich einen Array in einer DataVariable speichern kann, um es später auch zum Mitglieder Profil zu übertragen. Mit diesen Code hier von dir mit dem Object habe ich es auch versucht, doch allein das Speichern klappt bei mir irgendwie gerade nicht (weswegen auch das getDataVar fehlt, da sonst nichts mehr angezeigt wird).

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
85
86
87
88
89
90
91
92
 
<script>
document.addEventListener('DOMContentLoaded', function() {
let KontaktArray = [];
 
// Funktion zum Anzeigen der Kontakte im contactsOutput
function displayContacts() {
const contactsOutput = document.getElementById('contactsOutput');
contactsOutput.innerHTML = ""; // Clear previous content

 

KontaktArray.forEach(function(contact) {
contactsOutput.innerHTML += `
<div style="background-color: {{global_profile_left}}; border: 2px dotted {{global_input_border}}; border-radius: 10px; display: flex; align-items: flex-start; min-height: 170px; padding: 10px; width: 1097px; margin-bottom: 10px; position: relative; flex-wrap: nowrap;">
<div style="text-align: left; display: flex;">
<img src="${contact.userImage}" style="height: 150px; width: 125px; object-fit: cover; margin-right: 15px; border-radius: 10px;" onerror="this.onerror=null; this.src='https://i.imgur.com/exUMXt7.png';" >
<div style="max-width: calc(100% - 140px);">
<a href="${contact.userLink}" style="font-family: 'Pirates of Cydonia'; font-size: 25px; color: {{global_link_color}}; text-decoration: none; display: block; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;">${contact.uname}</a>
<p style="white-space: normal; overflow-wrap: break-word;">${contact.description}</p>
</div>
</div>
</div>
`;
});

// Show contactsContainer if there are contacts
const contactsContainer = document.getElementById('contactsContainer');
contactsContainer.style.display = KontaktArray.length > 0 ? 'block' : 'none';
}
 
// Event listener für den Button
document.getElementById("myCustomButtonSafe").addEventListener("click", function(event) {
event.preventDefault();

// Wert aus dem Textfeld holen
const inputValue = document.getElementById("inputField").value.trim();

if (inputValue) {
// Plugin-Aufruf, um Benutzerdaten zu erhalten
xobor.plugin("contactoverview").getDeep({ target_id: inputValue, target_type: "3" }, function(userData) {
let uname = userData.uname || "Unbekannter Name";
let userLink = userData.user_link || "";
let userImage = userData.userimage || "Kein Bild verfügbar";
 
const feedbackMessage = document.getElementById("feedbackMessage");
const descriptionField = document.getElementById("inputField2");
const conDescrib = descriptionField.value.trim();
 
if (uname === "Unbekannter Name") {
feedbackMessage.style.color = "red";
feedbackMessage.textContent = "Dieser Benutzer hat keinen gültigen Link. Der Kontakt wird nicht gespeichert.";
setTimeout(() => { feedbackMessage.textContent = ""; }, 3000);
return;
}
 
let combinedString = {
uname: uname,
userLink: userLink,
userImage: userImage,
description: conDescrib
};
 
// Kontakt speichern
KontaktArray.push(combinedString);
 
// Kontakte anzeigen
displayContacts();
 
// Textfeld nach dem Speichern leeren
document.getElementById("inputField").value = '';
document.getElementById("inputField2").value = '';

let Laenge = KontaktArray.length;
var arrayobj = {
'array':[]
};
 
for(i=0; i < Laenge; i++) {
KontaktArray.push("Wert_"+i); // Array fuellen
}

arrayobj.array = KontaktArray; // Array in Object packen und speichern
xobor.plugin('contactoverview').setDataVar('contacts_text_datavar', 3, '{{userid}}', arrayobj, function(res) {
console.log("Plugin Variablentest - KontaktArray gespeichert: " + res);
});


});
}
});
});
</script>
 



Zudem funktioniert bei mir die for Schleife auch nicht wirklich, da werden Platzhalter mit reingespielt, die nicht sein sollten. Allerdings wüsste ich gerade auch nicht, wie man das anders lösen kann bzw wo der Fehler liegt.

Kannst du mir da helfen, wie du es damals gelöst hast oder kennst du einen anderen Lösungsweg für mich?

Vielen Dank und Grüße

PS: Falls sich jemand anderes angesprochen fühlt und mit helfen kann, ich bin über jegliche Hilfe froh


 Antworten

 Beitrag melden
03.09.2024 17:26 (zuletzt bearbeitet: 03.09.2024 17:27)
avatar  Mike48
#5 RE: Array speichern in dataVar ergibt Object
avatar
Mitglied

Zitat von TWD_Grace im Beitrag #4
Mit "localStorage.setItem(\'KontaktArray\', JSON.stringify(KontaktArray));" hat es gut funktioniert, aber es ist eben dann lokal, was nicht Sinn und Zweck der Sache ist, aber es hat mir wenigstens schon einmal gezeigt, dass es generell funktioniert, sobald das speichern und aufrufen klappt


localstore und sessionstore darf in einem Plugin nur über die API erfelgen.
Siehe https://www.xobor.de/plugin-doc-api.html

Mit dem Rest muss ich mich noch beschäftigen.


www.friends-of-xobor.de (621181 - Template kann wechsel bei Pluin Tests)
www.seniorenclub-sel-koeln.de (578865 - V6 Template)

 Antworten

 Beitrag melden
03.09.2024 17:41 (zuletzt bearbeitet: 03.09.2024 17:57)
avatar  Mike48
#6 RE: Array speichern in dataVar ergibt Object
avatar
Mitglied

Welche Consolen Meldungen gibt es dann beim speichern der dataVar?

Ich würde es so machen

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
let Kontakte = {
KontaktArray: []
}
 
let combinedString = {
uname: uname,
userLink: userLink,
userImage: userImage,
description: conDescrib
};
 
// Kontakt speichern
KontaktArray.push(combinedString);
 
xobor.plugin('contactoverview').setDataVar('contacts_text_datavar', 3, '{{user_id}}', Kontakte, function(res) {
console.log("Plugin Variablentest - KontaktArray gespeichert: " + res);
});
 


Für die Variable würde ich erst ein Object (Kontakte{ }) erstellen in dem dann das Array ( KontaktArray[ ] ) ist mit den Objekten (combinedString{ } ) der User.
Beim getDataVar kann man sonst nicht die Array Methoden anwenden.

Lesen dann mit
Kontakte.KontaktArray[idx].uname
Kontakte.KontaktArray[idx].userLink
Kontakte.KontaktArray[idx].userImage
Kontakte.KontaktArray[idx].description

Wo soll die datVar denn gespeichert werden?
Bei dem User in dessen Profil man ist oder im eigenen Profil.
{{userid}} ist dfas Profil vom User was man aufgerufen hat
{{user_id}} ist das eigen Profil

Ich würde sagen, im eigenen, also user_id.


www.friends-of-xobor.de (621181 - Template kann wechsel bei Pluin Tests)
www.seniorenclub-sel-koeln.de (578865 - V6 Template)

 Antworten

 Beitrag melden
03.09.2024 18:36
#7 RE: Array speichern in dataVar ergibt Object
TW
Mitglied

Die Konsolen Meldung war "null"
Aber allein der Hint mit der user_id hat schon etwas geholfen. Nach dem ganzen Tag Coden hat man wohl den Wald vor lauter Bäume nicht mehr gesehen. Damit hat es zum Teil funktioniert, allerdings mit einem anderen Code.

Ich hab nun deinen Code eingebaut, wenn ich jedoch "Kontakte" statt "KontaktArray" nutze, kommt weiterhin "null" bei der Konsolenmeldung. Sobald es "KontaktArray" ist, ist es dann jedoch true. Woran kann dass denn liegen?

Aktuell ist alles in "Einstellungen - Profil editieren" also du liegst komplett richtig, dass es "user_id" ist. "userid" brauche ich dann später, sodass immer die Kontakte vom jeweiligen User abrufen kann.


 Antworten

 Beitrag melden
03.09.2024 18:42
avatar  Mike48
#8 RE: Array speichern in dataVar ergibt Object
avatar
Mitglied

Kleiner Fehler in Zeile 13
Kontakte.KontaktArray.push(combinedString);


www.friends-of-xobor.de (621181 - Template kann wechsel bei Pluin Tests)
www.seniorenclub-sel-koeln.de (578865 - V6 Template)

 Antworten

 Beitrag melden
04.09.2024 08:27
#9 RE: Array speichern in dataVar ergibt Object
l2
Mitglied

Zitat von Mike48 im Beitrag #6
// Kontakt speichern
KontaktArray.push(combinedString);

xobor.plugin('contactoverview').setDataVar('contacts_text_datavar', 3, '{{user_id}}', Kontakte, function(res) {
console.log("Plugin Variablentest - KontaktArray gespeichert: " + res);
});


Schon mal probiert, ein Array als String zu speichern?

1
2
3
4
5
6
7
8
9
10
11
 

xobor.plugin('contactoverview').setDataVar('contacts_text_datavar', 3, '{{user_id}}', JSON.stringify(KontaktArray). function(res) {
console.log("Plugin Variablentest - KontaktArray gespeichert: " + res);
});
 
xobor.plugin('contactoverview').getDataVar('contacts_text_datavar', 3, '{{user_id}}', function(res) {
console.log("Plugin Variablentest - type: " + typeof(res)
+"\n ist "+(Array.isArray(res) ? "array":"kein array"));
console.table(res);
});
 
 





... würde es „Fussball spielen” heissen

vG Bernd‍

 Antworten

 Beitrag melden
04.09.2024 11:25
#10 RE: Array speichern in dataVar ergibt Object
TW
Mitglied

Uhh nice, es funktioniert jetzt. Vielen lieben Dank @Mike48

@l2otbart_57 ein String wäre da wahrscheinlich nicht so gut. Ich habe ja einen String, der vier Daten abspeichert, welcher in den Array dann aufgenommen wird, sodass man per Array dann die verschiedensten Kontakte aufrufen kann. Aber trotzdem danke für deinen Tip p^^


 Antworten

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