mstaender
I'm new here

SiteArchitect: Renderscripts mit Executables - Update der Ergebnisvariable klappt nicht

Jump to solution

Hi,

der Titel ist eventuell etwas verwaschen, da es ganz schön schwierig scheint das Problem verständlich zu machen.

Ich möchte ein CMS_RENDER Aufruf nutzen um ein Skript auszuführen. In meinem kleinen Beispiel benörigt das Skript keine Parameter, gibt aber einen Wert zurück. Dazu habe ich inzwischen 2 Methoden implementiert:

1. Übergebe eine Liste als Parameter (Referenz) in die das Ergebnis hinein geschrieben wird

Im Template habe ich diesen Code stehen:

$CMS_SET(result,[])$

$CMS_RENDER(script:"mein_script", returnValue: result)$

Ergebnis: -> $CMS_VALUE(result.get(0))$ <-

Der Aufruf der Executable in mein_script:

#!executable-class

GetSomeValue Executable

Und schließlich der Inhalt der Klasse hinter GetSomeValue (Moduldefinition stimmt auch):

public class GetSomeValueExecutable implements Executable {

    public Object execute(final Map<String, Object> stringObjectMap) throws ExecutionException {

        return execute(stringObjectMap, new PrintWriter(System.out, true), new PrintWriter(System.err, true));

    }

    public Object execute(final Map<String, Object> stringObjectMap, final Writer writer, final Writer writer1) throws ExecutionException {

        List returnValue= (List) stringObjectMap.get("returnValue");

        returnValue.add("someData2");

        // Just for testing, can be removed

        stringObjectMap.put("returnValue", returnValue);

        return null;

    }

Die Zeile "stringObjectMap.put("returnValue", returnValue);" kann wohl entfernt werden, sie ist ein Überbleibsel meiner Experimente.

Das Ergebnis nach Redeployment des Moduls und Neustart vom SA: Ergebnis: ->  <-

Nach Stundenlangem Suchen habe ich dann die 2. Methode implementiert.

2. Manipulation des PageContexts

Im Template habe ich diesen Code stehen:

$CMS_RENDER(script:"mein_script")$

Ergebnis2: -> $CMS_VALUE(meineVar)$ <-

Der Aufruf der Executable in mein_script ist natürlich gleich:

#!executable-class

GetSomeValue Executable

Und schließlich der Inhalt der Klasse hinter GetSomeValue (Moduldefinition stimmt auch) wurde umprogrammiert zu:

public class GetSomeValueExecutable implements Executable {

    public Object execute(final Map<String, Object> stringObjectMap) throws ExecutionException {

        return execute(stringObjectMap, new PrintWriter(System.out, true), new PrintWriter(System.err, true));

    }

    public Object execute(final Map<String, Object> stringObjectMap, final Writer writer, final Writer writer1) throws ExecutionException {

        String myValue = "someConfig2";

        BaseContext context = (BaseContext) stringObjectMap.get("context");

        if (context instanceof GenerationContext) {

            GenerationContext generationContext = (GenerationContext) context;

            generationContext.getPageContext().setVariableValue("meineVar", myValue);

       }

        return null;

    }

}

Das Resultat nach Deployment und Restart des SA: Ergebnis2: ->  <-

Dann hatte ich mit Michael eine kleine Diskusstion drüber und irgendwann ging es. ich war zunächst glücklich aber da wir nichts wirklich fundamentales geändert haben hatte ich schon ein ungutes Gefühl. Heute hat es mich dann wieder erwischt und ich habe jetzt rausgefunden, dass nach einem kompletten Serverneustart (also den fs5service) auf einmal die korrekten Werte ausgefüllt im Template drin standen.

Ich habe alles versucht den SA dazu zu bringen die Werte zu aktualisieren (von Strg+Aktualisieren, Shift+Aktualisieren, sonstige Shortcuts) über Restarts des SA hin zum Betrachten im ContentCreator. Auch dort werden nur die Daten vom letzten Restart des gesamten Servers angezeigt.

So hartnäckig kann doch kein Cache sein?! Da das sicherlich ein alltäglicher Gebrauch in FS-Modulen ist vermute ich, ich mache wieder etwas falsch. Hat jemand eine Idee?

MfG Marcus

0 Kudos
1 Solution

Accepted Solutions
mbergmann
Crownpeak employee

Hallo Marcus,

gibt es Hinweise im Generierungslog der Preview? Das bekommst Du im SA angezeigt per Rechtsklick auf die Seitenreferenz und "Fehler der Vorschau".

Ist das Script vom Typ "Vorlagenscript"? Hast Du eine entsprechende web-app-Komponente mit der entsprechenden jar definiert und dem Preview-Webkontext hinzugefügt? Renderskripte laufen in der Preview-WebApp und nicht im SA.

Viele Grüße

Michael

View solution in original post

0 Kudos
3 Replies
mbergmann
Crownpeak employee

Hallo Marcus,

gibt es Hinweise im Generierungslog der Preview? Das bekommst Du im SA angezeigt per Rechtsklick auf die Seitenreferenz und "Fehler der Vorschau".

Ist das Script vom Typ "Vorlagenscript"? Hast Du eine entsprechende web-app-Komponente mit der entsprechenden jar definiert und dem Preview-Webkontext hinzugefügt? Renderskripte laufen in der Preview-WebApp und nicht im SA.

Viele Grüße

Michael

0 Kudos

Hi Michael,

ich hatte dir sa gesagt, dass ich euch im Nachgang sicher nerve, wenn mein Projekt läuft :smileygrin:

In der Tat hatte ich übersehen, dass die in der Preview-Webapp laufen. Das erklärt einiges und es scheint jetzt zu funktionieren.

Danke Smiley Happy

MfG Marcus

0 Kudos

Hallo Marcus,

kein Problem, dafür sind wir da 😉

Die Erzeugung der Ausgabe über ein Executable ist jetzt nicht unbedingt etwas das man andauernd macht, sondern eher selten. In einigen Fällen kann es aber sinnvoll sein. Ich würde unbedingt bei der ersten Variante bleiben (Ablegen des Ergebnisses in eine übergebene Liste oder Map). Das Schreiben in den Variablenkontext der Generierung finde ich nicht gekapselt genug und irgendwie zu "magisch", weil da im Ausgabekanal auf einmal eine Variable auftaucht die dort nie definiert wurde. Hier kann es theoretisch auch zu Namenskonflikten und damit Überschreibungen kommen, was zu schwer zu findenden Fehlern führt.

Viele Grüße

Michael

0 Kudos