Search the FirstSpirit Knowledge Base
Hallo allerseits,
seit langem wünsche ich mir bereits die Möglichkeit innerhalb eines Templates (z.B. Seitenvorlage) lokale Funktionen deklarieren zu können, anstatt auf Render-Templates oder -Scripte zurückgreifen zu müssen.
Vor Kurzem habe ich entdeckt, dass man dafür eventuell das Header-Tag <CMS_VALUE> verwenden (missbrauchen?) kann, denn die ATTR-Tags können nicht nur wie in den Doku Beispielen statische Inhalte enthalten, sondern auch Template-Code, der zudem erst bei der Ausgabe mit $CMS_VALUE()$ ausgeführt zu werden scheint.
Folgender Template-Code
<CMS_HEADER>
<CMS_VALUE name="pt_vr_test">
<LANG id="*">
<ATTR name="self">
<![CDATA[$CMS_TRIM(level:3, char:"")$
$CMS_VALUE(myVar)$:
$CMS_SWITCH(myVar)$
default
$CMS_CASE("foo")$
bar
$CMS_END_SWITCH$
$CMS_END_TRIM$]]>
</ATTR>
<ATTR name="replace">
<![CDATA[$CMS_TRIM(level:3, char:"")$
$CMS_VALUE(myVar)$:
$CMS_VALUE(myVar.replace("bar", "foo"))$
$CMS_END_TRIM$]]>
</ATTR>
<ATTR name="recursive">
<![CDATA[$CMS_TRIM(level:3, char:"")$
$CMS_VALUE(myVar)$:
$CMS_SET(myVar, myVar.replace("bar", "foo"))$
$CMS_VALUE(pt_vr_test)$
$CMS_END_TRIM$]]>
</ATTR>
</LANG>
</CMS_VALUE>
</CMS_HEADER>$CMS_TRIM(level:3)$
<!--
$CMS_SET(myVar, "foo")$
A1:$CMS_VALUE(pt_vr_test)$
A2:$CMS_VALUE(pt_vr_test.replace)$
A3:$CMS_VALUE(pt_vr_test.recursive)$
$CMS_SET(myVar, "bar")$
B1:$CMS_VALUE(pt_vr_test)$
B2:$CMS_VALUE(pt_vr_test.replace)$
B3:$CMS_VALUE(pt_vr_test.recursive)$
-->
$CMS_END_TRIM$
rendert folgende Ausgabe
<!--
A1:foo:bar
A2:foo:foo
A3:foo:foo:bar
B1:bar:default
B2:bar:foo
B3:bar:foo:bar
-->
<CMS_VALUE> funktioniert auch so:
<CMS_VALUE name="pt_vr_test">
<ATTR name="self">$CMS_TRIM(level:3, char:"")$
$CMS_VALUE(myVar)$:
$CMS_SWITCH(myVar)$
default
$CMS_CASE("foo")$
bar
$CMS_END_SWITCH$
$CMS_END_TRIM$</ATTR>
<ATTR name="replace">$CMS_TRIM(level:3, char:"")$
$CMS_VALUE(myVar)$:
$CMS_VALUE(myVar.replace("bar", "foo"))$
$CMS_END_TRIM$</ATTR>
<ATTR name="recursive">$CMS_TRIM(level:3, char:"")$
$CMS_VALUE(myVar)$:
$CMS_SET(myVar, myVar.replace("bar", "foo"))$
$CMS_VALUE(pt_vr_test)$
$CMS_END_TRIM$</ATTR>
</CMS_VALUE>
Wie man sieht kann man damit ziemlich hässliche Sachen machen - trotzdem finde ich es Interessant.
Die Dokumentation zu <CMS_VALUE> ist relativ knapp. Hat jemand zufällig bereits Erfahrungen damit gemacht?
Beste Grüße
Robin
Hallo Robin,
eine Art lokale Funktion oder eher eine Art lokales Rendertemplate kannst Du mit dem einparametrigen $CMS_SET definieren.
Siehe hierzu auch diesen Beitrag.
Viele Grüße
Michael
Hi Robin,
das kannst du auch einfach über ein CMS_SET Block-Statement lösen.
Statt dem ATTR würde ich dann einfach 3 verschiedene CMS_SET Blöcke machen, oder eine zuvor gesetzt Variable abfragen.
$CM_SET(test)$
$CMS_TRIM(level:3, char:"")$
$CMS_VALUE(myVar)$:
$CMS_SWITCH(myVar)$
default
$CMS_CASE("foo")$
bar
$CMS_END_SWITCH$
$CMS_END_TRIM$
$CMS_END_SET$
$CM_SET(replace)$
$CMS_TRIM(level:3, char:"")$
$CMS_VALUE(myVar)$:
$CMS_VALUE(myVar.replace("bar", "foo"))$
$CMS_END_TRIM$
$CMS_END_SET$
$CMS_SET(recursive)$
$CMS_TRIM(level:3, char:"")$
$CMS_VALUE(myVar)$:
$CMS_SET(myVar, myVar.replace("bar", "foo"))$
$CMS_VALUE(pt_vr_test)$
$CMS_END_TRIM$
$CMS_END_SET$
$CMS_TRIM(level:3)$
<!--
$CMS_SET(myVar, "foo")$
A1:$CMS_VALUE(test)$
A2:$CMS_VALUE(replace)$
A3:$CMS_VALUE(recursive)$
$CMS_SET(myVar, "bar")$
B1:$CMS_VALUE(test)$
B2:$CMS_VALUE(replace)$
B3:$CMS_VALUE(recursive)$
-->
$CMS_END_TRIM$
Ansonsten spricht aber nichts gegen deine Variante. Die Funktion wird nur seit FS 4 immer weniger genutzt und ich merke immer wieder, dass viele Entwickler, die noch nciht so lange FirstSpirit nutzen viele der Header-Funktionen nicht kennen.
Gruß
Felix
Hallo Felix,
wieder was gelernt, besten Dank. Mir war nicht bewusst, dass das bei $CMS_SET()$ funktioniert - habe ich aber auch nie ausprobiert.
Ich habe gedacht, dass die Verarbeitung linear erfolgt, d.h. mit $CMS_VALUE()$ nur noch das Ergebnis ausgegeben wird. Macht aber Sinn die Sachen erst dann zu berechnen, wenn sie auch tatsächlich benötigt werden.
<CMS_VALUE> ist in der Doku ja auch gut versteckt, aber manchmal ist es eben praktisch bestimmte Aktionen an eine exponierte Stelle auszulagern.
Viele Grüße
Robin
Hallo Robin,
eine Art lokale Funktion oder eher eine Art lokales Rendertemplate kannst Du mit dem einparametrigen $CMS_SET definieren.
Siehe hierzu auch diesen Beitrag.
Viele Grüße
Michael
Hallo Michael,
den Beitrag hatte ich gelesen, aber erst jetzt verstanden.
Sowas habe ich gesucht. Danke!
Viele Grüße
Robin