Questions & Answers

SOLVED
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

Type a product name