j_mueller
Elite Observer

Caching Problem bei $CMS_INCLUDE(media:"...")$ innerhalb von Medien

Jump to solution

Hallo,

wir haben ein bei der Verwendung von $CMS_INCLUDE$ Anweiswungen innerhalb von Medien...

Der Gedanke war eine in einem Stylesheet weitere Stylesheets einzubinden bzw. zu includen und somit aus Performancegründen in der gerenderten Seite nicht einzelne CSS Dateien laden zu müssen. Leider aktualisiert die Vorschau (auch bei forceRefresh) die Medien nicht korrekt wie es bspw. bei verschachtelten Absatz- und Formatvorlagen der Fall ist.

Ein Beispiel zur Reproduktion:

Seitentemplate:

{...}

<link rel="stylesheet" href="$CMS_REF(media:"combine_css")$" />

{...}

Medium combine_css:

$CMS_INCLUDE(media:"part_css", parse:true)$

Medium part_css:

/* beliebiges css */

Sieht man sich die Vorschau an, wird die Datei combine_css korrekt eingebunden. Darin wird nun auch korrekt der CSS Code des Mediums part_css angezeigt.

Ändert man allerdings etwas an der part_css und lädt die Vorschau neu, wird immer der alte Inhalt der combine_css angezeigt.

Erst wenn man das aufrufende Medium combine_css neu abspeichert wird eine neue Version der Datei erzeugt und die Änderungen aus den 'includeten' Medien werden übernommen.

Wie kann FirstSpirit dazu gebracht werden das Medium combine_css bei jedem Reload der Vorschau neu zu erstellen?

Schöne Grüße

Julius

0 Kudos
1 Solution

Accepted Solutions
j_mueller
Elite Observer

Ich glaube ich habe es jetzt selbst lösen können...

Die URL zur Datei sieht beispielhaft so aus:

/fs5preview/preview/12345/media/DE/current/6789/style.css

Wenn ich in der Datei den aktuellen Timestamp ausgeben lasse, bleibt dieser beim erneuten Aufruf der Datei immer gleich.

Wenn ich - sozusagen als hack - den Dateinamen im letzten Teil der URL ändere, wird die Datei neu generiert (und damit auch die per CMS_INCLUDE eingebundenen Stylesheets richtig ausgegeben).

Für FirstSpirit ist der Name nicht relevant, sondern die Parameter davor (Projekt-ID, Store, Sprache, Revision, StoreElement-ID). Wenn man sich an FirstSpirit 4 zurückerinnert war dort der Dateiname analog immer 'x.css'.

Nun habe ich mir eine kleine Formatvorlage erstellt, die mir das Link-Tag generiert und dabei in der Vorschau an die URL etwas anhängt:

$CMS_IF(!media.empty)$$--

    --$<link rel="stylesheet" href="$CMS_REF(media:media)$$CMS_VALUE(if(#global.preview,"_"+#global.now.timeInMillis+".css"))$" />$--

--$$CMS_END_IF$

Damit wird also glücklicherweise 'erzwungen', dass FirstSpirit die Datei neu generiert.

Vielleicht kann ja ein eSpirit Mitarbeiter (hoffentlich) nochmal bestätigen, dass dieses Vorgehen keine anderen Probleme nach sich zieht.

Schöne Grüße

Julius

View solution in original post

0 Kudos
7 Replies
MarsDD
Occasional Observer

Hallo Julius,

einfach nach einer Änderung in der combine_css eine Leerzeile hinzufügen. Dann werden die Sourcen neu geparsed.

Nach der nächsten Änderung löschst Du diese einfach wieder. Und immer so weiter Smiley Wink

Viele Grüße

Marcel

0 Kudos

Hallo Marcel,

vielen Dank für Deine Antwort.

Dass das funktioniert ist mir durchaus bewusst.

Erst wenn man das aufrufende Medium combine_css neu abspeichert wird eine neue Version der Datei erzeugt {...}

Ich halte das Vorgehen jedoch nicht für die Lösung des Problems und sehe es bei der Entwicklung als äußerst unpraktisch an.

Schöne Grüße

Julius

0 Kudos
MarsDD
Occasional Observer

Hi Julias,

wenn nicht, dann generiere doch in die combined_css einen dynamischen/random Wert hinein, das sollte theoretisch helfen Smiley Happy

Viele Grüße,

Marcel

0 Kudos

Hallo Marcel,

kannst du mir anhand eines Beispiels erklären wie du das meinst? Ich bin mir nicht sicher ob ich es richtig verstanden habe.

Ich denke FirstSpirit generiert für die Vorschau eine Version der Datei und merkt sich dazu die Revisionsnummer. Solange die sich nicht ändert und das Änderungsdatum der generierten Datei die normale Cache-Lebenszeit nicht überschreitet - oder so ähnlich - wird die Datei eben aus dem Cache geladen und nicht neu generiert. Dann dürfte es auch keine Rolle spielen ob in der Datei Anweisungen stehen (was ja der Fall ist) oder statischer Text.

Schöne Grüße

Julius

0 Kudos
j_mueller
Elite Observer

Ich glaube ich habe es jetzt selbst lösen können...

Die URL zur Datei sieht beispielhaft so aus:

/fs5preview/preview/12345/media/DE/current/6789/style.css

Wenn ich in der Datei den aktuellen Timestamp ausgeben lasse, bleibt dieser beim erneuten Aufruf der Datei immer gleich.

Wenn ich - sozusagen als hack - den Dateinamen im letzten Teil der URL ändere, wird die Datei neu generiert (und damit auch die per CMS_INCLUDE eingebundenen Stylesheets richtig ausgegeben).

Für FirstSpirit ist der Name nicht relevant, sondern die Parameter davor (Projekt-ID, Store, Sprache, Revision, StoreElement-ID). Wenn man sich an FirstSpirit 4 zurückerinnert war dort der Dateiname analog immer 'x.css'.

Nun habe ich mir eine kleine Formatvorlage erstellt, die mir das Link-Tag generiert und dabei in der Vorschau an die URL etwas anhängt:

$CMS_IF(!media.empty)$$--

    --$<link rel="stylesheet" href="$CMS_REF(media:media)$$CMS_VALUE(if(#global.preview,"_"+#global.now.timeInMillis+".css"))$" />$--

--$$CMS_END_IF$

Damit wird also glücklicherweise 'erzwungen', dass FirstSpirit die Datei neu generiert.

Vielleicht kann ja ein eSpirit Mitarbeiter (hoffentlich) nochmal bestätigen, dass dieses Vorgehen keine anderen Probleme nach sich zieht.

Schöne Grüße

Julius

0 Kudos
MarsDD
Occasional Observer

Hi Julius,

genau solch eine Lösung meinte ich mit der Aussage, einen Random-Wert in die Datei zu schreiben Smiley Wink

Viele Grüße

Marcel

0 Kudos

Hallo Marcel,

ja - nur nochmal zum Verständnis: Es hat keinen Effekt innerhalb der Datei Werte per Templatesprache dynamisch zu setzen. Der Caching-Mechanismus von FirstSpirit sorgt dafür, dass die Datei - wenn sie einmal erzeugt wurde - gar nicht mehr neu eingelesen/generiert wird, sondern lediglich die Version aus dem Cache geladen wird.

Dass der Workaround/Hack mit dem Ändern des Dateinamens überhaupt funktioniert ist meiner Einschätzung nach Glück.

Der Dateiname wird vom System bei der Generierung nicht verwendet, allerdings scheint die URL sozusagen als Key für den Cache zu dienen.

Dennoch vielen Dank für die Mitarbeit!

Ich hoffe nur dieser Mechanismus funktioniert auch auf lange Sicht. Vielleicht meldet sich ja noch jemand von eSpirit zur Sache.

Schöne Grüße

Julius

0 Kudos