wiegele
I'm new here

Mit CMS_SET Rückgabewert setzen

Hallo zusammen,

ich verstehe die Funktionsweise von CMS_SET und oder CMS_RENDER scheinbar nicht.

Ich möchte eine Variable deklarieren und diese in einer Schleife als Parameter für eine Script immer wieder verwenden.

Dabei soll das Script die Variable manipulieren und wieder an das Hauptprogramm zurückgeben.

Hier vereinfacht dargestellt

var1=1

var2=2

For Schleife

var1=FunktionsAufruf(var1,var2)

end For

FunktionsAufruf(para1,para2)

para2=para1+para2

return para2

end FunktionsAufruf

Soblad ich aber mit CMS_SET die Variable old_publication_date neu beschreiben will ist sie leer.

FS Version 5.0.425.60000

Variable initialisieren

$CMS_SET(old_publication_date,"0000-00-00 00:00:00.1")$

$CMS_FOR(news, frNewsCategory.sublist(0,st_number))$

     $CMS_SET(publication_date,news.publication_date.format("yyyy-MM-dd hh:mm:ss.S"))$

     $CMS_VALUE("Old-" + old_publication_date.toString())$<br>

     $CMS_SET(old_publication_date)$

     $CMS_RENDER(script:"comparedates", oldNewsDate:old_publication_date.toString(), newsDate:publication_date.toString)$

     $CMS_END_SET$

$CMS_END_FOR$  

Script ----------------------------------

import java.text.SimpleDateFormat;

import java.util.Date;

import java.text.ParseException;

par_oldNewsDate = context.getVariableValue("oldNewsDate");

par_newsDate = context.getVariableValue("newsDate");

result.setValue(context.getVariableValue("oldNewsDate"));

/*

Damit es einfacher zu testen ist gebe ich direkt den Eingabeparameter wieder zurück.

dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.S");

//context.logError("Caught exception while parsing", date.toString());

try {

newsDate = dateFormat.parse(par_newsDate).getTime();

oldNewsDate = dateFormat.parse(par_oldNewsDate).getTime();

date = new Date();

//date1 = dateFormat.parse(date.toString());

date1 = dateFormat.format(date);

date1 = dateFormat.parse(date1).getTime();

    }

    catch (ParseException e)

    {

        context.logError("Caught exception while parsing", e);

    }

if(newsDate <= date1 && oldNewsDate < newsDate){

result.setValue(context.getVariableValue("newsDate"));

    }

else

{

result.setValue(context.getVariableValue("oldNewsDate"));

}

*/

-------------------------------------------

10 Replies
wiegele
I'm new here

Hallo zusammen,

also das Script liefert mir ein TemplateDocument zurück.

TemplateDocument hat eine überschaubare Menge an Methoden, aber nichts was mir meine Rückgabe in ein String umwandeln kann.

Was muss ich machen damit ich meinen Rückgabewert (String) auch im Template als String weiter verarbeiten kann.

habe schon überall toString() angehängt, ohne erfolg.

0 Kudos

Ein "CMS_RENDER" gibt nur etwas aus. Wenn darüber Variablen ausgetauscht werden sollen, muss das über den Variablen-Kontext realisiert werden. Dafür hier ein paar potentiell hilfreiche Hinweise:

  1. Der Context für ein Script ist bei derGenerierung "GenerationScriptContext"
  2. Über "getGenerationContext().getContext(String name)" kommt man an einen Variablekontext (u.a.)
  3. In diesem kann man Werte setzen oder überschreiben

Eventuell hilft das. Wenn nicht müsstest du eventuell deinen Anwendungsfall etwas konkreter darlegen.

Peter
0 Kudos

Hallo Herr Jodeleit,

der genaue Anwendungsfall ist:

Auf einer News Übersichtsseite möchte ich, dass neueste Datum einer News ermitteln.

Es sollte beim iterieren über die News immer geprüft werden, ob die momentane News ein aktuellers Datum als die zuvor bearbeitete News hatte.

Und genau diese Überprüfung wollte ich auslagern.

Zwei Datumswerte als Parameter übergeben und ein Datumswert als Rückgabewert.

Eine Ausgabe im Ausgabekanal ist unerwünscht.

0 Kudos

Das geht wie oben von mir beschrieben, der passende Kontext ist der Seitenkontext (die Absätze haben jeweils einen eigenen Kontext) und der hat den Namen "page". Realisieren lässt sich das auch ohne Skript über Templatecode:

$CMS_IF((newestNewsDate == null) || (newestNewsDate < newsDate))$

    $CMS_SET(#global.context("page")["newestNewsDate"], newsDate)$

$CMS_END_IF$

Disclaimer: Ich habe das nicht getestet, keine Garantie gegen Tippfehler Smiley Wink

Peter

Hallo Dirk,

benötigst Du noch weitere Hilfe oder haben Dir Peters Antworten bereits geholfen?

Solltest Du zwischenzeitlich eine eigene Lösung gefunden haben, wäre es nett, wenn Du diese hier bereitstellst.

Viele Grüße

Michaela

0 Kudos

Ich verwende immer folgendes Snippet am Ende meine "API"-Formatvorlagen, wenn ich Werte zurückgeben möchte:

$CMS_IF(!return.empty)$

      $CMS_SET(context, if(#global.context("section").empty, #global.context("PAGE"), #global.context("section")))$

      $CMS_SET(void, context.setVariableValue(return, _result))$

$CMS_END_IF$

Vorteil ist also auch, dass ich von aussen bestimmen kann, wie meine Rückgabe-Variable heißen wird...

$CMS_RENDER(template:"...", value:"...", return:"myValue")$
$CMS_VALUE(myValue)$ 

Die Variante, den "gewünschten" Variablennamen einfach mit zu übergeben ist eine sehr schöne Sache, weil es möglichst seiteneffektfrei ist.

Es gibt nämlich nichts schlimmeres als ein großes Projekt mit vielen Rendertemplates, wo Variablen im aufrufendem Template einfach "aus dem Nichts" auftauchen weil ihr Name nur im Rendertemplates steht.

Noch besser ist es, wenn man immer in den direkt darüber liegenden Context schreibt, sonst könnte es zu Problemen bei verschachtelten Rendertemplates kommen (da die dann alle in denselben context schreiben).

$CMS_SET(void, #global.context.parentContext.setVariableValue(return,_result))$

Eine andere Variante ist, den Wert in ein Map zu wrappen, d.h. man übergibt mit dem Parameter return eine vorher mit CMS_SET gesetzte leere Map als Parameter und ruft im Rendertemplate return.put("result", ...) auf. Geht auch mit einer Liste, Geschmackssache.

0 Kudos

Genau diese Probleme habe ich bereits gehabt, daher der Ansatz mit dem Übergeben der Variablennamen. Smiley Happy

Das mit dem Parent-Context klingt auch gut. Funktioniert das dann wirklich immer? Welche Arten von Kontexten kann man durch den Aufruf erhalten?

0 Kudos

@Julius Müller: Danke! Sie haben meine Abend gerettet. Bin gerade fast an einer Variablen verzweifelt, die weder Null, noch leer war, noch eine bestimmte size oder length hatte.

Die Variable wurde über ein CMS_RENDER befüllt.

Ihr Snippet eingebaut und schon läufts 🙂

0 Kudos