MarcusDau
Occasional Collector

body-Inhalt als Text ausgeben

Jump to solution

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

0 Kudos
1 Solution

Accepted Solutions

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!

View solution in original post

0 Kudos
6 Replies
thomas_walter
I'm new here

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 ?

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.

Peter_Jodeleit
Crownpeak employee

#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!

Peter

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!

0 Kudos

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 Smiley Wink

0 Kudos

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.

Peter
0 Kudos