Search the FirstSpirit Knowledge Base
Hallo liebe FS-Gemeinde,
ich entwickle gerade ein section template für unseren Kunden. Für die HTML/JSP-Ausgabe benötige ich jedoch zusätzliches CSS. Mein Wunsch wäre jetzt eine extra CSS-Datei anzulegen und diese dann in dem section template zu referenzieren sodass die CSS-Datei nur dann mit geladen wird wenn auch das section template geladen wird. Ich hatte gehofft man gibt die zusätzliche CSS-Datei einfach in der CMS_HEADER-Sektion mit an, nur leider habe ich dazu bisher leider keinerlei Infos gefunden weder hier in der Community noch in der Doku. Wir Entwickler hatten bisher noch keine FS-Entwickler-Schulung, soll aber bald kommen, daher mag die Frage möglicherweise einfach zu beantworten sein. Aktuell fällt mir nur eine Version ein wo ich dem page template ein "if" einbaue und abfrage ob das section template geladen wird und binde dann die extra CSS-Datei ein, aber das kommt mir momentan nicht so schön vor.
Hoffe es gibt dafür eine einfache Lösung, vllt auch auf einen völlig anderen, mir noch unbekannten, Weg.
Viele Grüße
Christian
Hallo Christian,
in vielen Projekten wird es folgendermaßen umgesetzt:
https://community.e-spirit.com/message/8178#8178 sollte dich auf den richtigen Weg bringen.
Grüße
Christoph
Hallo Christoph,
ich habe versucht deinen Ansatz umzusetzen. Was meinst du konkret mit "[...]ganz am Anfang der Seite ausgwertet wird."?
Mein Seitenvorlage:
$CMS_SET(css_special, "0")$
$CMS_SET(ca_content)$
$CMS_VALUE(#global.page.body("content"))$
*
$CMS_END_SET$
<html>
<head>
$CMS_IF(!css_special.equals("0"))$
<HIER soll was passieren, wenn css_special nicht 0 ist>
$CMS_END_IF$
</head>
<body>
$CMS_VALUE(ca_content)$
**
<body>
</html>
Absatzvorlage, was in "content" verwendet wird:
$CMS_SET(#global.context("PAGE")["css_special"], "1")$
Bei mir bekomme ich bei css_special eine 1 nur, wenn ich es in den Body packe (**) oder in den SET-Block nach CMS_VALUE (*). Ich dachte bei diesem Konstrukt macht er eine Variable im Seitenkonzept mit dem Wert 0, wertet den Bereich "content" aus und setzt das Ergebnis in "ca_content". Bei der Auswertung wird die Variable im Seitenkontext überschrieben mit 1 und ist danach auf der Seite auch 1. Anscheinend passiert das Auswerten&Setzen der Variable beim CMS_VALUE im <body>.
Gruß,
Sergej
Wenn ich das richtig verstehe, hast du das Problem, dass ein CMS_SET erst ausgewertet wird, wenn es ausgegeben wird. Und da in dem CMS_SET die Ausgabe des Bodys ist, wird der Body auch erst ausgewertet, wenn du ca_content ausgibt.
Versuch doch bitte mal
$CMS_SET(ca_content)$
$CMS_VALUE(#global.page.body("content").toString())$
*
$CMS_END_SET$
Danke. Hatte ich auch schon probiert, leider ohne Erfolg.
.toString() liefert mir nichts beim Body-Element #global.page.body("content")
Aber das Problem hast du richtig erkannt. Die Werte setzt er alle richtig, es geht mir nur um den Zeitpunkt der Auswertung, die nicht passt.
toString ist schon der richtige Ansatz, allerdings auf dem CMS_SET ausführen:
$CMS_SET(ca_content)$
$CMS_VALUE(#global.page.body("content"))$
*
$CMS_END_SET$
$CMS_SET(ca_content, ca_content.toString())$
Perfekt, so klappt es!
Vielen Dank.
Aktuell fällt mir nur eine Version ein wo ich dem page template ein "if" einbaue und abfrage ob das section template geladen wird und binde dann die extra CSS-Datei ein, aber das kommt mir momentan nicht so schön vor.
Diesen Ansatz finde ich besser als den aktuell umgesetzten (#global.page.body("content").toString()).
Durch das "toString" wird der gesamte Body-Bereich "in memory" gerendert, was den Nachteil hat, das temporär große zusammenhängende Speicherbereiche benötigt werden, was zu einer schlechten Serverperformance führen kann (nicht nur in der Generierung bzw. Vorschau).
Dein initialer Lösungsansatz könnte z.B. so umgesetzt werden (Achtung, ungetesteter Pseude-Code):
$CMS_SET(need_additional_css, false)$
$CMS_FOR(child, #global.page.body("content").children(class("de.espirit.firstspirit.access.store.pagestore.Section"))$
$CMS_IF(child.template.uid == "xxx")$$CMS_SET(need_additional_css, true)$$CMS_END_SET$
$CMS_END_FOR$
Wenn man das ganze kompakter haben will, kann man auch die .filter-Funktion verwenden, um direkt abzufragen:
$CMS_IF(#global.page.body("content").getChildren(class("de.espirit.firstspirit.access.store.pagestore.Section").toList().filter(x->x.
template.uid == "xxx"
).size>0
)$
...Einbindung des CSS...
$CMS_END_IF$
Alternativ könnte man auch mit .map() arbeiten:
$CMS_IF(#global.page.body("content").getChildren(class("de.espirit.firstspirit.access.store.pagestore.Section").toList().map(x->x.
template.uid).contains("xxx")
)$
...Einbindung des CSS...
$CMS_END_IF$
In beiden Fällen muss allerdings toList() verwendet werden. Bei potentiell wenigen Absätzen in einem Inhaltsbereich finde ich das persönlich aber eher unkritisch.
Viele Grüße
Michael
Hallo zusammen,
ich habe eine ähnliches Problem nur mit einer tieferen Verschachtelung, d.h. die Sections beinhalten eine FS_LIST mit weiteren Absatzvorlagen und ich muss genau diese Absatzvorlagen "auswerten". Dies habe ich aktuell so gelöst:
$CMS_SET(set_use_videoplayer, false)$
$CMS_FOR(child, #global.page.body("content").children(class("de.espirit.firstspirit.access.store.pagestore.Section")))$
$CMS_SET(set_referenced_element_uid_map, child.getReferences().map(x->x.getReferencedElement().uid))$
$CMS_SET(set_use_videoplayer, set_referenced_element_uid_map.contains("videoplayer"))$
$CMS_END_FOR$
Nun gibt es natürlich auch Content-Projektionen, die eine Videoeinbindung über die Datenquellen abbilden. Gibt es eine schöne und saubere Möglichkeit eine Liste aller Template-UIDs einer Inhaltsseite zurückzugeben?
Danke und viele Grüße
Philipp