felix_reinhold
Returning Responder

CMS_INPUT_LIST type Database per FS_BUTTON füllen

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

0 Kudos
11 Replies
Peter_Jodeleit
Crownpeak employee

Schreib das geänderte FormData mal zurück nach "element".

Peter
0 Kudos

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.

0 Kudos

geht es darum die Oberfäche im JavaClient automatisch zu aktualisieren?

0 Kudos

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 Smiley Wink )

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 Smiley Happy

0 Kudos

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.

Peter
0 Kudos

Dabei übergebe ich die Liste an das Skript folgendermaßen: <PARAM name="prm_loc">#field.cs_location</PARAM>

siehe erster post Smiley Happy

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)

0 Kudos

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

0 Kudos

Danke schonmal für die vielen, schnellen Antworten Smiley Happy

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

0 Kudos

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

0 Kudos