FS_INDEX Abfrage Value
Author: thomas_ritter
Publication Date: 3/24/2016 8:13
Hallo zusammen,
ich hab derzeit ein Problem mit der Abfrage eines FS_INDEX Eintrages innerhalb von Datenquellen. Ich möchte in einer Tabellevorlage eine FS_INDEX-Liste pflegen und den Value der Einträge (ttName) in einer Seitevorlage ausgeben.
Mein Aufbau:
Tablle 1: rewriteurls
--> Feld: ttHostList (FS_INDEX) --> schema: hostlist (xml)
Tabelle 2: hosts
--> Feld: ttName (TEXT)
Seitenvorlage:
<CMS_HEADER>
<CMS_FUNCTION name="contentSelect" resultname="frRewriteUrls">
<CMS_PARAM name="schema" value="osram" />
<QUERY entityType="rewriteurls" limit="0"></QUERY>
</CMS_FUNCTION>
</CMS_HEADER>$CMS_TRIM(level:1)$
<urlrewrite>
$CMS_IF(!frRewriteUrls.isEmpty)$
$CMS_FOR(_item, frRewriteUrls)$
$CMS_FOR(_itemHostList,_item.hostlist)$
<rule>
<from>^/web/$CMS_VALUE(_item.shorturl)$</from>
<to type="redirect">http://$CMS_VALUE(_itemHostList.?????????)$$CMS_VALUE(_item.postfix)$/TemplateMaster/$CMS_REF(_item.targeturl)$</to>
<condition name="host" operator="equal">$CMS_VALUE(_itemHostList.?????????)$</condition>
</rule>
$CMS_END_FOR$
$CMS_END_FOR$
$CMS_END_IF$
</urlrewrite>
$CMS_END_TRIM$
Ich hole mir über einen ContentSelect alle Datensätze der Tabelle rewriteurls und interiere dann mit 2 FOR-Schleifen darüber. Leider komme ich nicht auf "ttName" der Einträge in der FS_INDEX.
Ich habe schon sämtliche Varianten mit
_item.hostlist.values
_itemHostList.formData
etc. probiert. Jedoch ohne Erfolg.
Hat jemand eine Idee?
LG Thomas
Tags: fs_index
-
Author: marza - 4/5/2016 11:06
Hallo Thomas,
bei Deinem Problem hilft immer ein Blick ins ODFS. Ein FS_INDEX gibt im Iterator Objekte vom Typ Record wieder. Alternativ hängt man an die Laufvariable im Template-Code ein .class an, dann müsste man den Klassennamen sehen.
Wenn das Element eine Entity ist und eine eigene Tabellenvorlage hat (in dem die Entity ausgegeben wird), dann müsste eigentlich per $CMS_VALUE()$ dieses Template ausgegeben werden.
Falls das nicht funktioniert, ich sehe gerade, ein Objekt vom Typ Record hat eine ToJSON-Methode. Man könnte sich also on-the-fly per CMS_SET ein neues Objekt erstellen lassen können, auf dass man, wie unter dem CMS_SET-ODFS-Eintrag beschrieben, zugreifen kann.
Grüße Marian
0 -
Author: StefanSchulz - 4/6/2016 12:53
Hi Thomas,
für die iterative Abarbeitung der Index-Inhalte steht eine gesonderte Funktionalität zur Verfügung. Hierzu läuft die Schleife nicht über den Index direkt, sondern über dessen Eigenschaft values.
In deinem Fall wie folgt:
$CMS_FOR(item,_item.hostlist.values)$Die Variable item enthält dann in jedem Durchlauf direkt das Werteobjekt und der Zugriff mit item.ttName sollte reibungslos funktionieren.
Beste Grüße
Stefan
0 -
Author: thomas_ritter - 4/6/2016 13:16
Hallo zusammen,
zu Lösung Marian:
habe es so leider nicht lösen können. Im JSON steht die Information die ich benötige nicht drin, sondern nur wenige Informationen zu jedem RECORD:
{
"FS_GID":"c80cd0cc-e45c-4fd0-abd9-860564d19a1e",
"shorturl":"test",
"hostlist":"<CMS_VALUE name=\"ttHostList\" tag=\"FS_INDEX\"><LANG id=\"§\" set=\"1\"><INDEX><RECORD>{\"schema\":\"osram\",\"gid\":\"c10caf10-4531-4d97-bb99-761ef5487fdf\",\"table\":\"hosts\"}<\/RECORD><RECORD>{\"schema\":\"osram\",\"gid\":\"dd22c2c9-501b-4bac-af02-7e68e93953c5\",\"table\":\"hosts\"}<\/RECORD><RECORD>{\"schema\":\"osram\",\"gid\":\"8e7e962d-e3ce-4e76-b584-10c37f31fef5\",\"table\":\"hosts\"}<\/RECORD><RECORD>{\"schema\":\"osram\",\"gid\":\"379a6de1-4d31-4b92-ad9a-1845c37389ad\",\"table\":\"hosts\"}<\/RECORD><\/INDEX><\/LANG><\/CMS_VALUE>",
"released by":3244,
"changed by":3244,
"wf col":null,
"wf id":null,
"host":"www.cms-web-dev.os4.spacenet.de",
"postfix":"/test",
"targeturl":"<CMS_VALUE name=\"ttTargetUrl\" tag=\"FS_REFERENCE\"><LANG id=\"§\" set=\"1\"><UID>shorturl<\/UID><UIDTYPE>SITESTORE_LEAF<\/UIDTYPE><REMOTE/><\/LANG><\/CMS_VALUE>",
"fs_id":258
}zu Lösung Stefan:
komme so leider auch nicht drauf, da ich einen Error erhalte wenn ich wie beschrieben die FOR-Schleife gestalte:
06.04.2016 14:15:53.109 ERROR ($CMS_FOR( _itemHostList, _item.hostlist.values )$ at 10, 4): Cannot iterate over: class de.espirit.firstspirit.parser.eval.Undefined
inside of: Template 'pt_rewriteurls__448_dev' (id=33847)
inside of: $CMS_TRIM(level:1)$ - at 6, 14
inside of: $CMS_IF( ! frRewriteUrls.isEmpty )$ - at 8, 1
inside of: $CMS_FOR( _item, frRewriteUrls )$ - at 9, 3
inside of: $CMS_FOR( _itemHostList, _item.hostlist.values )$ - at 10, 4
lg thomas
0 -
Author: StefanSchulz - 4/6/2016 13:26
Hm, sehe gerade erst, dass du direkt auf die Spalten der Datenbank zugreifst und nicht auf das Formular, richtig? Dann geht das so nicht und anders vermutlich auch eher schwer. Deine Ausgabe (RECORD) oben zeigt keinen Record sondern einen Datensatzeintrag mit den einzelnen Spalten. Auf diesem Weg fehlt jegeliche Verknüpfung zum Formular und somit auch zur Auswertung des FS_INDEX.
Gruß
Stefan
0 -
Author: thomas_ritter - 4/6/2016 14:14
Ok, Danke.
Dann werde ich es direkt in der Tabellenvorlage Umsetzen müssen und diese als Content einbinden in das Pagetemplate.
$CMS_TRIM(level:2)$
<urlrewrite>
$CMS_FOR(_item, ttHostList)$
<rule>
<from>^/web/$CMS_VALUE(ttShortURL)$</from>
<to type="redirect">http://$CMS_VALUE(_item.ttName)$$CMS_VALUE(_item.postfix)$/TemplateMaster$CMS_REF(ttTargetUrl)$</to>
<condition name="host" operator="equal">$CMS_VALUE(_item.ttName)$</condition>
</rule>
$CMS_END_FOR$
</urlrewrite>
$CMS_END_TRIM$
lg thomas
0 -
Author: MichaelaReydt - 4/11/2016 10:22
Hallo Thomas,
ist dieses Posting noch offen? Benötigst du noch weitere Hilfe oder war der direkte Weg über die Tabellenvorlage erfolgreich?
Viele Grüße
Michaela
0 -
Author: thomas_ritter - 4/12/2016 9:59
Hallo Michaela,
das Problem ist damit erledigt.
Danke.
0 -
Author: TimoMeister - 6/21/2017 8:02
Hallo zusammen,
wenn ich das richtig lese, kommt man über ein contentSelect nicht direkt an die Werte des FS_INDEX, richtig?
Wie komme ich dann an die Werte?
In meinem Anwendungsfall kann ich es nicht direkt in der Tabellenvorlage umsetzen.
Viele Grüße
Timo
0 -
Author: thomas_ritter - 6/21/2017 8:54
Hi Timo,
poste doch mal ein Beispiel bzw. Ausschnitt deines Codes und eine Erklärung warum du nicht direkt auf die Tabellevorlage zugreifen kannst.
0 -
Author: TimoMeister - 6/21/2017 9:11
<CMS_FUNCTION name="contentSelect" resultname="fr_cs_assets">
<CMS_PARAM name="schema" value="FSDatabase" />
<QUERY entityType="Systemassets"></QUERY>
</CMS_FUNCTION>
$CMS_FOR(_bim, fr_cs_assets.bim_files)$
<li>$CMS_VALUE(_bim.class)$</li>
$CMS_END_FOR$
Ausgabe:
de.espirit.firstspirit.client.access.editor.lists.IndexImpl$BoundRecord
Die Spalte "bim_files" ist ein XML-Feld das ich mit FS-INDEX setze.
In der Tabellenvorlage funktioniert die Ausgabe wie gewünscht. Ich benötige die Informationen aber noch für einen Teaser in einem bestimmten Template.
0 -
Author: sgoess - 7/14/2017 10:11
Hallo zusammen,
das von TimoMeister beschriebene Problem habe ich auch - hat hier jemand eine Lösung parat? Oder konntest du das mittlerweile lösen, Timo?
Viele Grüße
Sebastian
0 -
Author: TimoMeister - 7/17/2017 6:53
Hallo Sebastian,
ich habe nur eine sehr umständliche bzw unschöne Lösung. Leider geht es bisher (?) nicht anders.
Über ein weiteres ContentSelect und dann eine Abfrage über den Identifier.$CMS_FOR(_b,fr_cs_bim.filter(x->x.getGid.toString==_bim.getIdentifier.substring(32,68)))$
<li>$CMS_VALUE(_b.description)$</li>
$CMS_END_FOR$
Viele Grüße
Timo
0 -
Author: TimoMeister - 10/17/2018 7:00
Hierzu gibt es einen Feature Request - FS_INDEX direkter Zugriff auf Entity in ContentSelect
0 -
Author: hoebbel - 3/14/2019 14:50
Hallo Sebastian,
auch wenn es sehr spät ist, vielleicht hilft dieser Lösungsansatz weiter:
Erst das content2 Objekt holen und dann damit die entity zum dataset umwandeln.
Über das dataset.formData.<Name der Eingabekomponente> kommt man dann an den Index und kann über diesen "ganz normal" iterieren.
Auch nicht schön, aber in meinen Augen etwas sauberer als das Persistenzformat zu interpretieren.
Der entsprechende Templatecode sieht so aus (Annahme: Die Datenquelle heißt "FSDatabase", die FS_INDEX Eingabekomponente "bim") - und ich hoffe, ich habe mich nirgendwo vertippt :smileywink:
$-- Content2 holen --$
$CMS_SET(FSDatabaseCS2, #global.userService.getStore(class("de.espirit.firstspirit.access.store.Store$Type").CONTENTSTORE,false).getContent2ByName("FSDatabase"))$
$-- über die contentSelect Funktion iterieren --$
$CMS_FOR(_asset, fr_cs_assets)$
$-- entity in dataset umwandeln --$
$CMS_SET(_assetDataset,FSDatabaseCS2.getDataset(_asset))$
$-- über die FS_INDEX Eingabekomponente iterieren --$
$CMS_FOR(_bim,_assetDataset.formData.bim.values)$
$-- Gewünschte Informationen ausgeben --$
$CMS_END_FOR$
$CMS_END_FOR$
Vielleicht hilft es ja,
viele Grüße,
Holger
0 -
Author: MarsDD - 3/15/2019 6:30
Hallo,
viel schöner wäre es, wenn ContentSelect Datasets zurück liefern würde. Vom Entity kommt ich nur via Content2 ans Dataset. Allgemein wäre es wünschenswert, da eine Rückkopplung von Entity <-> Dataset zu schaffen.
Viele Grüße
Marcel
0 -
Author: hoebbel - 3/15/2019 7:17
Hallo Marcel,
im Prinzip sehe ich das auch so, im Detail würde dies aber erst einmal eine inkompatible Änderung der Funktion sein.
Bleibt also die Möglichkeit, dass über einen zusätzlichen Parameter aufzubohren oder gleich eine weitere Funktion zur Verfügung zu stellen, die mittelfristig die contentSelect Funktion ablösen könnte [vom Dataset kommt man ja leicht zum Entity, umgekehrt ist das schon deutlich schwieriger, da man hier zusätzliche Context-Informationen benötigt].
Hier wäre es sinnvoll, einen entsprechenden Feature Request zu erstellen, damit dies diskutiert und bewertet werden kann.
Viele Grüße,
Holger
0
Please sign in to leave a comment.
Comments
16 comments