Rückgabewerte für Formatvorlagen (CMS_RETURN)

Aktuell ist es nicht mögilch innerhalb einer Formatvorlage ein Rückgabewert zu definieren, der dann in einer anderen Vorlage ausgewertet werden kann.

Über eine Tabellenvorlage rufe ich eine Formatvorlage auf. In dieser finden diverse Berechnungen statt. Das Ergebnis der Berechnung (ein Entity-Objekt) möchte ich dann in der Tabellenvorlage an verschiedenen Stellen weiterverwenden.

Aktuell löse ich das über globale Variablen, die ich in der Formatvorlage setze und dann innerhalb der Tabellenvorlage auswerte.

Schöner wäre es, es gibt so etwas wie ein $CMS_RETURN(object)$, das man dann per z.B.

$CMS_RENDER(template"test", returnValue:object)$ an die Tabellenvorlage übergeben kann.

2 Comments
mbergmann
Crownpeak employee
Crownpeak employee

Die Lösung über "globale" Variablen (ich vermute hier ist ein Schreiben in den context "PAGE" gemeint) ist tatsächlich nicht gerade optimal, da es "versteckte" Abhängigkeiten schafft und und den Code schwerer lesbar macht. Außerdem läuft man immer Gefahr, aus dem Rendertemplate heraus Variablen im höheren Kontext zu überschreiben falls hier zufällig die Namen gleich sind - d.h. man hat keine wirklich Kapselung einer Funktionalität.

Man kann dem Rendertemplate aber ein "Containerobjekt" - z.B. eine leere Liste - als Parameter übergeben:

$CMS_SET(set_result,[])$

$CMS_RENDER(template:"...",resultValue:set_result)$

Result: $CMS_VALUE(set_result.get(0))$

Im Rendertemplate fügt man das Ergebnis einfach der Liste hinzu:

$CMS_SET(void,resultValue.add(...))$

So vermischt man die Scopes der verschiedenen Kontexte nicht und hat eine bessere Kapselung.

Man kann hier natürlich auch mit Maps / Sets arbeiten und dadurch sogar mehrere Werte "zurückgeben" lassen.

Peter_Jodeleit
Crownpeak employee
Crownpeak employee

Wenn es etwas "berechnet" werden soll, scheint mir ein Skript besser geeignet zu sein als ein FormatTemplate.

Der Aufruf würde dann ungefähr so aussehen (ungetestet):

$CMS_SET(x, ref(script:"my_script").target.getExecutable(#global.templateSet).execute({"p1": "val1", "p2":"val2"}))$