Search the FirstSpirit Knowledge Base
Hallo zusammen,
ich möchte eine CMS_INPUT_LIST über einen FS_BUTTON im gleichen Formular füllen.
Dabei übergebe ich die Liste an das Skript folgendermaßen: <PARAM name="prm_loc">#field.cs_location</PARAM>
Nun bekomme ich es aber leider nicht hin, die Liste mit Entities zu füllen. Wichtig ist hierbei, dass (wie beim FS_BUTTONN üblich) die vom Skript eignetragenen Werte direkt im Formular zu sehen sind. So sieht mein Code (relevante Auschnitte)momentan aus:
//...
// Holen der OptionFactory
GomFormElement gomList = element.getFormData().getForm().findEditor(prm_loc.getName());
OptionFactory factory = ((OptionFactoryProvider) gomList).getOptionFactory();
//...
//Entität, die hinzugefügt werden soll wird hier in die Variable "ent" gelegt, dann:
Option opt = factory.create(ent);
if (prm_loc.isEmpty()) {
nSet = prm_log.get(); //Notifying Set
if (!nSet.contains(opt)){
if (nSet.add(opt)){
prm_loc.set(nSet);
element.save("Added my Location",true);
}
} else {
context.logInfo("Already containing Entity : " + ent.getValue("titel_DE"));
}
}
Das Skript läuft zwar fehlerfrei durch, die Änderung ist jedoch weder direkt, noch nach Speichern und Refresh sichtbar.
Mache ich hier grundlegend was falsch?
Außerdem: Kann ich an der Stelle auf die optionFactory verzichten? Hatte initial nur mit der Entity gearbeitet, das führte jedoch manchmal zu Fehlern und manchmal nicht.
Gruß
Felix
FS-Server/Client: 4.2.453.46978
Schreib das geänderte FormData mal zurück nach "element".
Leider brachte auch das keine Änderung. Habe aber gerade gesehen, dass in obigen Code noch ein kleiner Schreibfehler war. Hier der korrigierte Ausschnitt:
Option opt = factory.create(ent);
nSet = prm_loc.get();
if (!nSet.contains(opt)){
if (nSet.add(opt)){
context.logInfo("Set NS");
prm_loc.set(nSet);
element.setFormData(frmData);
element.save("Added my Location",true);
} else {
context.logInfo("Error while adding Option");
}
} else {
context.logInfo("Already containing Entity : " + ent.getValue("titel_DE"));
}
Da ich aber das übergebene Element bearbeite (prm_loc) und eigtl. nie die FormData des übergebenen Elements hole (Geht nicht, da es die Klasse
de.espirit.firstspirit.client.gui.FormAgentImpl$FormAgentFormField hat) wird sie ja auch nie wirklich angepasst. Ich könnte mir das Feld zwar über die FormData des DataSets (element) holen, dann würden aber die Änderungen ja leider nicht direkt angezeigt werden.
geht es darum die Oberfäche im JavaClient automatisch zu aktualisieren?
Unter anderem.
Hintergrund:
Eine CMS_INPUT_LIST in der Tabellenvorlage "TV1" ermöglicht die Auswahl von "News-Kanälen" aus einer anderen Datenquelle. Die Datenquelle der TV1 ist gefiltert auf einen News-Kanal. Für jeden dieser Kanal wurde händisch eine gefilterte Datenquelle angelegt.
Der Button ist nun dafür da, ein Skript zu starten, dass den News-Kanal aus dem Filter ausliest und ihn an der News (basierend auf TV1) in der CMS_INPUT_LIST hinterlegt (quasi als Vorgabewert). Weitere Channel sollen trotzdem noch händisch hinzugefügt werden können).
Das erfordert einerseits das dynamische Füllen dieser CMS_INPUT_LIST mit einer Entity und außerdem das direkte Anzeigen dieser Änderung. (<-- Kernaussage der Frage )
Normale Vorgabewerte können nicht genutzt werden, da wir so für jeden Channel eine neue Vorlage anlegen müssten.
Hoffe, so ist es einigermaßen verständlich beschrieben
Bitte mal in der Doku von FS_BUTTON nach "#field" suchen. Das ist der Weg, über den man veränderbare FormField-Instanzen bekommt. Änderungen daran werden in der GUI auch visualisiert.
[EDIT]
Zu dem Thema gibt es auch Postings in der Community, z.B. hier.
Dabei übergebe ich die Liste an das Skript folgendermaßen: <PARAM name="prm_loc">#field.cs_location</PARAM>
siehe erster post
Wie ich das Feld übergebe weiß ich, aber es scheitert an dem Einfügen einer Entity in die Liste.
Mein Ansatz (siehe obige Snippets) ist das erzeugen einer Option über eine OptionFactory. Diese füge ich in das NotifyingSet der CMS_INPUT_LIST (#field.cs_location) ein. Danach weise ich der CMS_INPUT_LIST noch das manipulierte NotifyingSet über .set() zu und speichere das 'element'. Leider ändert sich der Inhalt der CMS_INPUT_LIST nicht (weder direkt visualisiert noch nach manuellem speichern und refreshen des Datensatzes)
Hi,
das Speichern über element kann auch nicht funktionieren, weil der Zugriff auf das Feld in FS_BUTTON einen Zugriffsweg auf das Formularfeld bietet und nicht auf ein Feld im Element. Potentiell geht die durch das Skript angestrebte Veränderung durch das explizite Speichern sogar verloren. Bitte mal ohne Speichern probieren und schauen, ob sich nach Beendigung des Skripts der Wert in der Eingabekomponente aktualisiert wird. Wenn nicht, bitte mal im Skript prüfen, ob der Wert nach dem Setzen auch wieder ausgelesen werden kann und dem gewünschten Status entspricht.
Gruß
Stefan
Danke schonmal für die vielen, schnellen Antworten
Habe das Speichern gelöscht, leider brachte es keine sichtbaren Änderungen.
Stefan Schulz schrieb:
...bitte mal im Skript prüfen, ob der Wert nach dem Setzen auch wieder ausgelesen werden kann und dem gewünschten Status entspricht...
Habe mir den Wert nach dem Setzen ausgeben lassen und er entsprach dem gesetzten (prm_loc: übergebene CMS_INPUT_LIST; nSet:NotifyingSet der CMS_INPUT_LIST):
prm_loc.set(nSet);
context.logInfo("Set NS to " + prm_loc.get().first().getValue().getValue("fs_id"));
Ausgegeben wurde die gewünschte FS_ID. Wenn ich das Skript nun ein zweites Mal starte erhalte ich auch bei der contains-Abfrage des NotifyingSets den Status, dass die Option (Entität) bereits in dem NotifyingSet vorhanden ist. Sie scheint also "Backendmäßig" in dem Feld vorhanden zu sein, wird jedoch nicht angezeigt und beim manuellen Speichern der Seite ebenfalls nicht hinterlegt. Könnte es daran liegen, wie ich die Option zusammenbaue? Ich nutze dafür nämlich die FormData des elements, da ich über die übergebene CMS_INPUT_LIST ja an keine FormData/GomFormElement/OptionFactoryProvider herankomme (oder?):
frmData = element.getFormData();
GomFormElement gomList = frmData.getForm().findEditor(prm_loc.getName());
OptionFactory factory = ((OptionFactoryProvider) gomList).getOptionFactory();
....
Option opt = factory.create(ent); //ent = das Entity
Gruß
Felix
Das Erzeugen über die Factory ist schon in Ordnung so.
Sieht mir nach einem Programmfehler aus, den ich jetzt intern unter der ID 123745 eingestellt habe.
Besteht das Problem auch, wenn statt einer CMS_INPUT_LIST eine CMS_INPUT_CHECKBOX eingesetzt wird? (Ist Speicherformatkompatibel und kann einfach ausgetauscht werden.)
Gruß
Stefan