Search the FirstSpirit Knowledge Base
Hi,
in der DTA hatten wir verschiedene Möglichkeiten wie wir unseren Code aufrufen können. Damals klang das stimmig aber nachdem ich jetzt real damit gekämpft habe ergeben sich einige Fragen.
Also offenbar fehlt mir hier noch ein klein wenig Verständnis und ich hoffe ich habe mich halbwegs klar ausgedrückt und die Experten hier können mir helfen das ganze zu verstehen
MfG Marcus
Hallo Marcus,
die Verwendung der Executable ist stark vom jeweiligen Kontext abhängig.
Du hast in der DTA gelernt, dass aus der Map über den Parameter context ein BaseContext zu erhalten ist. Je nach dem, von wo die Executable aufgerufen wird, ist das nicht nur einfach ein BaseContext, sondern ein speziellere Klasse. Im Fall, dass Du die Executable via Script aus dem Kontextmenü aufrufst, ist das z.B. ein ClientScriptContext oder sogar ein GuiScriptContext. Dieser erlaubt Dir mit getElement() direkt auf die Selektion zuzugreifen. Auch bekommst Du unmittelbar Zugriff auf das Projekt mit getProjekt().
Tipp: Wenn Du den BaseContext hast, dann kannst Du über diesen den echten Klassennamen loggen:
context.logInfo(context.getClass().getSimpleName());
Diesen kannst Du dann im API-Doc nachschlagen. Die Information wird in der JConsole ausgegeben oder Du verwendest mein cooles Second-Hand-Log .
Im Fall, dass Du das Script bzw. die Executable im Template aufrufst, hast Du dann einen GenerationenContext. Rufst Du die Executable im Generierungsauftrag auf, dann hast Du dort den ScheduleContext.
Jetzt zur Ein- bzw. Ausgabe. Die ist ebenfalls stark vom Kontext abhängig. Beim Einsatz im Kontextmenü macht ein Rückgabewert über return keinen Sinn. Hier ist die Executable ein Hook wie in Swing der ActionListener. Bzgl. der Eingabe würde sich im UI-Umfeld vermutlich der FormAgent eignen, der dann auch im ContentCreator funktioniert. Für einfache Ja/Nein-Entscheidungen reicht aber auch der OperationenAgent mit der RequestOperation. Oder m
Beim Einsatz im TemplateCode muss man folgendes machen, wenn man neue Variablen verfügbar machen will:
String myValue = "...";
BaseContext context = (BaseContext) args.get("context");
if (context instanceof GenerationContext) {
GenerationContext generationContext = (GenerationContext) context;
generationContext.getPageContext().setVariableValue("myVar", myValue);
}
---------------------------------------
Im Templatecode dann per $CMS_VALUE(myVar)$
Wie die Eingabe hier funktionierst, hast Du bereits erwähnt.
Beim Auftrag gibt es eine UI in der man die Parameter angibt. Weitere Infos hier: http://www.e-spirit.com/odfs52/vorlagenentwicklung/scripting/scripts-erstellen/kontext/client/
Noch ein Tipp: Packe keine Geschäftslogik in Executables, sondern verwende die Executable nur als Hook für die jeweilige Situation bzw. um Ein- bzw. Ausgabe zu managen (Parameter aus der Map holen oder per Dialog vom Benutzer abfragen). Die eigentliche Logik kommt in eine Java-Klasse, welche z.B. im Konstruktor einen BaseContext erwartet. So kann man diese dann in verschiedenen Executable wiederverwenden, sollte das nötig sein. So machen wir das in unseren Modulen auch. Und man kann so auch die Logik viel einfacher in JUnit testen.
Grüße Marian
Hallo Marcus,
die Verwendung der Executable ist stark vom jeweiligen Kontext abhängig.
Du hast in der DTA gelernt, dass aus der Map über den Parameter context ein BaseContext zu erhalten ist. Je nach dem, von wo die Executable aufgerufen wird, ist das nicht nur einfach ein BaseContext, sondern ein speziellere Klasse. Im Fall, dass Du die Executable via Script aus dem Kontextmenü aufrufst, ist das z.B. ein ClientScriptContext oder sogar ein GuiScriptContext. Dieser erlaubt Dir mit getElement() direkt auf die Selektion zuzugreifen. Auch bekommst Du unmittelbar Zugriff auf das Projekt mit getProjekt().
Tipp: Wenn Du den BaseContext hast, dann kannst Du über diesen den echten Klassennamen loggen:
context.logInfo(context.getClass().getSimpleName());
Diesen kannst Du dann im API-Doc nachschlagen. Die Information wird in der JConsole ausgegeben oder Du verwendest mein cooles Second-Hand-Log .
Im Fall, dass Du das Script bzw. die Executable im Template aufrufst, hast Du dann einen GenerationenContext. Rufst Du die Executable im Generierungsauftrag auf, dann hast Du dort den ScheduleContext.
Jetzt zur Ein- bzw. Ausgabe. Die ist ebenfalls stark vom Kontext abhängig. Beim Einsatz im Kontextmenü macht ein Rückgabewert über return keinen Sinn. Hier ist die Executable ein Hook wie in Swing der ActionListener. Bzgl. der Eingabe würde sich im UI-Umfeld vermutlich der FormAgent eignen, der dann auch im ContentCreator funktioniert. Für einfache Ja/Nein-Entscheidungen reicht aber auch der OperationenAgent mit der RequestOperation. Oder m
Beim Einsatz im TemplateCode muss man folgendes machen, wenn man neue Variablen verfügbar machen will:
String myValue = "...";
BaseContext context = (BaseContext) args.get("context");
if (context instanceof GenerationContext) {
GenerationContext generationContext = (GenerationContext) context;
generationContext.getPageContext().setVariableValue("myVar", myValue);
}
---------------------------------------
Im Templatecode dann per $CMS_VALUE(myVar)$
Wie die Eingabe hier funktionierst, hast Du bereits erwähnt.
Beim Auftrag gibt es eine UI in der man die Parameter angibt. Weitere Infos hier: http://www.e-spirit.com/odfs52/vorlagenentwicklung/scripting/scripts-erstellen/kontext/client/
Noch ein Tipp: Packe keine Geschäftslogik in Executables, sondern verwende die Executable nur als Hook für die jeweilige Situation bzw. um Ein- bzw. Ausgabe zu managen (Parameter aus der Map holen oder per Dialog vom Benutzer abfragen). Die eigentliche Logik kommt in eine Java-Klasse, welche z.B. im Konstruktor einen BaseContext erwartet. So kann man diese dann in verschiedenen Executable wiederverwenden, sollte das nötig sein. So machen wir das in unseren Modulen auch. Und man kann so auch die Logik viel einfacher in JUnit testen.
Grüße Marian
Hallo Marcus,
ist diese Frage noch offen? Benötigst du noch weitere Hilfe oder konnte Marian dir bereits weiterhelfen? In diesem Fall wäre es super, wenn du seine "richtige Antwort" entsprechend markierst.
Viele Grüße,
Sebastian
Hi Sebastian,
ich muss das noch durcharbeiten aber ich denke die Frage ist beantwortet. Danke euch.
MfG Marcus