daniel_philippi
Occasional Collector

Script: FS_REFERENCE Feld auslesen und in ein XML Feld in DB übertragen

Hallo Zusammen.

In einem Script möchte ich den Inhalt einer Eingabekomponente in eine interne CMS Datenbank schreiben. Das klappt bei String, Zahlen, Date, ... aber nicht bei komplexeren Elementen.

Z.B. möchte ich ein FS_REFERENCE Feld auslesen und in ein XML Feld in der Datenbank schreiben. Bei FS_REFERENCE handelt es sich um ein Medium aus der Medienverwaltung. Ich möchte danach mit dem Feld in der DB arbeiten wie wenn es "normal" vom Redakteur befüllt wurde.

Im Error Log bekomme ich jetzt die Nachricht:

Target exception: java.lang.IllegalArgumentException: de.espirit.or.SchemaException: illegal type class de.espirit.firstspirit.store.access.mediastore.MediaImpl for attribute 'image' - correct type is class de.espirit.firstspirit.client.editorcomponent.EditorWrapper

Nun meine Frage, wie kann ich denn so ein Medium in diesem XML Feld speichern. Kann ich irgendwie das Medium in ein EditorWrapper umwandeln?

Viele Grüße und danke schonmal für die Hilfe.

Daniel

11 Replies

Das würde funktionieren. Ich muss aber Daten während der Generierung in eine Datenquelle schreiben und während der Generierung ist der ContentStore read-only.

Bisher bin ich nicht über die Datenquellen sondern über die Datenbanktabellen gegangen. Dort kann ich schreiben. Allerdings ist hier das Problem des EditorWrappers bzw. der XML Feldes. Alle anderen Felder lassen sich ohne Probleme schreiben.

Ich bräuchte jetzt nur noch einen Tipp wie ich ein Elemente vom Typ Media in einen EditorWrapper speichern kann.

0 Kudos

Vermutlich kann man den auf ein http://www.e-spirit.com/odfs50/access/de/espirit/firstspirit/access/editor/ReferenceEditorValue.html casten und dort dann die UID der Targetreference setzen.

0 Kudos

Guter Versuch.

Laut API müsste das auch funktionieren.

EditorWrapper ew = (EditorWrapper) entity.getValue("image");

ReferenceEditorValue refEditValue = (ReferenceEditorValue) ew;

Allerdings erhalte ich bei folgender Zeile eine NullPointerException:

refEditValue.set(context.getProject().getMasterLanguage(), tr);

Ich hoffe du meintest diese Funktion?!

tr ist dabei meine FS_REFERENCE Eingabekomponente. Bei der Eingabekomponente ist auch ein Bild gewählt.

---------

Aber irgendwie hab ich das Gefühl, dass das nicht das ist was du mit "und dort dann die UID der TargetReference setzen" meinst.

Kannst du es daher bitte etwas genauer beschreiben, danke!

0 Kudos

Hat jemand noch eine Idee?

Braucht man dazu vielleicht das API Access Modul?

0 Kudos

Mit Targetreference meine ich den Datentyp, den eine FS_REFERENCE Komponente zurückliefert.

http://www.e-spirit.com/odfs51/Vorlagenentwicklung/Vorlagensyntax/Datentypen/TargetReference/?commun...

Da musst du dir eine neue erzeugen, wie es auch im Beispiel gemacht wird. http://www.e-spirit.com/odfs51/access/?de/espirit/firstspirit/access/editor/value/TargetReference.ht...

Da du immer nur minimale Schnipsel postet, bei denen die entscheidenen Dinge fehlen, ist es auch schwierig dir zu helfen. Bitte das komplette Script, die kompletten Fehlermeldungen und die verwendete FirstSpirit-Version angeben.

0 Kudos

Ok, hier die gewünschten Daten.

Das folgende Script wird in einer Absatzvorlage per CMS_RENDER aufgerufen und bekommt als Parameter die FS_REFERENCE st_image übergeben. Es wird nur beim Generieren aufgerufen.

import de.espirit.firstspirit.access.schedule.ScheduleContext;

ScheduleContext sc = context.getGenerationContext().getScheduleContext();

sc.setProperty("sc_element_image", st_image);

Das Script speichert das Bild im ScheduleContext, auf den ich im nächsten Schritt wieder zugreife.

Im Auftrag wird nach der Generierung das folgende Script aufgerufen, das dann das Bild in ein bestimmte Datenquelle schreiben soll. In der Datenquelle gibt es ein Feld image vom Typ FirstSpiritEditor.

//!BeanShell

import de.espirit.firstspirit.access.UserService;

import de.espirit.or.Session;

import de.espirit.or.schema.Entity;

UserService userService = context.getProject().getUserService();

Session session = userService.getTemplateStore().getSchemes().getSchemaByName("webworld").getSession();

scProperty = context.getProperty("sc_element_image");

Entity entity = session.createEntity("dq_image");

entity.setValue("image", scProperty);

try {

     session.commit();

}

catch(Throwable error) {

     context.logInfo(error.toString());

}

Für ein Textfeld funktioniert es, nicht für ein Bild das in ein FirstSpirit Editor Feld geschrieben werden soll, da kommt dann die Fehlermeldung im Anhang.

0 Kudos

Im zweiten Skript arbeitest du "low-level" auf der Entity, das passt nicht zur "high-level" Komponente im ersten Skript. Lösung: Im zweiten Skript auch "high-level" arbeiten. Dafür kannst du dich an unseren Beispielen orientieren, siehe How to work with entities

Ok, danke.

Aber funktioniert das dann auch während der Generierung, bei der der Content Store auf read only steht?

0 Kudos