Search the FirstSpirit Knowledge Base
Hallo zusammen,
ist es möglich in einer contentSelect-Funktion den Parameter "entityType" des QUERY Elements dynamisch zu setzen?
Hintergrund ist folgender:
Ein Kunde hat mehrere Länderauftritte in einem Projekt angelegt und für jeden Länderauftritt gibt es eine eigene News-Tabelle.
Auf der Homepage soll eine Box mit den X aktuellen News-Einträgen angezeigt werden. In dem Tamplate, das für die Erzeugung
der Box zuständig ist, würde ich jetzt gerne eine einzige contentSelect-Funktion definieren, die, je nach Länderauftritt, die
richtige Newstabelle abfragt. Ist das machbar?
Sollte ein dynamisches Setzen nicht mögich sein, würde ich im CMS_HEAD für jeden Länderauftritt eine contentSelect-Funktion
definieren und weiter unten nur die passende verwenden. Das bedeutet halt viel unschönes Mehrfachgemoppel, das ich gerne
vermeiden würde.
Grüße
Peter
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.
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.
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.
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
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!
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.
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.
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
Vielen Dank so funktioniert es.
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