Radigewski
Occasional Collector

ValueService

Jump to solution

Hallo,

in der Community gibt es einige Beiträge zum Thema Rules & ValueService. Gerade der ValueService scheint mir  leider kaum dokumentiert zu sein. Mir ist daher nicht klar, wie man von einem ValueService auf den aktuellen Inhalt zugreifen kann. Gibt es irgendwo eine Beschreibung oder ein Beispiel? Kann mir jemand einen Tipp geben?

Grundsätzlich scheint es ja möglich zu sein:

"Innerhalb des Dienstes steht ein SpecialistBroker zur Verfügung, über den der Zugriff auf die üblichen Inhalte von FirstSpirit möglich ist."

https://community.e-spirit.com/message/16742#16742

Der SpecialistsBroker in ValueService.getValue() ist vom Typ "GuiHostDelegatingSpecialistsBroker", den ich wiederum nicht in der API finden kann.

Wie geht es hier weiter? Ziel ist es weitere Informationen aus dem aktuellen Inhalt zu lesen.

Vielen Dank

Thomas Radigewski

1 Solution

Accepted Solutions

Hallo Herr Radigewski,

das ist leider aktuell meines Wissens nach nicht möglich. Der ValueService hat nur die Informationen, die über Parameter hineinkommen: Also fixe Werte oder zugreifbare <PROPERTY>s. Und hier gibt es aktuell nur Properties, die zwar Informationen über das aktuelle StoreElement liefern - z.B. dessen Typ mit <PROPERTY source="#global" name="ELEMENTTYPE" />, aber nichts mit dem das konkrete Element identifiziert werden könnte.

Über den SpecialisBroker (bzw. einen Agent, den dieser liefern könnte) bekommen Sie im JavaClient leider auch überhaupt keine Informationen über den Element-Kontext...

Eine Möglichkeit, zumindest die aktuelle Seitenreferenz zu erhalten gibt es lediglich in WebEdit, da der SpecialistsBroker hier einen WebeditUiAgent liefern kann, den man dann per getPreviewElement() danach fragen kann. Ich habe mal ein Beispiel getestet, in dem die UID der entsprechenden Seitenreferenz zurückgeliefert und in ein INPUT_TEXT geschrieben wird:

public Object getValue(SpecialistsBroker specialistsBroker, Map<String, ?> stringMap) {

        WebeditUiAgent agent=specialistsBroker.requestSpecialist(WebeditUiAgent.TYPE);

        if(agent==null) {

            return "No Agent there";

        } else {

            return agent.getPreviewElement().getUid();

        }

}

Viele Grüße

Michael Bergmann

View solution in original post

0 Kudos
9 Replies
mbergmann
Crownpeak employee

Hallo Her Radigewski,

um welche Informationen geht es genau? Werte von Eingabekomponenten desselben Formulars müssten Sie als Parameter übergeben:

<ON_EVENT>

     <SCHEDULE service="NAME_DER_PUBLIC_KOMPONENTE" id="1" delay="200">

          <CONDITION>

           ...

          </CONDITION>

          <PARAM name="myHeadline">

               <PROPERTY source="st_headline" name="VALUE"/>

          </PARAM>

     </SCHEDULE>

     <DO>

     ...

     </DO>

</ON_EVENT>

... und dann im ValueService darauf zugreifen:

public Object getValue(final SpecialistsBroker broker, final Map<String, ?> params) {

     String headline=(String) params.get("myHeadline");  

     ...

}

Viele Grüße

Michael Bergmann

0 Kudos

Ich möchte z.B. wissen, ob der aktuelle Absatz in einem Inhaltsbereich oder in einer FS_LIST angelegt wurde.

0 Kudos

Hallo Herr Radigewski,

das ist leider aktuell meines Wissens nach nicht möglich. Der ValueService hat nur die Informationen, die über Parameter hineinkommen: Also fixe Werte oder zugreifbare <PROPERTY>s. Und hier gibt es aktuell nur Properties, die zwar Informationen über das aktuelle StoreElement liefern - z.B. dessen Typ mit <PROPERTY source="#global" name="ELEMENTTYPE" />, aber nichts mit dem das konkrete Element identifiziert werden könnte.

Über den SpecialisBroker (bzw. einen Agent, den dieser liefern könnte) bekommen Sie im JavaClient leider auch überhaupt keine Informationen über den Element-Kontext...

Eine Möglichkeit, zumindest die aktuelle Seitenreferenz zu erhalten gibt es lediglich in WebEdit, da der SpecialistsBroker hier einen WebeditUiAgent liefern kann, den man dann per getPreviewElement() danach fragen kann. Ich habe mal ein Beispiel getestet, in dem die UID der entsprechenden Seitenreferenz zurückgeliefert und in ein INPUT_TEXT geschrieben wird:

public Object getValue(SpecialistsBroker specialistsBroker, Map<String, ?> stringMap) {

        WebeditUiAgent agent=specialistsBroker.requestSpecialist(WebeditUiAgent.TYPE);

        if(agent==null) {

            return "No Agent there";

        } else {

            return agent.getPreviewElement().getUid();

        }

}

Viele Grüße

Michael Bergmann

0 Kudos

Hallo,

ist an dieser Stelle noch weitere Hilfe gewünscht oder konnten Michaels Antworten die Frage bereits lösen? In diesem Fall wäre es super, wenn die "richtige Antwort" entsprechend ausgewählt werden würde.

Viele Grüße

Michaela

0 Kudos
Martin_Dirlewan
Returning Observer

Hallo,

zum Eintrag von Herrn Bergmann:

Für die JavaClient funktioniert es über den UIStoreAgent siehe:

UIStoreAgent uiStoreAgent = specialistsBroker.requestSpecialist(UIStoreAgent.TYPE);

// JavaClient.

if (uiStoreAgent != null)

{

    GuiStoreElement activeUiElement = uiStoreAgent.getActiveUiElement();

    if (activeUiElement != null)

    {

        System.out.println("Debug id:" + activeUiElement.getId());

        System.out.println("Debug storeElement:" + activeUiElement.getStoreElement());

    }

}

       

Grüße

Martin Dirlewanger

0 Kudos

Bitte Vorsicht, der UIStoreAgent ist keine API!

Gruß

Stefan

0 Kudos

Hallo Herr Dirlewanger,

das API-Pendant zu dem NICHT-API-Weg über UiStoreAgent ist der folgende Weg:

Registrierung eines ModelListeners für den Modeltyp SelectionModel#EDITORIAL auf dem ModelService

Gruß

Hallo zusammen,

gibt es noch ein anderen Weg, als über den ModelListener?

Ich habe mich an diesem Beispiel orientiert: https://community.e-spirit.com/ideas/1292#comment-3140.

Jedoch reicht die Einbindung der fs-access.jar dann nicht aus, und die Einbindung der fs-lib-client.jar  ist doch nicht gewollt, oder sehe ich das falsch?

Gruß Sabrina

0 Kudos

Hallo Sabrina,

kannst du mit dieser Frage bitte ein neues Posting eröffnen und in ihm lediglich auf dieses Posting verweisen?

Da dieses Posting zwei Jahre alt ist und bereits eine "richtige Antwort" besitzt, wird deine Frage sonst potentiell nicht wahrgenommen. Ein neu eröffnetes Posting vermeidet dies.

Danke und viele Grüße

Michaela

0 Kudos