jherrmann
Occasional Observer

FS_INDEX: Custom DataAccessPlugin Item aus FS_INDEX via FS_BUTTON holen

Guten Tag,

bei einem Kunden implementieren wir zusammen mit einem anderen Dienstleister eine Schnittstelle zu einem DAM.
Hierfür gibt es eine Klasse BynderDataAccessPlugin, welche das Interface DataAccessPlugin implementiert.
Es wird dann ein FS_INDEX verwendet, um dem Redakteur zu ermöglichen ein Asset aus dem DAM auszuwählen.
Das klappt soweit auch schon hervorragend.

Ziel ist es nun, das im FS_INDEX ausgewählte Element (zum Beispiel) bei einem Klick auf einen FS_BUTTON in die Medienverwaltung von FirstSpirit zu übertragen und es in einem FS_REFERENCE zu selektieren.
Hierfür hatte ich gestern versucht, über einen Paremeter (Wert: #field.st_bynder_selection) in einem Beanshell-Script (ausgeführt über den FS_BUTTON (onclick)) auf das Asset zuzugreifen, ich erhalte aber komplett andere Klassen und weiß jetzt erstmal nicht mehr weiter.

Im Kontext des Ausgabekanals via $CMS_VALUE(...)$ und auch in einer Beanshell, ausgeführt über $CMS_RENDER(...)$
ist st_dam_selection eine Instanz von de.espirit.firstspirit.generate.values.IndexAccessorImpl.
Hier kann ich dann über .getValues().get(0) an das Asset gelangen.

Im Kontext des Beanshell-Scripts, ausgeführt über den Klick auf FS_BUTTON mit dem Feld als Parameter (<PARAM name="bynder_selection_field">#field.st_bynder_selection</PARAM>), erhalte ich  stattdessen eine Instanz der Klasse de.espirit.firstspirit.ApiRemoteFormField.
Mit .get() erhalte ich eine Instanz der Klasse de.espirit.firstspirit.client.access.editor.lists.IndexImpl.
Hier erscheint mir nur .toArray() sinnvoll.
.toArray()[0] gibt mir eine Instanz der Klasse de.espirit.firstspirit.client.access.editor.lists.IndexImpl$BoundRecord,
womit ich absolut nichts anzufangen weiß. Hier gibt es eigentlich nur getIdentifier(), was mir lediglich die sehr lange, eindeutige ID gibt.

Ich habe ebenfalls versucht, über das Element (Die Page) und dann via .getFormData().get(null, "st_bynder_selection").get() zu arbeiten, was aber naheliegenderweise das gleiche Ergebnis liefert.

Gibt es eine andere Möglichkeit via FS_BUTTON auf das DamAsset innerhalb des FS_INDEX zuzugreifen?
Oder gibt es weitere Möglichkeiten, die Auswahl zu übernehmen?

In einem früheren Projekt bzgl. eines anderen DAMs hatten wir dies mit einem TagReport gemacht, deren Elemente draggable waren. Sie konnten auf den FS_BUTTON fallen gelassen werden.
Man ging also über den TagReport und Drag and Drop auf den Button, statt einer Auswahl via FS_INDEX und einem Klick auf den Button.
Der Code ist aber sehr alt, schlecht verständlich und möglicherweise auch nicht mehr funktional.
Wo finde ich am ehesten eine aktuelle Dokumentation, wie man heute einen solchen TagReport umsetzen kann?

Der Vollständigkeit halber hier noch der Code:

<CMS_MODULE>

  <FS_INDEX name="st_bynder_selection" height="1" useLanguages="no" viewMode="details">
    <LANGINFOS>
      <LANGINFO lang="*" label="Bild hier auswählen"/>
    </LANGINFOS>
    <SOURCE name="Bynder-DAP-Integration/DamDataAccessPlugin"/>
  </FS_INDEX>

  <FS_BUTTON
    name="st_dam_connector"
    alwaysEnabled="yes"
    hFill="yes"
    onClick="script:test"
    style="button"
    useLanguages="no">
    <LANGINFOS>
      <LANGINFO lang="*" label="Bynder Connect - Bild übernehmen" description="Hier drücken um das gewählte Bild zu übernehmen"/>
    </LANGINFOS>
    <PARAMS>
      <PARAM name="bynder_selection_field">#field.st_bynder_selection</PARAM>
      <PARAM name="media_fs_field">#field.st_image</PARAM>
    </PARAMS>
  </FS_BUTTON>

  <FS_REFERENCE name="st_image" allowEmpty="yes" hFill="yes" useLanguages="no">
    <FILTER>
      <ALLOW type="media"/>
    </FILTER>
    <LANGINFOS>
      <LANGINFO lang="*" label="übernommenes Bild - Hier nichts auswählen!"/>
    </LANGINFOS>
    <PROJECTS>
      <LOCAL name=".">
        <SOURCES>
          <FOLDER name="root" store="mediastore"/>
        </SOURCES>
      </LOCAL>
    </PROJECTS>
  </FS_REFERENCE>

</CMS_MODULE>
$CMS_SET(set_map, {:})$
$CMS_SET(void, set_map.put("accessor", st_bynder_selection))$
$CMS_RENDER(script:"bynder_test_1", sc_map:set_map)$
// called via html output channel
return sc_map.get("accessor").getClass().getName();
//! Beanshell

// called via fs_botton, onclick, bynder_selection_field is a parameter
context.logInfo(bynder_selection_field.get().toArray()[0].getClass().getName());



FS-Version: 2023.7

 

Wir sind für jede Hilfe sehr dankbar.

Viele Grüße
Johanna

0 Kudos
1 Reply
hoebbel
Crownpeak employee

Hallo Johanna,

ich glaube, Du hast dich "verlaufen". Schau mal hier in die Doku, dass sollte Dich wieder auf den richtigen Pfad bringen.

Das Problem hier ist, dass die FS_INDEX Eingabekomponente nicht das angebundene Objekt speichert, sondern nur eine Referenz auf das Objekt, die über das DataAccessPlugin (DAP) aufgelöst werden muss. Bei einem Zugriff per API musst Du dich darum selber kümmern, während der Zugriff über den Templatecode dir hier sehr viel abnimmt. Was Du dann genau zurückbekommst, hängt aber von der Implementierung des DAP ab.

Viele Grüße
Holger

0 Kudos