aloossillmann
New Creator

Formfield aus Beanshell Script automatisch befüllen lassen

Jump to solution

Hallo allerseits,

ich versuche eine Eingabekomponente mit einem in der Vorlage generierten Wert zu befüllen und rufe hierfür ein Skript auf, das diesen Wert in das entsprechende Absatzformular einfügen soll.

Dafür übergebe ich die SectionImpl (#global.section) und einen String an das Script.

Im Code unten bin ich bereits dazu übergegangen die Section über einen Broker zu holen.

Leider verursacht die Zeile "storeElement.setLock(true, false);" immer den Fehler "Target exception: java.lang.SecurityException: read only store"

Was muss ich tun um hier ein schreibbares / lockbares Element zu erhalten?

"isLockSupported" returns true und das angesprochene Formfeld "st_titel" beinhaltet nach ausführung des scripts (ohne Lock) auch Zeitweise den gegebenen Wert.

Im tatsächlichen Formular kommt dieser aber nie an.


Code:

//!Beanshell

import java.lang.String;

import de.espirit.firstspirit.access.store.LockException;

import de.espirit.firstspirit.access.store.*;

import de.espirit.firstspirit.access.store.Store;

import de.espirit.firstspirit.access.store.Pagestore;

import de.espirit.firstspirit.agency.SpecialistsBroker;

import de.espirit.firstspirit.agency.StoreAgent;

StoreAgent storeAgent = context.requestSpecialist(StoreAgent.TYPE); 

Store pageStoreRoot = (Store) storeAgent.getStore(Store.Type.PAGESTORE);

storeElement = pageStoreRoot.getStoreElement(section.id);

language = (context.getContext().getVariableNames().contains("language")) ? context.getVariableValue("language") : context.getProject().getMasterLanguage();

try {

    storeElement.setLock(true, false);

    try {

        formData = storeElement.getFormData();

        formFieldData = formData.get(language, formField);

        if (!title.equals(formFieldData.get())) {

            formFieldData.set(title);

            storeElement.setFormData(formData);

            storeElement.save;

        }

    } catch (Exception e) {

     ...

    } finally {

        storeElement.setLock(false, false);

    }

catch ...

0 Kudos
1 Solution

Accepted Solutions

Hi Arne,

rufst du das Skript etwa in einem Template auf - also während der Generierung?

Da befindest du dich nämlich immer im Read-Only Store. Ist auch nicht zu empfehlen, während der Generierung zu Schreiben. Die Änderung würde das Generat dann auch gar nicht mehr mitkriegen. Vllt. solltest du mal kurz weiter ausholen, was denn die genaue Anforderung bzw. das Ziel deines Skriptes ist.

Gruß

Felix

View solution in original post

0 Kudos
6 Replies
felix_reinhold
Returning Responder

Hallo Arne,

es sollte reichen, wenn du beim Aufruf von getStor enoch ein false als zweiten Parameter mitgibst:

Store pageStoreRoot = (Store) storeAgent.getStore(Store.Type.PAGESTORE);

StoreAgent (FirstSpirit Developer-API)

Gruß

Felix

0 Kudos

Hallo Felix,

vielen Dank für deine Antwort!
Leider hat es nicht geholfen, laut Doku wird bei auslassen das Parameters ebenso wie bei "false" der current-State geholt.

Sind Seiten und Absätze im Inhaltsbereich evtl grundsätzlich nicht schreibbar? Mein Section Element hat auch keine Uid, hängt es irgendwie damit zusammen?

Viele Grüße,

Arne

0 Kudos

Hallo Arne,

sections haben generell keine Uid. Ich mache aktuell genau das gleiche in einem Skript und habe damit keine Probleme.
Probier mal statt der Section die dazugehörige Page zu locken. Wäre dann auf dem schnellen Weg so:

storeElement.getParent().getParent().setLock(true, true);

0 Kudos

Auch auf der Page habe ich das gleiche Problem.

Auch wenn ich mit storeElement.getParent() darauf zugreife kommt der selbe Fehler (storeElement.getParent().getParent() ist null)
Hier die Vorschau-Fehlerausgabe:

02.08.2021 12:49:04.354 INFO  (Script 'setvideotitle' (id=403628) at 0, 0): isLocked: false

02.08.2021 12:49:04.354 INFO  (Script 'setvideotitle' (id=403628) at 0, 0): LockSupported: true

02.08.2021 12:49:04.354 INFO  (Script 'setvideotitle' (id=403628) at 0, 0): Page Class: de.espirit.firstspirit.store.access.pagestore.PageImpl

02.08.2021 12:49:04.354 ERROR (Script 'setvideotitle' (id=403628) at 0, 0):  at 0, 0: Script 'setvideotitle' (id=403628) - Method Invocation storeElement.setLock : at Line: 53 : in file: inline evaluation of: ``__execute() { //!Beanshell // This script saves a given string to a given form f . . . '' : storeElement .setLock ( true )

Target exception: java.lang.SecurityException: read only store

at line 53

0 Kudos

Hi Arne,

rufst du das Skript etwa in einem Template auf - also während der Generierung?

Da befindest du dich nämlich immer im Read-Only Store. Ist auch nicht zu empfehlen, während der Generierung zu Schreiben. Die Änderung würde das Generat dann auch gar nicht mehr mitkriegen. Vllt. solltest du mal kurz weiter ausholen, was denn die genaue Anforderung bzw. das Ziel deines Skriptes ist.

Gruß

Felix

0 Kudos

Ja, momentan war das mein Plan.

Unser Kunde wünscht sich die Möglichkeit namentlich nach Werten die aus einem externen Plugin gepflegt werden (VideoManagerPro) innerhalb FirstSpirits zu suchen. Dafür möchten wir eine Eingabefeld mit dem Wert aus diesem Plugin füllen.
Da ich mir den Wert umständlich aus den Formdaten & diesem externen Plugin auslese und ich davon ausging, dass man auch während der Generierung änderungen an Seiten vornehmen kann (aufgrund eines älteren Skript von dem ich erwartete dass es funktioniert) habe ich es nicht hinterfragt.

Da ich das Skript eigentlich sowieso nicht mit der Generierung verknüpft lassen will werde ich jetzt versuchen die entsprechenden Werte aus FormData innerhalb des Skripts zu holen, anstatt Sie aus dem Template zu übergeben.
Da ich sowieso über "alle" Seiten iterieren möchte ist diese Lösung kein Problem

Vielen Dank für deine Hilfe!

0 Kudos