seegers
Returning Observer

Generierung - Redundanz vermeiden

Jump to solution

Servus allerseits,

in meinem aktuellen Projekt habe eine Navigation so erweitert, dass über eine Schnittstelle externe Inhalte mit aufgenommen werden. Mein "Problem" ist nun, dass diese Aufruf an die Schnittstelle bei der Generierung jeder einzelnen Seite passiert und sich so die Generierungszeit der Seiten insgesamt ordentlich vervielfacht.

Ich habe schon versucht, den Aufruf der Schnittstelle in einem eigenen Template zu kapseln und dieses Template dann über die globalen Inhalte referenziert. Leider wird die Schnittstelle weiterhin mehrfach aufgerufen und nicht wie gehofft nur einmal.

Meine Frage nun: Gibt es FS-CMS native Möglichkeiten, so einen Aufruf nur einmalig durchführen zu können? Die Teilgenerierung von diesem Aufruf mit Ablage eines Snippets im Dateisystem möchten wir eher vermeiden. Wie sind eure Strategien in so einer Situation?

Gruß,

René

0 Kudos
1 Solution

Accepted Solutions
hoebbel
Crownpeak employee

Hallo René,

das ist korrekt.

$CMS_SET(myVar)$<some code>$CMS_END_SET$ speichert den nicht ausgeführten Code, nicht das Ergebnis.

$CMS_SET(myVar,<some code which can be used here>)$ würde das Ergebnis speichern, nur lässt sich hier nicht jeder beliebige Code ausführen.

Das geht noch

$CMS_SET(myTempVar)$<some code>$CMS_END_SET$ $CMS_SET(myVar,myTempVar.toString())$ oder $CMS_SET(myVar,eval(myTempVar))$

Hilft das irgendwie weiter?

Viele Grüsse aus Dortmund,

Holger

View solution in original post

0 Kudos
8 Replies
kscheuing
I'm new here

Externes Nachladen nicht in die Navigation packen - das wäre meine Strategie Smiley Wink

Was wird denn Nachgeladen ? Navigationspunkte ?

1. Hast Du bereits erwähnt.. Teilgenerierung + z.B. SSI

2. Clientseitige Dynamisierung der Navi über eine Logik deiner Wahl. Wird dein Content Delivery Szenario aber unverhältnismäßig Aufblasen.

3. Vielleicht ein iFrame das auf eine separat generierte Page(Navi) referenziert. Nicht wirklich schön.

CMS Seitig sehe ich da aktuell wenig Chancen wenn Du nicht Nachladen willst und der Inhalt auf jeder Seite sichtbar ist. Muss halt generiert werden.

Vielleicht hat aber jemand anderes eine schlaue Idee.

LG, Kai

0 Kudos

Genau, es werden Unterpunkte für die Navigation aus einem anderen System abgefragt. Auf eine andere schlaue Idee hoffe ich auch, denn das Konzept kann man ja generell auf verschiedene Teile einer Seite (insb. Header, Footer) übertragen.

0 Kudos
hoebbel
Crownpeak employee

Hallo René,

> Meine Frage nun: Gibt es FS-CMS native Möglichkeiten, so einen Aufruf nur einmalig durchführen zu können?

im Quelltext der Vorlage der globalen Projekteinstellungen.

Diese wird vor jeder Generierung pro Sprache und Ausgabekanal einmal aufgerufen und die Variablen sind im globalen Kontext verfügbar.

Anmerkung: Auch vor jeder Vorschau wird diese Seite einmal ausgewertet. Wenn die Daten für die Vorschau irrelevant sind, dann über $CMS_IF(!#global.preview)$ nur bei der Generierung ausgeben.

Viele Grüsse aus Dortmund,

Holger

0 Kudos
seegers
Returning Observer

Hallo Holger,

verstehe ich das Prinzip so richtig:

//Template Projekteinstellungen

$CMS_VALUE(#global.logInfo("rsp: productflyout-projectsettings"))$

$CMS_SET(ps_productflyout)$

  $CMS_VALUE(#global.logInfo("rsp: productflyout-set"))$ 

  [...]

  $CMS_RENDER(template:"ft_inc_product_flyout_level")$

  [...]

$CMS_END_SET$

Denn im Logfile taucht "productflyout-projectsettings" zwar nur einmalig, "productflyout-set" jedoch mehrmalig auf. Und da die Generierungszeit immer noch lange dauert, scheint dies noch nicht so recht mein Anliegen zu beheben.

Verstehe ich es richtig, dass in der Variable "ps_productflyout" erst ein Objekt gespeichert wird, welches dann später beim Seitenaufruf erst interpretiert wird und somit die Laufzeit in die Länge zieht?

Gruß,

René

0 Kudos
hoebbel
Crownpeak employee

Hallo René,

das ist korrekt.

$CMS_SET(myVar)$<some code>$CMS_END_SET$ speichert den nicht ausgeführten Code, nicht das Ergebnis.

$CMS_SET(myVar,<some code which can be used here>)$ würde das Ergebnis speichern, nur lässt sich hier nicht jeder beliebige Code ausführen.

Das geht noch

$CMS_SET(myTempVar)$<some code>$CMS_END_SET$ $CMS_SET(myVar,myTempVar.toString())$ oder $CMS_SET(myVar,eval(myTempVar))$

Hilft das irgendwie weiter?

Viele Grüsse aus Dortmund,

Holger

0 Kudos
seegers
Returning Observer

Hallo Holger,

"speichert den nicht ausgeführten Code, nicht das Ergebnis" >> das macht es klarer für mich (und ist wohl auch die Antwort in dem anderen Thread von mir). Bislang dachte ich, dass auch dieser Code direkt ausgeführt wird.

Auf den zweiten Blick: Ja, dies steht ja auch in der Doku ("Der zweite Ausdruck beschreibt die Erzeugung eines Vorlagenfragmentes"), nun verstehe ich auch hier die Bedeutung klarer.

Die weiteren Vorschläge werde ich noch testen, wird aber etwas dauern, da andere Dinge gerade drängender sind.

Gruß und Dank,

René

0 Kudos
seegers
Returning Observer

Hallo Holger,

habe es doch kurz getestet und folgendes funktioniert für mich:

$CMS_SET(myTempVar)$

     <some code>

$CMS_END_SET$

$CMS_SET(myVar,eval(myTempVar))$

Einziger Wermutstropfen ist, dass ich Variablen, welche ich im Generierungskontext setze, so nicht an dieser Stelle verwenden kann. Über diese Variabeln wollte ich unter anderem steuern, welche Schnittstelle je nach Generierungsziel angesprochen wird.

Gibt es für diese Situation auch noch einen Kniff?

Gruß und Dank,

René

0 Kudos
seegers
Returning Observer

Und noch einmal Hallo,

über den folgenden Weg komme ich nun doch an die Variabeln aus dem jeweiligen Generierungstask heran:

$CMS_SET(generationContextVars,{:})$

$CMS_FOR(var,#global.scheduleContext().getTask().getVariables())$

    $CMS_SET(void,generationContextVars.put(var.getKey(),var.getValue()))$

$CMS_END_FOR$

Und kann in meinen Templates anschließend mit

$CMS_VALUE(generationContextVars.dv_varName)$

darauf zugreifen.

Aber ich frage mich, ist dies ein guter Weg oder wird hiervon vielleicht doch aus einem Grunde abgeraten?

Gruß,

René

0 Kudos