Search the FirstSpirit Knowledge Base
Hallo, kann ich irgendwie bei der Generierung die Wörter einer Seite zählen? Reiner Text - also das, was der Redakteur in den Absatzvorlagen eingegeben hat. Hintergrund ist, dass für bestimmte Seiten im Teaser die Lesedauer stehen soll. Also Seite A enthält Teaser mit Links auf Seite B und C und in den Teasern sollen die jeweiligen Lesedauer stehen. Es gibt zwar diversen Javascript Lösungen im Internet, die sowas zur Laufzeit machen, z.B. https://dev.to/michaelburrows/calculate-the-estimated-reading-time-of-an-article-using-javascript-2k... . Funktioniert aber nur in der Seite selber. Ich habe eine ähnliche Frage gefunden, https://community.e-spirit.com/message/33239, die ziemlich genau das beschreibt, was ich gerne hätte. Leider ohne Antwort, weil der Fragende das Problem anders gelöst hat. Es ist OK, wenn ich dabei globale Inhalte und evtl. Sichtbarkeitsregel nicht beachte. Schöne Grüße, Ana
Hallo Ana,
ich würde mir hierzu ein Modul bauen welches bei der Generierung über ein Skript / Executable an der entsprechenden Stelle aufgerufen wird.
Darin würde ich alle Absätze der Seite durchgehen, innerhalb eines Absatzes jeweils alle Eingabekomponenten durchlaufen und die Inhalte von Textbasierten Eingabekomponenten (DOM, Textfeld, Textarea) zählen. Zum Zählen von Wörtern gibt es bestimmt Java-Bibliotheken, oder man trennt den String einfach an den Leerzeichen und zählt dann die einzelnen Elemente.
Das Ergebnis würde ich dann zurückgeben und über das aufrufende Skript wieder im template ausgeben.
Das ganze sollte auch in reinem Template-Code funktionieren, wenn du kein Modul schreiben willst.
Über folgenden Code kommst du an die einzelnen Absätze und kannst dann über diese und deren EIngabekomponenten iterieren:
$CMS_FOR(for_body, #global.node.getPage().template.bodies)$
$CMS_FOR(for_section, ft_node.getPage().body(for_body.name).children)$
...
$CMS_END_FOR$
$CMS_END_FOR$
Grüße
Sandro
Hallo Ana,
ich würde mir hierzu ein Modul bauen welches bei der Generierung über ein Skript / Executable an der entsprechenden Stelle aufgerufen wird.
Darin würde ich alle Absätze der Seite durchgehen, innerhalb eines Absatzes jeweils alle Eingabekomponenten durchlaufen und die Inhalte von Textbasierten Eingabekomponenten (DOM, Textfeld, Textarea) zählen. Zum Zählen von Wörtern gibt es bestimmt Java-Bibliotheken, oder man trennt den String einfach an den Leerzeichen und zählt dann die einzelnen Elemente.
Das Ergebnis würde ich dann zurückgeben und über das aufrufende Skript wieder im template ausgeben.
Das ganze sollte auch in reinem Template-Code funktionieren, wenn du kein Modul schreiben willst.
Über folgenden Code kommst du an die einzelnen Absätze und kannst dann über diese und deren EIngabekomponenten iterieren:
$CMS_FOR(for_body, #global.node.getPage().template.bodies)$
$CMS_FOR(for_section, ft_node.getPage().body(for_body.name).children)$
...
$CMS_END_FOR$
$CMS_END_FOR$
Grüße
Sandro
Hallo Ana,
noch eine kurze Ergänzung zu dem, was Sandro gesagt hat - benutze bei CMS_INPUT_DOM toText(false). Damit bekommst Du plain Text, so dass Du deine Ergebnisse nicht durch HTML Tags verfälschst
Um die zu berücksichtigenden Eingabekomponenten zu identifizieren, kannst Du über das Template den GomProvider holen und über den die Eingabekomponenten (forms()). Von denen dann einfach den GomElementTag abfragen und wenn der passt, den Inhalt berücksichtigen.
Beispiel für die Ermittlung des Tags der ersten Eingabekomponente:
<SectionTemplate>.getGomProvider().forms().iterator().next().getGomElementTag();
Etwas komplizierter wird das Ganze, wenn Du auch Contentprojektionsseiten (also Ausgaben von Datensätzen) oder gar die Ausgabe im Template (von contentSelect Funktionen, globalen Inhalten...) berücksichtigen musst. Da wäre es dann wahrscheinlich deutlich einfacher, entweder das Ganze mit JavaScript berechnen zu lassen oder erst zu generieren und dann auf Serverseite den generierten Stand auszuwerten und mit dem Ergebnis die Seiten zu "patchen".
Viele Grüße
Holger
Hi Holger, Sandro, danke für eure schnelle Antworten. Ich hatte gehofft, das geht noch einfacher 🙂 aber es ist grundsätzlich möglich, das ist schon mal gut. Liebe Grüße, Ana