thermann
I'm new here

Probleme beim Auslesen einer FS_INDEX-Eingabekomponente in Datenquellen

Hallo Zusammen,

wir haben folgendes Konstrukt:

Es gibt eine Haupttabelle "camera". Diese ist mit einer 1:1-Verknüpfung mit der Tabelle "cameraspecs_areascan" verbunden. In der Tabellenvorlage zur Tabelle "cameraspecs_areascan" gibt es ein XML-Feld. Dieses wird mit einem FS_INDEX befüllt, welcher sich aus einer weiteren Tabelle (vlaue_lensmount) befüllt. Eine Verknüpfung zwischen den Tabellen besteht nicht.

Nun verwenden wir ein Rendertemplate um die Werte der Tabelle cameraspecs_areascan auszulesen. Der Aufruf ist im Ausgabekanal der Tabellenvorlage "camer" enthalten. Diser lautet:

$CMS_RENDER(template:"ft_cameras_areascanspecs",ft_item:tt_cameraspecs_areascan.getDataset().getEntity())$

In diesem Rendertemplate soll nun die Werte aus der FS_INDEX-Eingabekomponente ausgegeben werden:

$CMS_FOR(item, ft_item.value_lensmount)$

                                                                      <li>$CMS_VALUE(item.class)$</li>

$CMS_END_FOR$

Das Resultat ist dieses:

  • de.espirit.firstspirit.client.access.editor.lists.IndexImpl$BoundRecord

Hat jemand eine Idee, wie ich an die Werte kommen kann?


Vielen Dank für eure Hilfe!


8 Replies
StefanSchulz
I'm new here

Hi,

für den Zugriff gibt es einen eigenen Abschnitt in der FS-Online-Dokumentation Smiley Wink

Was hier benötigt wird, ist

ft_item.value_lensmount.values

als Quelle der Schleife.

Beste Grüße

Stefan

0 Kudos

Hallo Stefan,

leider ist das nicht so einfach, wie es sich vielleicht anhört. Den Abschnitt in der Dokumentation hatten wir auch schon gefunden. Da wir die Daten ja über eine mehrfach verschachtelte Tabelle auslesen müssen, ist uns dies nur durch die Einbindung eines Scriptes gelungen. Da der Sachverhalt sehr komplex ist, kann ich Dir das Problem bei Bedarf gerne auch in einer Websession erläutern.

Trotzdem Danke für Deine Rückmeldung und viele Grüße

0 Kudos

Hallo Tim,

dann verstehe ich deine Problemstellung wohl falsch? Wenn ihr als Elementtyp einen BoundRecord habt, dann ist ft_item.value_lensmount korrekt vom Datentyp Index. Mit obigem Zugriff erhaltet ihr dann die hinter den Einträgen stehenden FormData als Wert in der Schleife. Die Verschachtelung ist dann eigentlich egal.

Was über sehe ich?

Beste Grüße

Stefan

0 Kudos

Hallo Tim,

vergiss mal, was ich oben alles geschrieben habe, anscheinend bin ich taub auf den Augen.

Das Problem ist, dass über den CmsRender-Aufruf mit dem Entity als Parameter die inneren Felder nicht aufgelöst werden können. Entsprechend wird ft_item.value_lensmount vom Typ IndexImpl sein und nicht IndexAccessor.

Ich bin nicht sicher, ob es eine schöne Lösung gibt. Ausprobieren könntest du, statt des Entity die Daten des Dataset über die Methode getFormData() zu übergeben und auf dem Objekt zu arbeiten. Also statt

tt_cameraspecs_areascan.getDataset().getEntity()

diesen Aufruf verwenden:

tt_cameraspecs_areascan.getDataset().getFormData()

ft_item.value_lensmount (bzw. die damit verbundene Eingabekomponente passenden Namens) sollte dann vom Typ IndexAccessor sein und mit .values erhältst du die inneren FormData-Objekte.

Beste Grüße

Stefan

0 Kudos
pavone
I'm new here

Hallo Tim,

benötigst Du noch weitere Hilfe oder haben Dir Stefans Antworten bereits geholfen? In diesem Fall wäre es super, wenn Du die "richtige Antwort" entsprechend markierst, damit auch andere Community-Teilnehmer diese auf den ersten Blick finden. Solltest Du zwischenzeitlich eine eigene Lösung gefunden haben, wäre es nett, wenn Du diese hier bereitstellst.

Viele Grüße

Tim

0 Kudos
felix_reinhold
Returning Responder

Hallo zusammen,

auch wenn das ursprüngliche Posting von Tim schon etwas her ist würde ich hier gerne nochmal einhaken. Der von Stefan beschriebene Weg mag eine Lösung für das von Tim beschriebene Setup sein. GIbt es hier aber auch noch eine alternative Lösung, wenn über das Entity gearbeitet werden muss?

Ich habe aktuell das gleiche Problem, da ich meinen Datensatz aus den pageParams hole (was ja immer ein Entity ist).

Vereinfachte Form der Projektstruktur:

Datenquelle Artikel referenziert (m:n) die Datenquelle Tags (Schlagwörter).

Dazu gibt es eine Artikeldetailseite (Content-Projektion).

In der Seitenvorlage werden mehrere Formatvorlagen gerendert, die auf Daten des aktuellen Content-Projektionsdatensatzes zugreifen. Deshalb rendern wir als erstes in der Seitenvorlage eine Formatvorlage, die die Unterscheidung zwischen ContentProjektion und "Nicht-Contentprojektion" vornimmt und die einzelne Eigenschaften des Artikels in den Seitenkontext legt.

Vereinfachtes Beispiel:

$CMS_IF(#global.pageParams.data.size==1)$

          $CMS_SET(#global.context("PAGE")["pv_article_data"],#global.pageParams.data.get(0))$

          $CMS_SET(#global.context("PAGE")["pv_page_tags"], pv_article_data.tags)$

$CMS_ELSE$

          $CMS_SET(#global.context("PAGE")["pv_page_tags"], pt_page_tags)$

$CMS_END_IF$

pt_page_tags im ELSE-Fall ist hierbei ebenfalls um eine FS_INDEX Komponente, nur eben direkt in der Seitenvorlage und nicht im Datensatz der Projektion.

In einer späteren Formatvorlage werden dann die Tags gerendert:

$CMS_FOR(fv_tag, pv_page_tags.values)$

            $CMS_SET(fv_tag_text, fv_tag.tt_text)$

            <a class="tag" href="#" target="_self"><strong>$CMS_VALUE(fv_tag_text)$</strong></a>

$CMS_END_FOR$

Für den ELSE-Fall von oben funktioniert das ganz normal.

Für die Content-Projektion habe ich das gleiche Verhalten, wie Tim.

Es handelt sich um keinen IndexAccessor sondern IndexImpl mit den entsprechenden BoundRecords.

Gibt es hierfür auch eine Lösung? (Version 5.2.515)

Danke und beste Grüße

Felix

0 Kudos

Hallo Felix,

wenn die Information direkt aus dem Entity kommt, wird es wohl nur mithilfe eines Skripts funktionieren (siehe CMS_RENDER), um an die Inhalte zu gelangen. Denn in diesem Fall hat man lediglich Zugriff auf den Identifier und muss die Session für das Plugin selbst erzeugen.

Wie man dann an die Einträge kommt, findest du im Kapitel Index über API.

Gruß

Stefan

0 Kudos

Hallo Stefan,

danke für die Antwort - so habe ich es jetzt auch gelöst.

Falls noch jmnd. das Problem hat:

Ich habe nun in einem Modul eine Helperfunktion "indexToEntityList" erstellt, die ich im FirstSpirit zur Verfügung stelle und in den Templates direkt nutzen kann. Der Funktion gebe ich den Index, das Template, in dem sich das FS_INDEX Feld befindet + den Feldnamen mit. In der Funktion kann ich mit dann darüber die GomIndexSource holen. Der Rest erfolgt dann analog zur Dokumentation, indem ich mir aus der GomIndexSource die DataAccessSession erstelle und dannüber die einzelnen Identifier im Index iteriere und jeweils über die DataAccessSession den Datensatz und somit das Entity ermittel.

Besten Dank und Gruß

Felix