aVogt
Returning Responder

Re: contentSelect mit dynamischem entityType möglich?

Jump to solution

Hallo,

ich hab etwas ähnliches gebraucht (benötigt).

In der Seitenvorlage,- absatzvorlage habe ich folgendes definiert


        <CMS_FUNCTION name="include"  resultname="void">
                <CMS_PARAM name="name"   value="sc_sfo_rgl_aenderungszeitraum" />

                <CMS_PARAM name="TABELLE"  value="BEN_RGL" />

                <CMS_PARAM name="RESULTNAME"  value="BEN" />

        </CMS_FUNCTION>

Dies könnte man für alle notwenidgen tabellen machen (event. kann sogar der Paramter für die Tabelle noch gesetzt werden - ich hab halt so viele CMS_Function geschrieben wie ich brauche)

In der Seite kann ich dann über den Wert von "RESULTNAME"

Die Abfrage selber wird in einem Script (sc_sfo_rgl_aenderungszeitraum) vorgenommen (bzw. Der Zusammanbau)


//!BeanShell
out = new StringBuilder();

out.append("    <CMS_FUNCTION  name=\"contentSelect\"  resultname=\"").append(RESULTNAME).append("\">");

out.append("                     <CMS_VALUE_PARAM name='von'  value='#startdate.set(\"day_of_week\",2).add(\"day_of_week\",-14).set(\"hour\",0).set(\"minute\",0).set(\"second\",0).getTime()'  />");

out.append("                    <CMS_PARAM  name=\"schema\" value=\"SFO\" />");
out.append("                    <QUERY  entityType=\"").append(TABELLE).append("\">");

out.append("                             <FILTERPARAM parameter=\"von\" datatype=\"java.util.Date\"  value=\"1232977740000\"/>");

out.append("                             <IS_NULL attribute=\"BFlag\" />");
out.append("                            <GTE  attribute=\"DVeroeffentlichung\" parameter=\"von\"/>");

out.append("                             <ORDERCRITERIA descending=\"1\" attribute=\"DErstellung\" />");

out.append("                    </QUERY>");

out.append("            </CMS_FUNCTION>");

result.setValue(out.toString());

Die Query selber kannst Du sicher auch noch mit einem Parameter übergeben.

Hoffe es Hilft etwas weiter.


0 Kudos
Mad_Hamish
I'm new here

Re: contentSelect mit dynamischem entityType möglich?

Jump to solution

Hi,

das wäre auch noch mal ein Ansatz. Allerdings macht mir folgender Hinweis in der Doku etwas Sorgen:

"Die Verwendung der Funktion include wird nicht empfohlen. Diese Funktion  wird in einer späteren Version entfallen. Bitte verwenden Sie anstelle der  include-Funktion $CMS_RENDER(..)$-Anweisungen."

Wenn man also "include" verwendet und die Funktion irgendwann wegfällt, hat man nach einem Versionswechsel ein Problem.

0 Kudos
stephan
I'm new here

Re: contentSelect mit dynamischem entityType möglich?

Jump to solution

Hallo,

die Lösung geht denke ich noch etwas einfacher und ohne ein deprecatetes include:

Script: dynamic_contentselect

--

out = new StringBuilder();
out.append("<CMS_HEADER>");
out.append("<CMS_FUNCTION name=\"contentSelect\" resultname=\"fr_news\" context=\"PAGE\">");
out.append("<CMS_PARAM  name=\"schema\" value=\"News\" />");
out.append("<QUERY entityType=\"").append(table).append("\">");
out.append("</QUERY>");
out.append("</CMS_FUNCTION>");
out.append("</CMS_HEADER>");

Aufruf im Template:

--

$CMS_RENDER(script:"dynamic_contentselect",table:"News")$

Die Ausgabe kann dann wie gewohnt über eine Iteration der Liste fr_news erfolgen. Weiter Parameter wie z.B. der Schemaname können bei Bedarf noch an den Renderaufruf angehängt werden.

Mad_Hamish
I'm new here

Re: contentSelect mit dynamischem entityType möglich?

Jump to solution

Hi Jörg,

das scheint es zu sein. Lustigerweise ist das genau das, was ich schon ausprobiert hatte, mit einem

kleinen Unterschied: das Attribut context="PAGE" bei CMS_FUNCTION. Das hatte ich nicht drin.

Gemeinerweise wird das in der Doku auch nur im Teil "Statisches Einfügen einer define-Funktion mit $CMS_RENDER(...)$-Anweisung" erwähnt, im Teil "Dynamisches Einfügen...." wird es einem unterschlagen, d.h. ist nicht im Beispielscode enthalten. Wäre vielleicht eine Idee, das nachzuziehen.

Viele Grüße und danke,

Peter

0 Kudos
hoebbel
Crownpeak employee
Crownpeak employee

Re: contentSelect mit dynamischem entityType möglich?

Jump to solution

Gibst Du das Ergebnis des ContentSelects in dem entsprechenden Formattemplate aus?

Dann darf die Angabe von context nicht notwendig sein!

Gibst Du statt dessen im Seitentemplate oder Absatztemplate (dann solltest Du context="SECTION" benutze) aus, dann könnte das auch die Probleme mit dem CMS_RENDER erklären.

Anmerkung: Die include Funktion ist als deprecated markiert. Sie wird in späteren Versionen [>=5] nicht mehr zur Verfügung stehen!

0 Kudos
Mad_Hamish
I'm new here

Re: contentSelect mit dynamischem entityType möglich?

Jump to solution

Ja, das ContentSelect-Ergebnis wird direkt im FormatTemplate ausgegeben. Es funktioniert aber nur, wenn

ich den context setze.Ich hänge das funktionierende Skript gleich an.

Wenn ich die Zeilen, in denen das FUNCTION-Element mit context-Attribut erzeugt wird, auskommentiere, und dafür die Zeilen darunter (in denen nur das context-Attribut fehlt) einkommentiere, geht es nicht mehr.

0 Kudos
Prinzessin
I'm new here

Re: contentSelect mit dynamischem entityType möglich?

Jump to solution

Hallo, ich hätte auch noch ein Problem dazu.

Ich habe eine Tabellenvorlage, in deren Header diese Funktion steht:

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

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

       

        <CMS_VALUE_PARAM  name="p_id" value="partner_id" />

           

        <QUERY entityType="partner">

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

            <LIKE attribute="fk_partner" parameter="p_id"/>

        </QUERY>

    </CMS_FUNCTION>

Diese funktioniert und ich rufe sie in einer For-Schleife auf, in der sich bei jedem Durchlauf der Wert der Variable partner_id ändert.

Problem 1 ist, dass der Inhalt das Ergebnis der Funktion sich beim zweiten Schleifendurchlauf nicht mehr ändert, weil das gecached wird.

Also habe ich nach diesen Anleitungen hier ein Script "get_partner_details" mit diesem Code angelegt:

//!BeanShell

out = new StringBuilder();

out.append("<CMS_HEADER>");

out.append("<CMS_FUNCTION name=\"contentSelect\" resultname=\"fr_partner\" context=\"PAGE\">");

out.append("<CMS_PARAM name=\"schema\" value=\"further_content\" />");

out.append("<CMS_VALUE_PARAM  name=\"p_id\" value=\"").append(my_id).append("\" />");

out.append("<QUERY entityType=\"partner\" >");

out.append("<FILTERPARAM parameter=\"p_id\" datatype=\"java.lang.String\" value=\"").append(my_id).append("\" >");

out.append("<LIKE attribute=\"fk_partner\" parameter=\"p_id\" />");´

out.append("</QUERY>");

out.append("</CMS_FUNCTION>");

out.append("</CMS_HEADER>");

result.setValue(out.toString());

Der Aufruf in der For-Schleife ist nun dieser:

$CMS_RENDER(script:"get_partner_details",my_id:partner_id)$

Leider bekomme ich nun überhaupt kein Ergebnis mehr.

Ich habe beim Beanshell-Script den Haken "Immer aktiv" gesetzt und es ist ein Scripttyp "Vorlage". Aufgerufen wird das Beanshellscript in einer Datenquelle, die als Absatz in einer Seite angelegt ist.

0 Kudos
hoebbel
Crownpeak employee
Crownpeak employee

Re: contentSelect mit dynamischem entityType möglich?

Jump to solution

Hallo Frau Neubauer,

nehmen Sie anstelel eines Skriptes eine Formatvorlage.

Legen Sei dort einen Header Bereich an [<CMS_HEADER></CMS_HEADER>] in den Sie "ganz normal" die Funktion einbinden. Sie müssen die Ausgabe ebenfalls in der Formatvorlage außerhalb des CMS_HEADER Tags durchführen, da das Funktionsergebnis nur innerhalb der Formatvorlage zur Verfügung steht.

Viele Grüsse aus Dortmund,

  Holger Höbbel

0 Kudos
Prinzessin
I'm new here

Re: contentSelect mit dynamischem entityType möglich?

Jump to solution

Vielen Dank so funktioniert es.

0 Kudos
SHeinrich
Returning Observer

Re: contentSelect mit dynamischem entityType möglich?

Jump to solution

Hallo,

ich schließe mich mal diesen Beitrag an, da mein Problem extakt das gleiche ist:

Ich möchte ein contentSelect dynamisch machen (bzw. im anderen Projekt eine Logik mit IF/CASE einbauen):

Absatzvorlage:

<CMS_HEADER>

     <CMS_FUNCTION name="contentSelect" resultname="resultMeldungen" context="SECTION">

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

          <QUERY entityType="Meldung">

               <AND>

                     <EQ attribute="DatumVon" value="1" datatype="de.espirit.common.Today" />

                    $CMS_FOR(tag, st_tagliste)$

                         <EQ attribute="TagList.fs_id" datatype="java.lang.Integer" value="$CMS_VALUE(tag.fs_id)$"/>

                    $CMS_END_FOR$

               </AND>

               <ORDERCRITERIA attribute="Rang" descending="1"/>

          </QUERY>

     </CMS_FUNCTION>

</CMS_HEADER>

In der Absatzvorlage ist dies im Header nicht möglich, also hatte ich es in ein Skript gepackt und per $CMS_RENDER()$ als erstes in der Absatzvorlage ausgegeben (wie im Posting #16). Leider führt er dies nicht aus.

Die Lösung mit der Formatvorlage verstehe ich nicht. Wo genau kommt was hin?

Danke und Gruß,

Sergej

0 Kudos