Search the FirstSpirit Knowledge Base
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
Ich glaube ich habe es jetzt selbst lösen können...
Die URL zur Datei sieht beispielhaft so aus:
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
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
Viele Grüße
Marcel
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
Hi Julias,
wenn nicht, dann generiere doch in die combined_css einen dynamischen/random Wert hinein, das sollte theoretisch helfen
Viele Grüße,
Marcel
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
Ich glaube ich habe es jetzt selbst lösen können...
Die URL zur Datei sieht beispielhaft so aus:
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
Hi Julius,
genau solch eine Lösung meinte ich mit der Aussage, einen Random-Wert in die Datei zu schreiben
Viele Grüße
Marcel
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