robin_kump
I'm new here

Template lokale Funktion mittels Header-Tag <CMS_VALUE>?

Jump to solution

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

1 Solution

Accepted Solutions

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

View solution in original post

4 Replies
felix_reinhold
Returning Responder

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

0 Kudos

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

0 Kudos

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

0 Kudos