- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
body-Inhalt als Text ausgeben
Hy!
Wie kann ich mir das hier $CMS_VALUE(#global.page.body("inhalt"))$ als reinen Text ausgeben? Am besten nur die ersten 200 Zeichen, aber das wäre nicht so wichtig im ersten Schritt.
Habe es damit bereits versucht:
- $CMS_VALUE(#global.page.body("inhalt").toText(false))$
- $CMS_VALUE(#global.page.body("inhalt").toString())$
- $CMS_VALUE(#global.page.body("inhalt").rednerToString())$
Aber nichts brachte das gewünschte Ergebnis.
Weiß hier jemand Rat?
Danke im Voraus!
Grüße
Marcus
- Labels:
-
Developers
-
Knowledgebase
Accepted Solutions
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Habe das nun entsprechend so gelöst, dann sind auch die HTML-Tags weg:
<meta name="description" content="$CMS_IF(!pt_zusammenfassung.isEmpty)$$CMS_VALUE(pt_zusammenfassung.toText(false).trim())$$CMS_ELSE$$CMS_SET(fragment)$$CMS_VALUE(#global.page.body("inhalt"))$$CMS_END_SET$$CMS_VALUE(fragment.toString.replaceAll("<[^>]*>"," ").replaceAll("\n"," ").trim().substring(0,200))$...$CMS_END_IF$" />
Danke für die schnelle Hilfe!
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Als Schwabe müsste ich jetzt zuerst mal "hä ?" sagen 😉 Was genau soll den ausgegeben werden?
Die erste 200 Zeichen des ersten Absatzes oder alle Absätze in diesem Inhaltsbereich ?
Wenn zweiteres gewünscht ist müssten über eine Schleife alle Absätze ausgelesen werden:
$CMS_FOR(section,#global.page.body("Inhalt").children)$
$CMS_VALUE(section.getData.toString)$
$CMS_END_FOR$
Allerdings kommt dann erstmal auch alles mögliche XML mit. Bin nicht sicher, ob es da schon eine vorhandene Methode gibt, die hier den Text ausfiltert.
Evtl. ist das bei Euch aber auch nicht so kompliziert und es lässt sich im Vorfeld schon sagen, aus welchem Element die 200 Zeichen kommen sollen ? Evtl. immer ein DOM-Objekt ?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Danke für die Antwort. Also es sind zu 95% immer CMS_INPUT_DOM-Elemente. Und ja, es sollen die ersten 200 Zeichen über alle Absätze ausgegeben werden. Also wirklich die ersten 200 Zeichen des BODY.
Ich brauche da reinen Text, ohne XML, ohne HTML-Tags. Soll später mal als Anreißer für eine Suchmaschine dienen, wenn keine besseren Texte dafür vorhanden sind.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
#global.page.body("inhalt") liefert einen Knoten vom Typ de.espirit.firstspirit.access.store.pagestore.Body. Was du willst, ist das toString eines Template-Fragments.
Dazu muss man das gewünschte erst einmal in ein Template-Fragment einfassen
$CMS_SET(fragment)$$CMS_VALUE(#global.page.body("inhalt))$$CMS_END_SET$
Das gewünschte Ergebnis liefert dann
$CMS_VALUE(fragment.toString.substring(0,200))$
Im Text können aber HTML-Tags enthalten sein und wenn man bei Zeichen 200 schneidet ist das Ergebnis potentiell nicht mehr valide!
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Habe das nun entsprechend so gelöst, dann sind auch die HTML-Tags weg:
<meta name="description" content="$CMS_IF(!pt_zusammenfassung.isEmpty)$$CMS_VALUE(pt_zusammenfassung.toText(false).trim())$$CMS_ELSE$$CMS_SET(fragment)$$CMS_VALUE(#global.page.body("inhalt"))$$CMS_END_SET$$CMS_VALUE(fragment.toString.replaceAll("<[^>]*>"," ").replaceAll("\n"," ").trim().substring(0,200))$...$CMS_END_IF$" />
Danke für die schnelle Hilfe!
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Also einfach das hier (Annahme: jeder Absatz hat den Inhalt in der Eingabekomponente mit dem Namen "dom" stehen.)
$CMS_FOR(body,#global.page.children)$
$CMS_FOR(section,body.children)$
$CMS_IF(!section.data.get("dom").isEmpty)$$CMS_SET(text,section.data.get("dom").getEditor().get(#global.language).toText(false).substring(0, 200))$$CMS_VALUE(text.substring(0, text.lastIndexOf(" ")))$$CMS_END_IF$
$CMS_END_FOR$
$CMS_END_FOR$
Ich hab es jetzt nicht testet, also bitte kritisch auf Tippfehler prüfen.
$CMS_VALUE(text.substring(0, text.lastIndexOf(" ")))$ dient natürlich nur dazu, dass der Ausschnitt nicht mitten in einem Wort endet.
Ich sehe gerade, dass ich mich "verlesen" habe, und nicht die ersten 200 Zeichen jedes Absatz benötigt werden, sondern nur vom ersten. Ich lasse die Antwort trotzdem mal stehen
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Das replaceAll("\n"," ").trim() kann man sich noch sparen, wenn man um das innere Template-Fragment ein $CMS_TRIM legt.
Und Holgers Lösung berücksichtigt noch, das nicht mitten im Wort abgeschnitten wird.

