AndreasOesterle
I'm new here

Links werden nicht ausgewertet bei toText Methode eines DomElements

Jump to solution

Hallo zusammen,

Wir haben in einem Datenbanktabelle ein CMS_INPUT_DOM Element definiert. Hier ist es dem Redakteur erlaubt, Links zu setzen. Setzt er diese, so wird in unserer Content Projection Seite die HTML Ausgabe aus dem Ausgabekanal des Linktemplates verwendet. Die Ausgabe erfolgt dabei über

$CMS_VALUE(cs_description,default:"")$

So kommt am Ende der Link raus:

<a href=" /ogc/fs5preview/preview/1060029/site/DE/current/1008140/1136587 ">hier</a>

Lesen wir die HTML Ausgabe unseres DomElements aus über:

Store contentStore = userService.getStore(Type.CONTENTSTORE, false);
Content2 content2 = (Content2) contentStore.getStoreElement("glossary", IDProvider.UidType.CONTENTSTORE);
Dataset dataset = content2.getDataset(glossar_entry);
FormData formData = dataset.getFormData();
DomElement dom = (DomElement) formData.get(language, "cs_description").get();
String glossar_entry_desc = dom.toText(true);

So wird der Link mit folgendem HTML ausgegeben:

<a data-link-id="8700de9c-c1b9-4eca-b3f3-040f3157aa26" data-link-template="internal_link" href="#">hier</a>

Dieses Format haben wir aber gar nicht in unserem Link-Template definiert. Es sieht so aus, als findet hier keine Auswertung des Links statt.

Auch ausgelesen über die alte, jetzt deprecated Variante bekomme wir dieselbe Ausgabe:

Store contentStore = userService.getStore(Type.CONTENTSTORE, false);
Content2 content2 = (Content2) contentStore.getStoreElement("glossary", IDProvider.UidType.CONTENTSTORE);
Dataset dataset = content2.getDataset(glossar_entry);
Data formData = dataset.getData();

DataValue dataValue = (DataValue) formData.get("cs_description");
DomEditorValue dom = (DomEditorValue) dataValue.getEditor();
String glossar_entry_desc = dom.toHtml(language);

Muss man das HTML aus dem DomElement noch extra parsen oder wieso wird der Link hier nicht ausgewertet?

Viele Grüsse
Andreas Österle

0 Kudos
1 Solution

Accepted Solutions

Hallo zusammen,

die Methode renderToString steht nur in Seiten-, Absatz-, Datenbank-, und Formatvorlagen zur Verfügung. Wenn man die Methode verwenden will, darf man den Code nicht auslagern in ein Script oder ein Modul.

In unserem Fall greife ich nicht mehr in einem Script über das Content2 Objekt auf das DomElement zu. Den Code habe ich nun in eine Formatvorlage ausgelagert und hole mir über die CMS_FUNCTION contentSelect die Datensatzeinträge. Dort kann ich die Methode renderToString anwenden. Die Datensatzeinträge schreibe ich dann in eine HashMap in dem ich mir ein HashMap in der Formatvorlage erzeuge mit:

$CMS_SET(glossarHashMap, class("java.util.HashMap").new())$

Diese HashMap kann ich dann in meinem Modul weiterbearbeiten.

Ganz schön kompliziert, aber anders scheint es nicht zu gehene.

VG
Andreas Österle

View solution in original post

0 Kudos
6 Replies
AndreasOesterle
I'm new here

Laut Doku gibt es die Methode renderToString die genau das gewünschte Parsing vornimmt.

http://localhost:8000/help/odfs/Vorlagenentwicklung/Vorlagensyntax/Datentypen/DomElement

Schaut man aber in die API, so gibt es dort die Methode nicht:

http://localhost:8000/help/odfs/access/index.html?de/espirit/firstspirit/access/editor/value/DomElem...

Wie kann man jetzt die Methode in einem Modul verwenden?

0 Kudos

Hi,

die Methode toText(boolen) für ein DOM Element ist nicht zur formatierten Werteausgabe gedacht. Sie liefert einen Arbeitswert für Eingabekomponenten. Das Format ermöglicht, die detaillierten Linkdaten an Hand der id auszulesen und beim Setzen die entsprechenden Linkdaten wieder zuzuordnen. Der Verbleib dieser Methode in der API hat wohl eher historische Gründe.

Die für die Vorlagensyntax beschriebene Methode renderToString ist keine API-Methode und explizit für den Generierungskontext gedacht.

Vielleicht beschreiben Sie hier ihren Anwendungsfall, damit sich die Leser Gedanken zu einer Lösung machen können.

Beste Grüße

Stefan

Hallo,

in einem ScheduleContext wollen wir einen Content Select ausführen. Damit der Content Select nicht pro Page ausgeführt wird hängen wir dessen Ergebnis an den Schedule Context. Das spart uns einige Minuten an Generationszeit, da unsere DB Requests nicht die schnellsten sind.

Hierfür lesen wir die Datasource über die API aus und binden das Ergebnis als HashMap an den Schedule Context.

contentStore = context.getUserService().getStore(Type.CONTENTSTORE, false);

glossaryDatasource = contentStore.getContent2ByName("glossary");

entityList = glossaryDatasource.getData(lang);

Wenn die Methode renderToString nicht über die API zugreifbar ist, wie kann man dann ein DomElement in einem Modul oder Beanshell Script auslesen?

Beste Grüsse

Andreas Österle

0 Kudos

Hallo Andreas,

um ein DOM Element auszulesen, muss es in der Generierung erzeugt werden. Es gibt keine API-Methode, die es erlaubt, dies ausserhalb des Generierungskontextes zu tun. Um eine alternative Lösung zu entwickeln, muss man genau verstehen, was Eure fachliche Anforderung ist und um welche Mengengerüste es geht. Bitte diskutiert dies mit einem FirstSpirit Consultant.

Gruß,

--Bernd

--

e-Spirit AG

Dr. Bernd Eßmann

0 Kudos

Hallo zusammen,

die Methode renderToString steht nur in Seiten-, Absatz-, Datenbank-, und Formatvorlagen zur Verfügung. Wenn man die Methode verwenden will, darf man den Code nicht auslagern in ein Script oder ein Modul.

In unserem Fall greife ich nicht mehr in einem Script über das Content2 Objekt auf das DomElement zu. Den Code habe ich nun in eine Formatvorlage ausgelagert und hole mir über die CMS_FUNCTION contentSelect die Datensatzeinträge. Dort kann ich die Methode renderToString anwenden. Die Datensatzeinträge schreibe ich dann in eine HashMap in dem ich mir ein HashMap in der Formatvorlage erzeuge mit:

$CMS_SET(glossarHashMap, class("java.util.HashMap").new())$

Diese HashMap kann ich dann in meinem Modul weiterbearbeiten.

Ganz schön kompliziert, aber anders scheint es nicht zu gehene.

VG
Andreas Österle

0 Kudos

Kleiner Hinweis: $CMS_SET(glossarHashMap, {})$ erzeugt ebenfalls eine Map.

Peter
0 Kudos