Zum Hauptinhalt gehen

contentSelect mit dynamischem entityType möglich?

Kommentare

19 Kommentare

  • Zendesk API User
    Author: boesebeck - 7/21/2010 15:55

    Hallo,

    ich denke das dir folgender Abschnitt (Dynamisches Einfügen einer define-Funktion mit $CMS_RENDER) im ODFS helfen könnte.  http://www.e-spirit.com/odfs42/de/vorlagenentwicklung/vorlagensyntax/funktionen/im_header/include_/include.html?community Du könntest das ContentSelect dann mittles Skript und einem Paramenter dynamisch generieren.

    0
  • Zendesk API User
    Author: Mad_Hamish - 7/22/2010 11:37

    Hi Gerrit,

    ich habe das bei mir leider nicht zum Laufen bringen können. Ich habe sowohl ein eigenes Skript zur
    Header-Erzeugung als auch das Beispiel aus der Doku ausprobiert. Das Funktionsergebnis steht danach
    im Template leider nicht zur Verfügung. Die Skripte werden zwar ausgeführt, aber der erzeugte Header
    wird dann vermutlich nicht ausgewertet.

    Der erzeugte Header war in beiden Fällen syntaktisch korrekt, hab ihn über context.logDebug ausgeben
    lassen und diese Ausgabe danach in das Template reinkopiert. Da wurden beide Versionen (meine
    Funktionen und Beispiel aus der Doku) korrekt ausgewertet.

    Kann es sein, dass es Probleme macht, wenn dieses Vorgehen innerhalb einer Formatvorlage angewendet
    wird? Der dynamische Header ist also in meinem Fall der Header einer Formatvorlage, nicht einer
    Seitenvorlage. Macht das einen Unterschied?

    Grüße
    Peter

    0
  • Zendesk API User
    Author: feddersen - 7/22/2010 11:41
    Kann es sein, dass es Probleme macht, wenn dieses Vorgehen innerhalb einer Formatvorlage angewendet

    wird? Der dynamische Header ist also in meinem Fall der Header einer Formatvorlage, nicht einer
    Seitenvorlage. Macht das einen Unterschied?

    Formatvorlagen haben keinen Header, in einer Seiten-/Absatz- oder Tabellenvorlage sollte es funktionieren. Gibt es einen speziellen Grund, wieso sie an dieser Stelle eine Formatvorlage verwenden?

    0
  • Zendesk API User
    Author: hoebbel - 7/22/2010 11:50

    Christoph Feddersen schrieb:

    Formatvorlagen haben keinen Header, in einer Seiten-/Absatz- oder Tabellenvorlage sollte es funktionieren. Gibt es einen speziellen Grund, wieso sie an dieser Stelle eine Formatvorlage verwenden?

    Wieso haben Formatvorlagen denn keinen Header?

    Die entsprechenden Tags werden zwar standardmäßig nicht erzeugt, aber auch in Formatvorlagen unterstützt.

    Ich würde erst testen, ob es klappt, wenn man manuell die <CMS_HEADER> Tags in die Formatvorlage schreibt, und wenn nicht, ob es in einer Absatzvorlage klappt.

    Anmerkung: contentSelect ist eine der Funktionen, deren Ergebnis gecacht wird. [Mehrfache Aufrufe des Funktionsergebnisses liefern also immer die selbe Ergebnisliste, auch wenn man zwischenzeitlich den wert der zu übergebenden variablen ändert]. Vielleicht liegt es auch daran und es geht mit der contentSelect Funktion gar nicht auf diese Art. Dann müsste man erstmal auf die eigentlich als deprecated gekennzeichnete include-Funktion zurückgreifen...

    0
  • Zendesk API User
    Author: Mad_Hamish - 7/22/2010 11:52

    Dass man Header nicht in Formatvorlagen verwenden kann, hatte ich auch so in Erinnerung. Allerdings sagte mir dann ein Kollege, dass das sehr wohl möglich ist und es funktioniert ja auch. Die zwei definierten contentSelects werden problemlos ausgeführt.

    Die Formatvorlage muss an der Stelle verwendet werden, da die HTML-Grundstruktur in mehrere Bausteine zerlegt ist (Header, Breadcrumb, Footer etc.). Jeder Baustein ist eine Formatvorlage und verschiedene Seitenvorlagen binden dann unterschiedliche Formatvorlagen ein.

    0
  • Zendesk API User
    Author: Mad_Hamish - 7/22/2010 11:55

    Wenn ich die <CMS_HEADER>-Tags manuell in die Vorlage schreib, muss ich sie dann im Skript weglassen? Sorgt "context.print(ParserUtil.parseTemplate(out.toString()));" im Skript dann für ein richtiges Einfügen der Funktion in den Header?

    0
  • Zendesk API User
    Author: feddersen - 7/22/2010 12:03

    Ich dachte die contentSelects würden nicht funktionieren, da hatte ich sie wohl falsch verstanden. Ich war auch der Meinung, dass man keinen Header in Formatvorlagen verwenden kann. Umso schöner, dass es doch funktioniert.

    Wo geben sie denn das Ergebnis der contentSelects aus? Wenn sie in der Formatvorlage ausgeführt werden, stehen sie auch nur innnerhalb der Formatvorlage zur Verfügung, falls sie nicht expilizit auch in den Seiten- bzw. Absatzcontext geschrieben werden:

    $CMS_VALUE(#global.pageContext.setVariableValue("fr_pt_contentSelect", fr_ft_contentSelect)$

    0
  • Zendesk API User
    Author: Mad_Hamish - 7/22/2010 12:09

    Hallo,

    mit den contentSelects an sich habe ich keine Problem. Die funktioniert wunderbar und das Ergebnis lässt sich auch ausgeben. Allerdings funktioniert bisher das dynamische Generieren der contentSelect nicht. Das brauche ich wiederum, weil ich, abhängig vom Länderauftritt (s.o.) unterschiedliche Tabellen abfragen muss und die Tabelle beim contentSelect nicht über einen Parameter setzbar ist.

    0
  • Zendesk API User
    Author: feddersen - 7/22/2010 12:39

    Neuer Versuch einer präzisieren Frage:

    Funktionieren die contentSelects, wenn Sie sie dynamisch zusammenbauen, wie im Abschnitt "Dynamisches Einfügen einer define-Funktion mit $CMS_RENDER" beschrieben?

    Falls nein, funktioniert es, wenn sie das gleiche Konstrukt in einer Absatzvorlage statt in einer Formatvorlage verwenden? Sollte das auch nicht klappen, bitte mal ihre Codeschnipsel posten.

    0
  • Zendesk API User
    Author: aVogt - 7/22/2010 12:56

    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
  • Zendesk API User
    Author: Mad_Hamish - 7/22/2010 13:10

    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
  • Zendesk API User
    Author: stephan - 7/22/2010 13:31

    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.

    0
  • Zendesk API User
    Author: Mad_Hamish - 7/22/2010 13:39

    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
  • Zendesk API User
    Author: hoebbel - 7/22/2010 13:50

    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
  • Zendesk API User
    Author: Mad_Hamish - 7/22/2010 14:08

    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
  • Zendesk API User
    Author: Prinzessin - 11/15/2012 15:11

    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
  • Zendesk API User
    Author: hoebbel - 11/15/2012 15:29

    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
  • Zendesk API User
    Author: Prinzessin - 11/19/2012 12:24

    Vielen Dank so funktioniert es.

    0
  • Zendesk API User
    Author: SHeinrich - 11/26/2013 10:29

    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

Bitte melden Sie sich an, um einen Kommentar zu hinterlassen.