Combo-Box im ContentCreator dynamisch befüllen
Author: awellermann
Publication Date: 11/24/2014 8:06
Hallo zusammen,
im Rahmen einer Modulentwicklung versuche ich ein CMS_INPUT_COMBOBOX Feld dynamisch mit eigenen Werten zu füllen. Leider ohne Erfolg :smileywink:
Dabei halte ich mich relativ nah an den zur Verfügung gestellten Code-Beispielen und z.B. das setzen eines Default-Werts für ein Textfeld funktioniert auch wunderbar:
formData.get(EditorValue.SOLE_LANGUAGE, FELD_NAME).set(new String("Hello World"));
Nur bei der Combo-Box wird nach dem gleichen Schema nichts an Werten angezeigt. Versuche Code aus vorhandenen Beiträgen zu verwenden, scheitertn beim Casten des FormFields und der Initalisierung einer OptionFactory....
Ich verwende die FS-Version 5.1.209.
Es wäre super, wenn ihr mir eine kleine Hilfestellung geben könntet.
Danke und Grüße
Andre
Tags: 5.1, befüllen, combo-box, contentcreator, fs
-
Author: awellermann - 11/27/2014 12:06
Kann mir da niemand helfen?
0 -
Author: StefanSchulz - 12/2/2014 12:52
Hallo Andre,
ich befürchte, da fehlt mir ein wenig Kontextwissen, um deine Anfrage zu verstehen. Woher kommt das Combobox-Feld, das du dynamisch füllen willst? Sollen die möglichen Auswahlwerte beeinflusst oder der Wert der Eingabekomponente gesetzt werden?
Beste Grüße
Stefan
0 -
Author: awellermann - 12/3/2014 12:44
Hallo Stefan,
also die Combo-Box ist in einer XML-Datei definiert, welche ich innerhalb des Java-Codes einlese und anschließend darstellen lassen.
Kontext: WebeditInlineEditItemsPlugin bzw. ExecutableInlineEditItem.
<CMS_MODULE>
<CMS_INPUT_COMBOBOX name="name" useLanguages="YES">
<ENTRIES>
</ENTRIES>
<LANGINFOS>
<LANGINFO lang="*" label="text" description="TEXT"/>
<LANGINFO lang="DE" label="text" description="TEXT"/>
</LANGINFOS>
</CMS_INPUT_COMBOBOX>
....
final Form form = context.requireSpecialist(FormsAgent.TYPE).getForm(_formDefinition);
operation.setFormData(contentData);
Die definierten Formelemente werden im ContentCreator auch dargestellt (ohne Werte natürlich), nun möchte ich eben diese Combo-Box aus dem Java-Code heraus mit Werten befüllen.
Ich hoffe die Informationen reichen aus.
Grüße
Andre.
0 -
Author: StefanSchulz - 12/3/2014 13:03
Hi Andre,
da die Liste erlaubter Werte (ENTRIES) in dem XML leer ist, gehe ich dann richtig in der Annahme, dass du mit Werte setzen das Füllen eben dieser Liste meinst? Dann wäre ja der naive Ansatz zunächst, dieses XML entsprechend mit Einträgen zu erweitern. Also bspw. einen Platzhalter in das XML in die Datei schreiben und diesen per Java-Code mit den fehlenden ENTRY-Definitionen zu ersetzen.
Wenn ich das jetzt aber falsch verstehe, und du wirklich den Wert der Eingabekomponente setzen, also die Combobox programmatisch auswählen willst, dann muss dieser gesetzte Wert auch in der Liste erlaubter Einträge sein (aktuell keiner). Dies sollte auch mit Strings funktionieren (falls nicht, bitte Fehlermeldung posten).
Beste Grüße
Stefan
0 -
Author: awellermann - 12/3/2014 13:28
Hi Stefan!
"da die Liste erlaubter Werte (ENTRIES) in dem XML leer ist, gehe ich dann richtig in der Annahme, dass du mit Werte setzen das Füllen eben dieser Liste meinst? Dann wäre ja der naive Ansatz zunächst, dieses XML entsprechend mit Einträgen zu erweitern. Also bspw. einen Platzhalter in das XML in die Datei schreiben und diesen per Java-Code mit den fehlenden ENTRY-Definitionen zu ersetzen."
Das Problem ist dabei, dass die Anzahl von Einträgen variieren kann.
Grüße
Andre
0 -
Author: StefanSchulz - 12/3/2014 13:33
Hallo Andre,
ja, ich würde auch nur einen Platzhalter nehmen und ihn einmal mit der generierten Liste ersetzen. :smileywink:
Beste Grüße
Stefan
0 -
Author: awellermann - 12/4/2014 13:20
Hallo Stefan,
hättest du da vll einen kleinen Code-Ausschnitt als Ansatz, wie das Ganze aussehen könnte?
Grüße
Andre
0 -
Author: StefanSchulz - 12/4/2014 13:30
Hm... kann ich leider nicht mit dienen. Würde die Standard-Java-Mittel nutzen:
1. StringBuilder um den XML-Schnipsel für die Einträge aus deiner Quelle zusammensetzen. Also eine Kette von ENTRY-Definitionen.
2. String.replace() nutzen, um den Platzhalter im aus der Datei geladenen Text mit obigem Schnipsel ersetzen.
Ich hoffe, wir reden hier nicht aneinander vorbei.
Beste Grüße
Stefan
0 -
Author: awellermann - 12/4/2014 15:27
Also ich denke, dass müsste irgendwie so in der Richtung aussehen, wenn es überhaupt mit der <CMS_INPUT_COMBOBOX> möglich ist:
final FormData formData = form.createFormData();
FormField<?> formField =formData.get(ComboboxEditorValue.SOLE_LANGUAGE,
"name");
GomFormElement gomElement = formData.getForm().findEditor("name");
OptionFactory factory = ((OptionFactoryProvider) gomElement).getOptionFactory();
//An dieser Stelle weiß ich eben nicht was ich übergeben kann, sodass keine Exception fliegt, da als Parameter Object erwartet wird.
formField.set(factory.create("Mein Objekt"));
Ist das überhaupt möglich oder kann man nur ein FS-Objekt z.B. Entity übergeben?
Gruß
Andre
0 -
Author: StefanSchulz - 12/5/2014 6:46
Hi Andre,
dann haben wir doch aneinander vorbei geredet? Dein Code-Beispiel dient dem Setzen des Wertes der Eingabekomponente. Das XML weiter oben zeigt eine unvollständige Definition der Combobox (keine Einträge in ENTRIES) und auch ohne Anbindung an eine Datenquelle (CMS_INCLUDE_OPTIONS). Wenn dieses XML so bestehen bleibt, kann die Combobox keine Werte aufnehmen, weil die Definitionsmenge leer ist.
Was in deinem Code-Beispiel als Parameter übergeben werden kann, hängt von der konkreten Definition des XML ab. Ist es eintragsbasiert (also ENTRY-Elemente im XML), dann akzeptiert die Factory nur String. Ist es datenbankbasiert (über den Include-Weg), dann kannst du auch ein Entity als Parameter in der Factory setzen.
Beste Grüße
Stefan
0 -
Author: awellermann - 12/5/2014 12:04
Hallo Stefan,
ich versuche jetzt den Weg über <CMS_INCLUDE_OPTIONS type="public"> mein Objekt an die ComboBox zu binden.
Formausschnitt:
<CMS_INPUT_COMBOBOX name="AccountChoice"
useLanguages="YES">
<CMS_INCLUDE_OPTIONS type="public">
<LABELS>
<LABEL lang="*">#item.name</LABEL>
</LABELS>
<NAME>account</NAME>
</CMS_INCLUDE_OPTIONS>
<LANGINFOS>
<LANGINFO lang="*" label="Accountchoice" description="TEXT" />
<LANGINFO lang="DE" label="Accountauswahl" description="TEXT" />
</LANGINFOS>
</CMS_INPUT_COMBOBOX>
Ausschnitt module.xml
<public>
<name>account</name>
<class>---.contentcreator.plugin..model.Account</class>
<resources>
<resource>lib/${project.build.finalName}.jar</resource>
</resources>
</public>
Im ContentCreator erscheint die Meldung "no public class named "account" found" wenn ich mein WebeditInlineEditItemsPlugin öffnen möchte
Das Jar-File wird in der web-app auch ausgeliefert: https://community.e-spirit.com/message/13182#13182
Die Pfad ist korrekt und das jar befindet sich auch im lib-Verzeichnis.
Kannst du mir da weiterhelfen?
Grüße
Andre
0 -
Author: StefanSchulz - 12/5/2014 12:28
Hi Andre,
krasser Sprung in eine andere Richtung…
Ich würde zunächst einmal prüfen, ob die eingebundene Klasse GomIncludeValueProvider implementiert. Wenn dies so ist, habe ich auf die Entfernung erst einmal keine Idee. Vielleicht noch, es im SiteArchitect auszuprobieren. Hm.
Beste Grüße
Stefan
0 -
Author: awellermann - 12/5/2014 15:34
Hi Michael,
ja ein Schritt in die falsche Richtung :smileywink:.
Ich versuche den gesamten Kontext mal genauer zu erläutern:
Also das ist jetzt meine ComboBox-Definition im XML ergänzt um einen Entry.
<CMS_INPUT_COMBOBOX name="Choice"
useLanguages="YES">
<ENTRIES>
<ENTRY value="DUMMY">
<LANGINFOS>
<LANGINFO lang="*" label="dummy" />
<LANGINFO lang="DE" label="dummy" />
</LANGINFOS>
</ENTRY>
</ENTRIES>
<LANGINFOS>
<LANGINFO lang="*" label="Image resoution" description="TEXT" />
<LANGINFO lang="DE" label="Bildauflösung" description="TEXT" />
</LANGINFOS>
</CMS_INPUT_COMBOBOX>
Abhängig von der vorher getätigten Auswahl des Benutzer soll die ComboBox (z.B. Bildauflösung) nun mit Einträgen, die ich mir aus einer eigenen Datenquelle (extern von FS) hole, gefüllt werden. Also dynamisch zur Laufzeit
Wenn ich mich jetzt noch mal auf deinen vorherigen Beitrag beziehe und nach meinem oben beschriebenen Schema (über FormData etc.) z.B. nur einen String reinschreiben möchte mit:
formField.set(factory.create("Hello World")); bekomme ich die Meldung:
"The value Hello World is not a valid option"
Was müsste ich denn übergeben als option übergeben? Den Textfeldern reicht natürlich ein String....
Ein schönes Wochende und Gruß
Andre
0 -
Author: StefanSchulz - 12/8/2014 10:03
Hi Andre,
jetzt ist doch einiges klarer. Es geht nicht nur um generiertes XML sondern auch um dynamische Bestimmung der Wertemenge einer Combobox.
Zum Setzen: Laut Definition erlaubt deine Combobox genau einen Wert: "DUMMY". Daher ist es nicht möglich, einen anderen als diesen zu setzen. Entsprechend die Fehlermeldung, die du beobachtest. Wenn diese Werte aus einer externen Quelle kommen, ist der Ansatz via eigenem ValueProvider schon richtig, wird dir aber nicht entscheidend weiterhelfen, denn diese externe Quelle wird im Verlauf des Formularlebens nur ein Mal (am Anfang) abgefragt.
Die dynamische Bestimmung der Wertemenge ist nur bei Nutzung der Include-Variante mit Datenbankanbindungen und unter Verwendung einer Query möglich, die mit Parametern versehen ist. Hier kann dann die Wertemenge via Regeln beeinflusst werden.
Ein Beispiel für solch eine Regel findet sich hier:
Meine Empfehlung wäre hier, den Weg über die FirstSpirit Datenquellen zu gehen und dort deine Werte und die Kategorienzuordnung (zur Mengenbestimmung via Regeln) einzupflegen.
Beste Grüße
Stefan
0 -
Author: awellermann - 12/11/2014 8:38
Hallo Stefan,
ich habe jetzt den Weg über die Include-Options gewählt, da ich bereits zum beim Öffenen des ContentCreator-Projekts die erforderlichen Daten aus meiner Datenquellen laden kann.
Vielen Dank für deine Hilfe!
Gruß Andre
0
Please sign in to leave a comment.
Comments
15 comments