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