Questions & Answers

VuuRWerK
I'm new here

CSS-Datei je Section template

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

12 Replies
feddersen
Community Manager

Hallo Christian,

in vielen Projekten wird es folgendermaรŸen umgesetzt:

  • Man schreibt aus der Absatzvorlage heraus eine Variable in den Seitenkontext
  • In der Seitenvorlage muss man dafรผr sorgen, dass der Body, in dem sich die Absรคtze befinden), ganz am Anfang der Seite ausgwertet wird. Dann kann man im HTML-Head die Variable ausgeben

https://community.e-spirit.com/message/8178#8178 sollte dich auf den richtigen Weg bringen.

GrรผรŸe

Christoph

0 Kudos

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

0 Kudos
rbitdd
Returning Responder

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$

0 Kudos
SHeinrich
Returning Observer

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.

0 Kudos

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.

0 Kudos
Peter_Jodeleit
Crownpeak employee

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$

Peter
0 Kudos

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 

0 Kudos

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

0 Kudos

Type a product name