kscheuing
I'm new here

Dynamisches Content-Select über define Funktion

Jump to solution

Guten Tag,

kurze Frage: Ist es möglich, eine Variable, welche ich über eine define Funktion innerhalb des <CMS_HEADER> ermittle, für ein Content-Select im selben Header zu Verwenden. Ziel der Aktion ist ein Content-Select abhängig von einem bestimmten Content, also quasi "dynamisch". Die define funktion gibt den richtigen Wert zurück, der Content-Select funktioniert allerdings trotzdem nicht.

Konkret:

<CMS_HEADER>

    <CMS_FUNCTION name="define" resultname="author_ID">

         <CMS_CDATA_PARAM name="source">

        <![CDATA[

            $CMS_IF(!#global.page.body("content").getChildren().formData.get(#global.language,"tt_author").get().isEmpty)$

                $CMS_VALUE(#global.page.body("content").getChildren().formData.get(<hier Feld>).get())$

            $CMS_ELSE$

                $CMS_VALUE(#global.pageParams.data.get(0).getValue(<hier Feld>).getValue(<hier Feld>))$

            $CMS_END_IF$

        ]]>

          </CMS_CDATA_PARAM>

    </CMS_FUNCTION>

   

    <CMS_FUNCTION name="contentSelect" resultname="fr_autor">

        <CMS_PARAM name="schema" value="schema" />

        <CMS_VALUE_PARAM name="autId" value="author_ID" />

        <QUERY entityType="author">

           <FILTERPARAM parameter="autId" datatype="java.lang.String" value="autId" />

           <EQ attribute="fs_id" datatype="java.lang.String" value="autId"/>

        </QUERY>

    </CMS_FUNCTION>

   

</CMS_HEADER>

Bin ich auf dem Holzweg oder hab ich einfach etwas übersehen ?

Vielen Dank für Hinweise!

Kai

1 Solution

Accepted Solutions

Bei meinem Test funktioniert "toString.toNumber" einwandfrei:

<CMS_HEADER>

     <CMS_FUNCTION name="define" resultname="x">

         <CMS_CDATA_PARAM name="source">$CMS_VALUE(2 * 2)$</CMS_CDATA_PARAM>

    </CMS_FUNCTION>

</CMS_HEADER>

<pre>---

x = $CMS_VALUE(x)$

x.class = $CMS_VALUE(x.class)$

->CMS_VALUE(x.toString)$<- $CMS_VALUE(x.toString.class)$

->$CMS_VALUE(x.toString.trim.toNumber.longValue)$<- $CMS_VALUE(x.toString.trim.toNumber.longValue.class)$<-

---</pre>

Ergibt folgende Ausgabe:

---

x = 4

x.class = de.espirit.firstspirit.parser.impl.TemplateDocumentImpl

->4<- java.lang.String

->4<- java.lang.Long

---

Das "trim" bei meinem Beispiel ist überflüssig, hilft aber eventuell bei dir...

Peter

View solution in original post

0 Kudos
10 Replies
Peter_Jodeleit
Crownpeak employee

Die define-Funktion liefert den falschen Typ, der muss erst nach "String" umgewandelt werden. Ohne es ausprobiert zu haben müsste es also funktionieren, wenn du ein toString ergänzt:

     <CMS_VALUE_PARAM name="autId" value="author_ID.toString" />

Peter
0 Kudos

Hallo Peter,

danke für die schnelle Antwort! Ich denke das ist der richtige Weg, da ich allerdings die "fs_id" in der Datenquelle abfrage, muss die Abfrage eher so aussehen, oder ?:

            <CMS_FUNCTION name="contentSelect" resultname="fr_autor">

                        <CMS_PARAM name="schema" value="schema" />

                        <CMS_VALUE_PARAM name="autId" value="author_ID/>

                        <QUERY entityType="author">

                                   <FILTERPARAM parameter="autId" datatype="java.lang.Long" value="autId" />

                                   <EQ attribute="fs_id" datatype="java.lang.Long" value="autId"/>

                        </QUERY>

            </CMS_FUNCTION>

Nur dann bekomme ich eine NumbersFormatException, da das Ergebnis der Define Methode wohl ein String ist ?! Meine Versuche das Ergebnis der define zu parsen mit Long.valueOf() usw. waren leider erfolglos ... hast du mir ein Tip ?

0 Kudos

Hi Kai,

wenn es ein String ist kannst du mit der Funktion toNumber ein Objekt vom Typ java.lang.Number erstellen.

Damit sollte es dann weiter gehen.

Viele Grüße

Kevin

Genau, insgesamt ergibt das dann:

<CMS_FUNCTION name="contentSelect" resultname="fr_autor">

   <CMS_PARAM name="schema" value="schema" />

   <CMS_VALUE_PARAM name="autId" value="author_ID.toString.toNumber"/>

   <QUERY entityType="author">

        <FILTERPARAM parameter="autId" datatype="java.lang.Long" value="autId" />

        <EQ attribute="fs_id" datatype="java.lang.Long" value="autId"/>

   </QUERY>

</CMS_FUNCTION>

Peter
0 Kudos
kscheuing
I'm new here

Okey, ich weiß jetzt zumindest das der Datentyp nicht das Problem ist, da es in einer anderen Vorlage ohne "define" funktioniert und das parsen hat auch nicht geholfen. Beim Test mit einem manuellen Wert ála:

<CMS_HEADER>

   

    <CMS_FUNCTION name="contentSelect" resultname="fr_autor">

        <CMS_PARAM name="schema" value="schema" />

        <CMS_VALUE_PARAM name="autId" value="194" />

        <QUERY entityType="author">

           <FILTERPARAM parameter="autId" datatype="java.lang.Long"  value="autId" />

           <EQ attribute="fs_id" parameter="autId"/>

        </QUERY>

    </CMS_FUNCTION>

   

</CMS_HEADER>

bekomme ich die erwartete Ausgabe, wenn ich die definierte Variable nutzen will :

<CMS_VALUE_PARAM name="autId" value="author_id" />


bekomme ich nichts. Das die Variable "author_id" die richtigen Werte enthält, habe ich anhand einer Ausgabe in der Vorlage --> $CMS_VALUE(author_ID)$ <-- getestet. Das ContentSelect scheint die Variable nicht ohne weiteres zu schlucken. Hab ich etwas übersehen ?

Danke für eure Antworten!

0 Kudos

Was sagt denn $CMS_VALUE(author_ID.class)$?

Peter

Das hier: de.espirit.firstspirit.parser.impl.TemplateDocumentImpl

Ich denke das ist die richtige Spur! der ContentSelect kann natürlich nichts mit so einem Objekt anfangen. Mit toString.toNumber bekomm ich aber nichts, variationen helfen auch nicht.

0 Kudos

Bei meinem Test funktioniert "toString.toNumber" einwandfrei:

<CMS_HEADER>

     <CMS_FUNCTION name="define" resultname="x">

         <CMS_CDATA_PARAM name="source">$CMS_VALUE(2 * 2)$</CMS_CDATA_PARAM>

    </CMS_FUNCTION>

</CMS_HEADER>

<pre>---

x = $CMS_VALUE(x)$

x.class = $CMS_VALUE(x.class)$

->CMS_VALUE(x.toString)$<- $CMS_VALUE(x.toString.class)$

->$CMS_VALUE(x.toString.trim.toNumber.longValue)$<- $CMS_VALUE(x.toString.trim.toNumber.longValue.class)$<-

---</pre>

Ergibt folgende Ausgabe:

---

x = 4

x.class = de.espirit.firstspirit.parser.impl.TemplateDocumentImpl

->4<- java.lang.String

->4<- java.lang.Long

---

Das "trim" bei meinem Beispiel ist überflüssig, hilft aber eventuell bei dir...

Peter
0 Kudos

Danke Peter, damit hat der Content-Select funktioniert! Smiley Happy

x.toString.trim.toNumber.longValue

Warum genau mit "trim" (ohne das funktioniert es nicht) habe ich jetzt allerdings nicht verstanden. "trim" entfernt laut doku nur die whitespaces.

0 Kudos