Search the FirstSpirit Knowledge Base
Hallo,
ich hänge an dem Problem, per Script ein GOM-Element (also eine Eingabemaske) zu erzeugen und darin auch Vorgabewerte zu setzen. Die Maskengenerierung geht auch schon (mühsam aufgrund unvollständiger GOM-Dokumentation ), aber bei den Vorgabewerten scheitere ich daran, dass setDefaultValue() einen Wert vom Typ "EditorValue" erwartet, aber ich keinen neuen EditorValue instantiieren kann, weil es sich um Interfaces handelt.
Folgender Script-Beispielcode soll das zeigen (arbeitet im Formular des gerade in Bearbeitung befindlichen Scripts):
// ********** Imports an dieser Stelle zugunsten der Kürze weggelassen ...
// Master language
masterlang = context.getProject().getMasterLanguage();
// Template-Store
ts = context.getUserService().getStore(Store.TEMPLATE_STORE, true, true);
// Aktuelles Script
sc = context.getScript();
// Dessen Formular = GomProvider
gp = sc.getGomProvider();
// Formular löschen
gp.clear();
// Neues Formularelement
fe = new GomText();
// Name setzen - war das mühsam, das rauszufinden ...
a = new ValueOfContractor.Invoke();
d = a.valueOf(Designator.class,"st_text_1");
fe.setName(d);
// Langinfos spare ich mir im Beispiel
// Sprachunabhängig
fe.setUseLanguages(YesNo.NO);
// Default Value ergibt NULL
print fe.getDefaultValue();
// ********* Hier hänge ich: Wie erzeuge ich eine Default-Vorgabe?
// ********* Anschlussfrage: Für einen CMS_INPUT_RADIOBUTTON?
// Element zum GomProvider hinzufügen
gp.add(fe);
// Template aktualisieren
sc.setGomProvider(gp);
// und Speichern
sc.save("Testscript hat sein eigenes Formular verändert");
Wie kann ich da den Default setzen?
Arndt Bär
Für die Erzeugung eines EditorValues gibt es keine direkte API. Was aber gehen sollte: nach dem Setzen des GomProviders via sc.setGomProvider(...) sollte sc.getDefaults() ein Dataobjekt liefern, das die entsprechenden EditorValues beinhaltet und Änderungen ermöglicht. Ein anschließendes sc.setDefaults(...) setzt die geänderten Werte als Vorgabewerte für das GOM. Sprich, Vorgabewertbehandlung zwischen Templateaktualisierung und Skript Speichern durchführen.
Für einen Radiobutton kann ein Wert über die OptionFactory erzeugt werden, die man vom zugehörigen Forumularelement bekommt: fe.getOptionFactory().create("option");
Gruß
Stefan
Ahhhhh (Erleichterung)
Stefan Schulz schrieb:
... nach dem Setzen des GomProviders via sc.setGomProvider(...) ...
das "nach" dem Setzen scheint der entscheidende Hinweis zu ein, vielen Dank. Ich bin davon ausgegangen, dass schon die Erzeugung des GOM-Elements bereits das Default-Objekt anlegen müsste. Im Nachhinein habe ich das wahrscheinlich nicht in Betracht gezogen, weil es nicht in meinen Erstellungsprozess passt. Die Quelldaten, aus denen ich die GOM-Elemente erzeuge, enthalten natürlich aus die Defaults - da ist es logisch, auch gleich das Element mit den Defaults erzeugen. Nun muss ich
Also zwei Durchgänge. Aber Hauptsache, es geht überhaupt. Das probiere ich jetzt einmal aus.
Grüße,
Arndt
Update: getDefaultValue() gibt erst nach dem Speichern :smileyalert: des Templates ein entsprechendes Objekt zurück. Das habe ich erst beim Anlegen eines neues Feldes gemerkt.
Vorher hatte ich zum Testen nur bestehende Masken mit GomList().clear() gelöscht und dann die Eingabefelder neu erzeugt. Da gab es den DefaultValue() auch schon nach dem setGomProvider() (wahrscheinlich aus der alten Instanz des Formularelements).
Also:
Das ist tatsächlich sogar ein Fehler in der Implementierung, dass beim Setzen der (modifizierten) GOM-Definition die Vorgabewerte nicht korrekt angepasst werden.
Interne ID: #104471
Debugging by Doing
Andere Frage: Wo ist denn die GOM-API ausführlicher dokumentiert? Die normale API-Dokumentation bricht irgendwo ab einer bestimmten Ebene ab (in etwa da, wo es von generischen GomElement hin zu den spezifischen Interfaces geht)