Hallo zusammen,
ich bin mir noch unschlüssig, wie ich das interface "NewSectionOperation" richtig benutze.
Ich habe mal folgenden Beispielcode zum Ausprobieren im ContentCreator als ausführbares Beanshell-Script angelegt:
import de.espirit.firstspirit.agency.StoreAgent;
import de.espirit.firstspirit.agency.OperationAgent;
import de.espirit.firstspirit.agency.OperationType;
import de.espirit.firstspirit.webedit.server.NewSectionOperation;
import de.espirit.firstspirit.access.store.Store;
OperationAgent operationAgent = context.requireSpecialist(OperationAgent.TYPE);
NewSectionOperation newSectionOperation = operationAgent.getOperation(NewSectionOperation.TYPE);
if (sectionId == void)
throw new IllegalArgumentException("Missing Parameter 'sectionId'");
sectionId = Long.parseLong("" + sectionId);
section = context.requireSpecialist(StoreAgent.TYPE)
.getStore(Store.Type.PAGESTORE)
.getStoreElement(sectionId);
newSectionOperation.delegateContext(context);
Beim Aufruf aus dem OCM ContentCreator Button, erhalte ich folgende Fehlermeldung:
Called from method: __execute
at bsh.BSHMethodInvocation.eval(BSHMethodInvocation.java:78) ~[fs-isolated-webrt.jar:78859]
at bsh.BSHPrimaryExpression.eval(BSHPrimaryExpression.java:102) ~[fs-isolated-webrt.jar:78859]
at bsh.BSHPrimaryExpression.eval(BSHPrimaryExpression.java:47) ~[fs-isolated-webrt.jar:78859]
at bsh.BSHBlock.evalBlock(BSHBlock.java:130) ~[fs-isolated-webrt.jar:78859]
at bsh.BSHBlock.eval(BSHBlock.java:80) ~[fs-isolated-webrt.jar:78859]
at bsh.BshMethod.invokeImpl(BshMethod.java:371) ~[fs-isolated-webrt.jar:78859]
at bsh.BshMethod.invoke(BshMethod.java:267) ~[fs-isolated-webrt.jar:78859]
at bsh.BshMethod.invoke(BshMethod.java:170) ~[fs-isolated-webrt.jar:78859]
at bsh.PreparsedScript.invoke(PreparsedScript.java:66) ~[fs-isolated-webrt.jar:78859]
at de.espirit.firstspirit.server.script.BeanshellScriptEngine$BeanshellExecutable.execute(BeanshellScriptEngine.java:100) ~[fs-isolated-webrt.jar:78859]
... 21 common frames omitted
Caused by: bsh.ReflectError: Method delegateContext(de.espirit.firstspirit.webedit.server.workflow.WebeditScriptContextImpl) not found in class'de.espirit.firstspirit.webedit.server.operations.NewSectionOperationImpl'
at bsh.Reflect.resolveExpectedJavaMethod(Reflect.java:414) ~[fs-isolated-webrt.jar:78859]
at bsh.Reflect.invokeObjectMethod(Reflect.java:116) ~[fs-isolated-webrt.jar:78859]
at bsh.Name.invokeMethod(Name.java:858) ~[fs-isolated-webrt.jar:78859]
at bsh.BSHMethodInvocation.eval(BSHMethodInvocation.java:75) ~[fs-isolated-webrt.jar:78859]
... 30 common frames omitted
Wenn ich es richtig verstehe gilt der "context" in Zusammenhang mit der "delegateContext"-Methode nur im Zusammenspiel mit einem FS_BUTTON.
Im Falle des Omnichannel-Managers wird der "Button" aber über die TPP_SNAP API bereitgestellt:
Folgendes Beispiel funktioniert.
TPP_SNAP.registerButton({
"label": "add reference section",
"css": "tpp-icon-add-section",
isVisible: ({ status }) => status.custom === null && status.elementType === 'Section',
isEnabled: async ({ $node }) => {
const siblings = await findFsSections($node.parentNode);
const index = siblings.findIndex(({ $el }) => $el === $node);
return index !== siblings.length - 1;
},
execute: async () => TPP_SNAP.execute('class:NewSection', {page: "standard_page_text_image", body: "content_main", store: "pagestore", reload: "content_main"}),
});
Ich würde gern probeweise das "execute" mit einem Beanshell Script koppeln und die entsprechenden Parameter per "delegate" an die Standardfunktionalität "NewSection" binden. Reicht es dafür die Parameter aus dem o.g. Beispiel per Java Map zu übergeben?
Update:
Leider lässt sich der Ansatz mit "onDrop" im OCM Umfeld so nicht umsetzen. Gründe hierfür sind bestimmte Probleme im D&D zwischen Fenstern von OCM und ContentCreator, die mit dem CORS-Policies moderner Browser zusammenhängen. Eine alternative Idee wäre über eine OCM Funktion der Snap API (fs-tpp-api/snap 1.2.20 | Documentation) ein drop down mit einer Liste der als Favoriten markierten Absätze anzubieten, die für den Contentbereich anwendbar sind. Leider benötigt man hierfür einen Zugriffspunkt zu den Bookmars. Intern gibt es einen Agent dafür (de.espirit.firstspirit.client.bookmark.BookmarkAgent), leider hat der es nie in die API geschafft.