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,
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.
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_/i... Du könntest das ContentSelect dann mittles Skript und einem Paramenter dynamisch generieren.
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
Kann es sein, dass es Probleme macht, wenn dieses Vorgehen innerhalb einer Formatvorlage angewendetwird? 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?
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...
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.
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?
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)$
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.
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.