Search the FirstSpirit Knowledge Base
Hallo zusammen,
ist es in FirstSpirit möglich ein Skript zuschreiben, das alle Medienname und Metadaten von einem Projekt anzeigt, die in einem bestimmten Ordner im Mediastore liegen?
Viele Grüße,
Aissam
Hallo Aissam,
Du kannst im Script (Typ: Kontext) alle Medien eines Ordners in allen Unterordnern holen und dann darüber jedes Element prüfen (Name holen, etc.):
context.getElement().getChildren(Media.class, true)
Es ist gut möglich, dass Media.class geändert werden muss (Alle Medien im Media Store haben ja eine gemeinsame Vaterklasse und die kannst Du hier einsetzen, falls es nicht Media sein sollte).
Viele Grüße,
Phillip.
Hallo Philipp,
kannst du mir bitte ein beispiel Skript schicken wie das aussehn kann.
Und wie finde ich raus welche Vaterklasse die Elemente haben.
Kann man auch sowas auch in einem Template schreiben?
Vielen Dank!
Viele Grüße,
Aissam
Hallo Aissam,
das gibt ein Beispiel; alles weitere ist dann abhängig von Deinem Ziel und Projekt.
Mir ist nicht klar, was Du ins Template schrieben willst, aber grundsätzlich kannst Du bspw. eine Formatvorlage oder ein Script schreiben, das genau das macht (bspw. s.u.) und das dann in Deinem PageTemplate aufrufen o.ä.
Viele Grüße,
Phillip.
Dieses Script loggt alle Anzeigenamen der Mastersprache. Es wird auch auf die MetaFormDaten zugegriffen und eine Eingabekomponente geholt und als simpler String ausgegeben. Hier muss dann natürlich als Parameter der wirkliche Name aus dem Metadaten Template stehen.
import de.espirit.firstspirit.access.store.mediastore.Media;
import de.espirit.firstspirit.access.store.IDProvider;
import de.espirit.firstspirit.access.Language;
IDProvider e = context.getElement();
Language pMasterLanguage = context.getProject().getMasterLanguage();
for (Media _media : e.getChildren(Media.class, true))
{
context.logInfo(_media.getLanguageInfo(pMasterLanguage).getDisplayName() + " - " + _media.getUid());
// Meda Form Data
if (!_media.hasMeta())
continue;
context.logInfo(_media.getMetaFormData().get(pMasterLanguage, "sc_eineEingabeComponente").get().toString());
}
Hallo Phillip,
wenn ich das obige Skript aufrufe bekomme ich folgende Fehlermeldung:
(de.espirit.firstspirit.server.scheduler.ScheduleManagerImpl): error in task 'get_mediastore_date' - schedule entry 'Mediastore daten auslesen' (id=132890) - de.espirit.firstspirit.access.script.SyntaxError: bsh.ParseException: Parse error at line 2, column 1. Encountered: }
de.espirit.firstspirit.access.script.SyntaxError: bsh.ParseException: Parse error at line 2, column 1. Encountered: }
at de.espirit.firstspirit.server.script.BeanshellScriptEngine$BeanshellExecutable.<init>(BeanshellScriptEngine.java:76)
at de.espirit.firstspirit.server.script.BeanshellScriptEngine.getExecutable(BeanshellScriptEngine.java:55)
at de.espirit.firstspirit.common.ScriptUtil.getExecutable(ScriptUtil.java:86)
at de.espirit.firstspirit.admin.ScriptTaskImpl.getExecutable(ScriptTaskImpl.java:115)
at de.espirit.firstspirit.server.scheduler.ScriptTaskExecutor.run(ScriptTaskExecutor.java:64)
at de.espirit.firstspirit.server.scheduler.ScheduleManagerImpl$TaskCallable.executeLocal(ScheduleManagerImpl.java:2475)
at de.espirit.firstspirit.server.scheduler.ScheduleManagerImpl$TaskCallable.executeLocal(ScheduleManagerImpl.java:2458)
at de.espirit.firstspirit.server.scheduler.ScheduleManagerImpl$TaskCallable.call(ScheduleManagerImpl.java:2390)
at de.espirit.firstspirit.server.ExecutionManagerImpl$ExtendedCallable.call(ExecutionManagerImpl.java:590)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at de.espirit.common.util.BoundedExecutorService$RunnableWrapper.run(BoundedExecutorService.java:436)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
at de.espirit.common.util.SuspendableThread.run(SuspendableThread.java:56)
Caused by: bsh.ParseException: Parse error at line 2, column 1. Encountered: }
at bsh.Parser.generateParseException(Parser.java:5973)
at bsh.Parser.jj_consume_token(Parser.java:5925)
at bsh.Parser.Statement(Parser.java:2706)
at bsh.Parser.BlockStatement(Parser.java:2812)
at bsh.Parser.Block(Parser.java:2776)
at bsh.Parser.MethodDeclaration(Parser.java:409)
at bsh.Parser.BlockStatement(Parser.java:2807)
at bsh.Parser.Line(Parser.java:200)
at bsh.Interpreter.Line(Interpreter.java:1014)
at bsh.Interpreter.eval(Interpreter.java:651)
at bsh.Interpreter.eval(Interpreter.java:758)
at bsh.Interpreter.eval(Interpreter.java:747)
at bsh.PreparsedScript.<init>(PreparsedScript.java:46)
at de.espirit.firstspirit.server.script.BeanshellScriptEngine$BeanshellExecutable.<init>(BeanshellScriptEngine.java:70)
... 16 more
Hallo Aissam,
mein ursprüngliches Script wirft keinen Parser Fehler, daher wäre es interessant zu sehen, was Du verändert hast.
Gruß,
Phillip.
Hallo Phillip,
so sieht mein Skript aus:
//!Beanshell
import de.espirit.firstspirit.access.store.mediastore.Media;
import de.espirit.firstspirit.access.store.IDProvider;
import de.espirit.firstspirit.access.Language;
IDProvider e = context.getElement();
Language pMasterLanguage = context.getProject().getMasterLanguage();
for (Media _media : e.getChildren(Media.class, true)) {
context.logInfo(_media.getLanguageInfo(pMasterLanguage).getDisplayName()
+ " - "
+ _media.getUid());
// Meda Form Data
if (!_media.hasMeta())
continue;
context.logInfo(_media.getMetaFormData().get(pMasterLanguage, "md_groups").get().toString());
print(_media.getMetaFormData().get(pMasterLanguage, "md_groups").get().toString());
}
Hallo Phillip,
hab den Quellcode jetzt direkt im Auftragverwaltungstool im Server Manager kopiert und aufgerufen.
Fehlermeldung:
de.espirit.firstspirit.server.scheduler.ScriptTaskExecutor): error during script execution : de.espirit.firstspirit.access.script.ExecutionException: Typed variable declaration : Error in method invocation: Method getElement() not found in class'de.espirit.firstspirit.server.scheduler.DelegatingScheduleContext' : at Line: 6 : in file: inline evaluation of: ``__execute() { //!Beanshell import de.espirit.firstspirit.access.store.mediastore . . . '' : context .getElement ( )
Called from method: __execute at line 6
FSVersion=5.2.1608.76631#4449;JDK=1.8.0_60 64bit Oracle Corporation;OS=Linux 3.10.0-693.5.2.el7.x86_64 amd64;Date=23.01.2018 11:13:37
de.espirit.firstspirit.access.script.ExecutionException: Typed variable declaration : Error in method invocation: Method getElement() not found in class'de.espirit.firstspirit.server.scheduler.DelegatingScheduleContext' : at Line: 6 : in file: inline evaluation of: ``__execute() { //!Beanshell import de.espirit.firstspirit.access.store.mediastore . . . '' : context .getElement ( )
Called from method: __execute at line 6
at de.espirit.firstspirit.server.script.BeanshellScriptEngine$BeanshellExecutable.execute(BeanshellScriptEngine.java:111)
at de.espirit.firstspirit.common.ScriptUtil.execute(ScriptUtil.java:106)
at de.espirit.firstspirit.server.scheduler.ScriptTaskExecutor.run(ScriptTaskExecutor.java:134)
at de.espirit.firstspirit.server.scheduler.ScheduleManagerImpl$TaskCallable.executeLocal(ScheduleManagerImpl.java:2475)
at de.espirit.firstspirit.server.scheduler.ScheduleManagerImpl$TaskCallable.executeLocal(ScheduleManagerImpl.java:2458)
at de.espirit.firstspirit.server.scheduler.ScheduleManagerImpl$TaskCallable.call(ScheduleManagerImpl.java:2390)
at de.espirit.firstspirit.server.ExecutionManagerImpl$ExtendedCallable.call(ExecutionManagerImpl.java:590)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at de.espirit.common.util.BoundedExecutorService$RunnableWrapper.run(BoundedExecutorService.java:436)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
at de.espirit.common.util.SuspendableThread.run(SuspendableThread.java:56)
Caused by: bsh.EvalError: Typed variable declaration : Error in method invocation: Method getElement() not found in class'de.espirit.firstspirit.server.scheduler.DelegatingScheduleContext' : at Line: 6 : in file: inline evaluation of: ``__execute() { //!Beanshell import de.espirit.firstspirit.access.store.mediastore . . . '' : context .getElement ( )
Called from method: __execute
at bsh.BSHMethodInvocation.eval(BSHMethodInvocation.java:77)
at bsh.BSHPrimaryExpression.eval(BSHPrimaryExpression.java:102)
at bsh.BSHPrimaryExpression.eval(BSHPrimaryExpression.java:47)
at bsh.BSHVariableDeclarator.eval(BSHVariableDeclarator.java:86)
at bsh.BSHTypedVariableDeclaration.eval(BSHTypedVariableDeclaration.java:84)
at bsh.BSHBlock.evalBlock(BSHBlock.java:130)
at bsh.BSHBlock.eval(BSHBlock.java:80)
at bsh.BshMethod.invokeImpl(BshMethod.java:371)
at bsh.BshMethod.invoke(BshMethod.java:267)
at bsh.BshMethod.invoke(BshMethod.java:170)
at bsh.PreparsedScript.invoke(PreparsedScript.java:66)
at de.espirit.firstspirit.server.script.BeanshellScriptEngine$BeanshellExecutable.execute(BeanshellScriptEngine.java:100)
... 14 more
Caused by: bsh.ReflectError: Method getElement() not found in class'de.espirit.firstspirit.server.scheduler.DelegatingScheduleContext'
at bsh.Reflect.resolveExpectedJavaMethod(Reflect.java:395)
at bsh.Reflect.invokeObjectMethod(Reflect.java:97)
at bsh.Name.invokeMethod(Name.java:858)
at bsh.BSHMethodInvocation.eval(BSHMethodInvocation.java:75)
... 25 more
Hallo Aissam,
Ich vermute, dass das Problem beim Template Scope liegt.
Wenn Du das Template erzeugst, dann kannst Du auf der 1. Reiter (Eigenschaften) beim Script den Scope festlegen. Dort müsste für das Script "Context menu" ausgewählt werden.
Dann kannst Du das Script auf einem Media Store Ordner ausführen und siehst alle Medien darunter.
Falls Du das in einem anderen Rahmen laufen lassen möchtest, dann musst Du den Startpunkt (den IDProvider e) anders holen als mit context.getElement();
Viele Grüße,
Phillip.
Hallo Phillip,
danke erstmal für deine Hilfe.
Ich möchte das script in der Auftragsverwaltung mit der generierung bzw. publzierung starten und den Namen, pfad und medadaten auslesen und speichern.
Ist das möglich und wie bekomme ich den mediastore ordner?
Viele Grüße,
Aissam