seegers
Returning Observer

Variable aus der Generierung in den Projekteinstellungen auswerten

Jump to solution

Servus FS-Community,

ich kann einen Ablauf hier nicht nachvollziehen:

In den Generierungsaufträgen von meinem Projekt setze ich eine Variable:

dv_stagervw

Auf diese möchte ich im Template der Projekteinstellungen zugreifen:

$CMS_IF("rvw".equals(dv_stage))$

    $CMS_SET(ps_projectdomain_res,ps_projectdomain_res+"/media")$

$CMS_END_IF$

Aber dieser Test schlägt fehl, obwohl:

$CMS_SET(test1)$$CMS_VALUE(dv_stage)$$CMS_END_SET$ //Wert: rvw

$CMS_SET(test2)$$CMS_VALUE(dv_stage.getClass())$$CMS_END_SET$ //Wert: java.lang.String

$CMS_SET(test3)$$CMS_VALUE("rvw".equals(dv_stage))$$CMS_END_SET$ //Wert: true

$CMS_SET(test4)$$CMS_VALUE("rvw".equals(dv_stage).getClass())$$CMS_END_SET$ //Wert: java.lang.Boolean

$CMS_SET(key)$value$CMS_END_SET$ liefert mir hier ein TemplateDocumentImpl zurück, während

$CMS_SET(key,value)$ mir Null bzw. Undefined zurück gibt.

Die Sonderfälle zu den Variabeln in den Kontexten​ habe ich mir angesehen und kann das obige Verhalten dennoch nicht ganz nachvollziehen.

Vermutlich liegt es an der Art, wie $CMS_SET(key)$value$CMS_END_SET$ die Ergebnisse holt. Denn sonst müsste meine IF-Abfrage ja funktionieren.

Meine Frage ist also: Wie komme ich im Template der Projekteinstellungen an den Wert einer Variable, die im Generierungskontext gepflegt ist?

Besten Dank im voraus,

René

PS: FS5.2 wird verwendet.

0 Kudos
1 Solution

Accepted Solutions
hoebbel
Crownpeak employee

Hallo René,

das ist auch erwartungskonform, da in var2 "$CMS_VALUE(dv_stage)$" steht. An der Stelle, wo dann var2 ausgegeben wird, steht die Variable zur Verfühgung und kann ausgegeben werden.

Viele Grüsse aus Dortmund,

Holger

View solution in original post

0 Kudos
9 Replies
marro
Crownpeak employee

Hallo René,

hast Du mal ein

$CMS_SET(dv_stage_val)$$CMS_VALUE(dv_stage)$$CMS_END_SET$

$CMS_IF("rvw".equals(dv_stage_val))$ 

    $CMS_SET(ps_projectdomain_res,ps_projectdomain_res+"/media")$ 

$CMS_END_IF$

ausprobiert?

Viele Grüße

Donato

0 Kudos
seegers
Returning Observer

Hallo Donato,

ja, habe ich, nein, funktioniert leider nicht.

//$-- im Templatee der Projekteinstellungen --$

$CMS_SET(dv_stage_val)$$CMS_VALUE(dv_stage)$$CMS_END_SET$

$CMS_IF("rvw".equals(dv_stage))$

  $CMS_SET(ps_result1,"success")$

$CMS_END_IF$

$CMS_IF("rvw".equals(dv_stage_val))$

  $CMS_SET(ps_result2,"success")$

$CMS_END_IF$

//$-- in einem Seitentemplate --$

$CMS_SET(dv_stage_val)$$CMS_VALUE(dv_stage)$$CMS_END_SET$ 

$CMS_IF("rvw".equals(dv_stage))$   

    $CMS_SET(pt_result1,"success")$   

$CMS_END_IF$

$CMS_IF("rvw".equals(dv_stage_val))$   

    $CMS_SET(pt_result2,"success")$   

$CMS_END_IF$

//$-- Ausgabe im Seitentemplate --$                    Ausgabe:

$CMS_VALUE(dv_stage.getClass(),default:"foo")$<br>     //java.lang.String

$CMS_VALUE(dv_stage_val.getClass(),default:"foo")$<br> //de.espirit.firstspirit.parser.impl.TemplateDocumentImpl

$CMS_VALUE(ps_result1,default:"fail ps1")$<br>         //fail ps1

$CMS_VALUE(ps_result2,default:"fail ps2")$<br>         //fail ps2

$CMS_VALUE(pt_result1,default:"fail pt1")$<br>         //success

$CMS_VALUE(pt_result2,default:"fail pt2")$<br>         //fail pt2

Also, in einem Seitentemplate funktioniert es, wenn ich den Wert der Variable direkt vergleiche.

Dein Vorschlag funktioniert nicht, vermutlich da hier ein String ("rvw") mit einer TemplateDocumentImpl verglichen wird.

Im Template für die Projekteinstellungen funktioniert jedoch beides nicht. Genau dort hätte ich es aber eigentlich gerne ausgewertet, um es nur an einer Stelle zu haben. Im Template der Projekteinstellungen liefert mir wie schon oben geschrieben die TemplateDocumentImpl den gewünschten Wert zurück, nur für einen Vergleich kann ich diesen nicht nutzen.

Ich habe die Aufgabenstellung für mich mittlerweile anders gelöst, wäre aber an einer Klärung dennoch grundsätzlich interessiert.

Gruß,

René

0 Kudos
felix_reinhold
Returning Responder

Wird der Variablenwert nicht inline, sondern in einem CMS_SET/CMS_END_SET Block definiert, wird immer ein TemplateDocument erzeugt, dass dann mit einem entsprechenden Evaluator geparsed wird, sobald die Variable ausgewertet wird. Für einen Vergleich müsstest du also noch ein toString() auf der gesetzten Variable machen --> Das erstmal zum TemplateDocument 🙂

Bzgl. der Variable:

Meines Wissens werden die Variablen aus dem Generierungsauftrag in den SITE-STORE Kontext geladen und stehen somit nicht in den Projekteinstellungen zur Verfügung, da diese ja im root-Kontext laufen. Das sollte am besten nochmal jemand von e-spirit bestätigen.

Gruß

Felix

0 Kudos

Hi Felix,

soweit ist dies alles klar. Aber was ich nicht nachvollziehen kann:

//Template der Projekteinstellungen

$CMS_SET(var1,dv_stage)$

$CMS_SET(var2)$$CMS_VALUE(dv_stage)$$CMS_END_SET$

//Ausgabe im Seitentemplate

$CMS_VALUE(var1,default:"")$ //undefined

$CMS_VALUE(var2,default:"")$ //rvw

Die Reihenfolge, wie die Variabeln und Kontexte ausgewertet werden, erschließt sich mir noch nicht so ganz recht.

Im ersten Fall ist die im Generierungsauftrag gesetzte Variable wohl nicht verfügbar (wie du auch schon angeführt hast).

Im zweiten Fall läuft es aber wohl irgendwie anders. Und habe ich es mir bislang nicht zusammen reimen können, warum dies so passiert, in welcher Reihenfolge hier die Objekte und Kontexte ausgewertet werden. Initial erschien es mir, als ob ich mit dem zweiten Fall doch den Wert im Template der Projekteinstellungen hätte verwenden können. Aber vermutlich ist dies nicht der Fall. Nur kann ich bislang diese Vermutung weder positiv noch negativ erklären.

Gruß,

René

0 Kudos
seegers
Returning Observer

Ergänzend:

Dieses hier funktioniert als Lösung für die ursprüngliche Fragestellung, aber nur sofern varX vor ps_projectdomain im Seitenkontext aufgerufen wird. Aber es macht wenig Sinn, wenn ich nun auf allen Seiten varX einfügen müsste. Ich wollte ja alles schön zentral haben.

$CMS_SET(varX)$

  $CMS_IF("rvw".equals(dv_stage))$

    $CMS_SET(ps_projectdomain,ps_projectdomain+"/media")$

  $CMS_END_IF$

$CMS_END_SET$

Aber es bestärkt mich in meiner Vermutung, dass es im Aufruf der Objekte zu signifikanten Unterschieden kommt.

0 Kudos
hoebbel
Crownpeak employee

Hallo René,

> In den Generierungsaufträgen von meinem Projekt setze ich eine Variable:

Diese Variable wird so behandelt, als würde Sie auf dem Root Knoten der Seitenvorlage gesetzt werden.

Sie kann somit über Struktur-Variablen auf tieferen Ordnern überschrieben werden.

Allerdings steht Sie in Kontext der Projekt-Einstellungsseite nicht zur Verfügung, da diese "über" dem Sitestore Root Kontext angesiedelt ist.

Viele Grüsse aus Dortmund,

Holger

0 Kudos
seegers
Returning Observer

Hallo Holger,

danke für die Rückmeldung. Dies erklärt für mich den Fall bei "var1".

Bei "var2" bekomme ich schlußendlich jedoch noch den Wert zurück. Was läuft hier anders? Dieses Verhalten kann ich leider nicht mit deiner Erläuterung in Einklang bringen, ein Puzzelstück scheint mir hier noch zu fehlen.

  1. //Template der Projekteinstellungen
  2. $CMS_SET(var1,dv_stage)$ 
  3. $CMS_SET(var2)$$CMS_VALUE(dv_stage)$$CMS_END_SET$ 
  4. //Ausgabe im Seitentemplate 
  5. $CMS_VALUE(var1,default:"")$ //undefined 
  6. $CMS_VALUE(var2,default:"")$ //rvw 

Gruß,

René

0 Kudos
hoebbel
Crownpeak employee

Hallo René,

das ist auch erwartungskonform, da in var2 "$CMS_VALUE(dv_stage)$" steht. An der Stelle, wo dann var2 ausgegeben wird, steht die Variable zur Verfühgung und kann ausgegeben werden.

Viele Grüsse aus Dortmund,

Holger

0 Kudos
seegers
Returning Observer

Mit deinen Worten aus dem anderen Thread:

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

Jetzt ist der Groschen auch bei mir gefallen.

Gruß und Dank,

René

0 Kudos