Search the FirstSpirit Knowledge Base
Hallo zusammen,
wir wollen in einem Projekt über einen Webservice auf eine in FS gepflegte DB zugreifen, die Inhalte in einer externen Applikation verarbeiten, aufbereiten und letztlich dynamisch als JSF Tag ausliefern. Bei einfachen Datentypen, wie String oder Integer ist die Verarbeitung ja gar kein Problem, aber was mache ich z.B. wenn ich Felder in der Datenquelle habe, die Inhalte vom komplexen Typ FS_EDITOR (also z.B. FS_LIST, CMS_INPUT_DOM, etc.) besitzen.
Die Idee wäre die DB z.B. per Hibernate anzusprechen und dann die enstsprechenden Felder zu mappen. Wie schaffe ich es jetzt aber die komplexe Struktur einer FS_LIST so zu parsen, dass ich die Inhalte leicht in ein HTML Template schreiben kann und diesen Inhalt dann über das JSF Tag in einer Webseite ausgebe.
Es gibt ja die FormData und FormField API, jedoch sehe ich da noch nicht, wie ich die letztlich als XML vorliegenden Daten einer z.B. FS_LIST hierüber auslesen kann.
Evtl. stehe ich ja jetzt hier einfach auf dem Schlauch. 🙂 Es wäre wirklich toll, wenn mir hier jemand ein paar Denkanstöße geben könnte, wie ich das ganze umsetzen könnte. Also wie bekomme ich die als XML Struktur vorliegenden Daten einer FS_LIST außerhalb von FS ausgelesen und verarbeitet.
Viele Grüße,
Stefan
Eventuell hilft folgende Testklasse weiter, sie liest die Absätze des ersten DOM einer FS_List aus:
public class FS_LIST_TESTER {
public static void main(String... args)
throws MaximumNumberOfSessionsExceededException, IOException,
AuthenticationException {
Connection con = ConnectionManager.getConnection("localhost", 11111,
ConnectionManager.SOCKET_MODE, "Admin", "Admin");
try {
con.connect();
Project pr = con.getProjectByName("Mithras Energy");
UserService us = pr.getUserService();
Language lang = pr.getMasterLanguage();
ContentStoreRoot rt = (ContentStoreRoot) us.getStore(
Store.Type.CONTENTSTORE, false);
//Datenquelle 'pressreleases', hier befindet sich die FS_List, deren Content auszulesen ist
Content2 cont = rt.getContent2ByName("pressreleases");
Entity enti = cont.getData().get(0);
Dataset dat = cont.getDataset(enti);
//cs_content=Variablenname der FS_List in der Tabellenvorlage
DataValue val = dat.getData().get("cs_content");
FsListEditorValue fsLeditor = (FsListEditorValue) val.getEditor();
FormDataList domList = fsLeditor.get(lang);
//Erstes Element der FS_List holen
IdProvidingFormData data = domList.get(0);
//Aus dem Absatz den DOM mit Namen 'st_text' holen
FormField feld = data.get(lang, "st_text");
DomElement domText = (DomElement) feld.get();
// Ab hier org.w3c.dom
Element element = domText.get();
NodeList nodeList = element.getChildNodes();
//Textwerte der Absätze ausgeben
for (int i = 0; i < nodeList.getLength(); i++) {
Element el =(Element)nodeList.item(i);
System.out.println(el.getTextContent());
}
} finally {
con.disconnect();
}
}
}
Parameter müssten angepasst werden
Freundliche Grüße
Ismail
Ich glaube dir wird da nicht viel übrig bleiben, als es selbst zu parsen (Methode schreiben, die XML -> HTML wandelt). Zumindest für das häufig benutzte Dom-Eingabefeld ist mir keine andere Lösung bekannt.
Mich würde es wundern, wenn es einen anderen Weg gäbe. Denn für viele dieser XML-Felder gibt es teils Projektabhängige Vorlagen (Absatztemplates in FS_LIST, Formatforlagen in DOM, ...), die auf dem Client einfach nicht vorhanden sind und daher nicht interpretiert werden können.
Eventuell hilft folgende Testklasse weiter, sie liest die Absätze des ersten DOM einer FS_List aus:
public class FS_LIST_TESTER {
public static void main(String... args)
throws MaximumNumberOfSessionsExceededException, IOException,
AuthenticationException {
Connection con = ConnectionManager.getConnection("localhost", 11111,
ConnectionManager.SOCKET_MODE, "Admin", "Admin");
try {
con.connect();
Project pr = con.getProjectByName("Mithras Energy");
UserService us = pr.getUserService();
Language lang = pr.getMasterLanguage();
ContentStoreRoot rt = (ContentStoreRoot) us.getStore(
Store.Type.CONTENTSTORE, false);
//Datenquelle 'pressreleases', hier befindet sich die FS_List, deren Content auszulesen ist
Content2 cont = rt.getContent2ByName("pressreleases");
Entity enti = cont.getData().get(0);
Dataset dat = cont.getDataset(enti);
//cs_content=Variablenname der FS_List in der Tabellenvorlage
DataValue val = dat.getData().get("cs_content");
FsListEditorValue fsLeditor = (FsListEditorValue) val.getEditor();
FormDataList domList = fsLeditor.get(lang);
//Erstes Element der FS_List holen
IdProvidingFormData data = domList.get(0);
//Aus dem Absatz den DOM mit Namen 'st_text' holen
FormField feld = data.get(lang, "st_text");
DomElement domText = (DomElement) feld.get();
// Ab hier org.w3c.dom
Element element = domText.get();
NodeList nodeList = element.getChildNodes();
//Textwerte der Absätze ausgeben
for (int i = 0; i < nodeList.getLength(); i++) {
Element el =(Element)nodeList.item(i);
System.out.println(el.getTextContent());
}
} finally {
con.disconnect();
}
}
}
Parameter müssten angepasst werden
Freundliche Grüße
Ismail