Search the FirstSpirit Knowledge Base
Hallo zusammen
Ist es möglich, dass ich über #global.multiPageParams.data.XXXX Werte von einer Seite auf die andere Seite übergeben kann?
Bis jetzt verwende ich den SessionStore. Möchte das für die Zukunft ohne JS machen.
DANKE für einen Tipp
Grüsse
Thomas
Hallo Thomas,
ich nehme an, "andere Seite" bezieht sich auf eine andere Seite derselben Content-Projektion (Ausgabe mittels Tabellenvorlage)?
Und "Werte" auf Inhalte von Datensätzen, die auf einer anderen Seite angezeigt werden?
Wenn ja, kannst Du folgendermaßen auf die Informationen aller Datensätze der Content-Projektions-Seiten zugreifen:
$CMS_IF(!#global.multiPageParams.data.isNull && #global.multiPageParams.data.size > 0)$
$CMS_FOR(for_entity,#global.pageParams.data)$
...
$CMS_END_FOR$
$CMS_END_IF$
Oder man schreibt die Informationen einfach direkt in einen entsprechenden Kontext. An der Dokustelle findet man auch direkt ein Beispiel, wie es gemacht wird. Aber auch hier gilt, dass die Informationen nur auf SPÄTER generierten Knoten zur Verfügung stehen. Der Vorteil bei der Nutzung der Kontexte ist, dass diese nur eine begrenzte Gültigkeit haben.
Ansonsten kann man auch immer im Quelltext der globalen Einstellungsseite (wird über die Projekteigenschaften im ServerManager definiert) eine List ($CMS_SET(set_gs_myList,[])$) oder Map ($CMS_SET(set_gs_myMap,{:})$) definieren und entsprechende Informationen im Quelltext einer Seite / eines Absatzes dieser einfach hinzufügen. Auf diese Informationen kann man dann auf allen Knoten, die SPÄTER generiert werden, zugreifen.
WICHTIG: Man sollte aber nicht zuviele Informationen auf diese Art übergeben, da die Informationen während der gesamten Generierung zwischengespeichert werden. Auch sollte man im Quelltext der globalen Einstellungsseite keinen Code ausführen, dessen Ausführung auf Performance- oder Speicher-Sicht "teuer" ist, da diese Anweisungen auch bei JEDER Vorschau ausgeführt werden!
Viele Grüße
Holger
Hoi Holger, danke für deine wie immer ausführliche Antwort 😉
Verstehe ich das richtig, dass funktioniert nur mit Tabellenvorlagen?
Ich muss z.b. Stellentitel, Region etc. die aus einer Datenquelle kommen von der Stellendetailseite (Datenquelle) der Bewerber-Seite mit dem Bewerberformular übergeben.
$CMS_IF(#global.preview)$
$CMS_IF(!#global.multiPageParams.data.isNull && #global.multiPageParams.data.size > 0)$
$CMS_FOR(for_entity,#global.pageParams.data)$
DEBUG: "-$CMS_VALUE(for_entity)$-"
$CMS_END_FOR$
$CMS_END_IF$
$CMS_END_IF$
Wenn ich das auf der JobDetailseite ausführe erhalte ich folgendes:
DEBUG: "-de.espirit.or.impl.EntityImpl@814d824a{SFS_INSERATE_ERECRUITING_MULTILANG,PERSISTENT,STELLENID=1448466}-"
Wenn ich das auf der Bewerberseite aufrufe habe ich keinen Inhalt.
DEBUG-1:
Grüsse
Thomas
Hallo Thomas,
mit der Entity kannst Du entweder direkt auf die Spalten der Datenbanktabelle zugreifen ($CMS_VALUE(for_entity.<SPALTENNAME>)$ oder dir den Datensatz holen ($CMS_SET(set_dataset,for_entity.getDataset("<UID der Tabellenvorlage>"))$). Über das FormData des Datensatzes (set_dataset.formData) hast Du dann den Zugriff auf die Eingabekomponenten.
ABER deine Beschreibung klingt danach, als würdest Du nicht die Informationen eines anderen Datensatzes benötigen, sondern Informationen, die mit dem entsprechenden Datensatz verknüpft sind (wahrscheinlich über eine Fremdschlüsselbeziehung). Dazu brauchst Du keinen Zugriff auf die multiPageParams (die es nur bei der Ausgabe über Tabellenvorlagen gibt). Diese Informationen kannst Du dir direkt aus dem Datensatz holen, indem Du der Fremdschlüsselbeziehung folgst.
Und wenn ich es doch falsch verstanden habe und die Information auf einer anderen Seite steht, dann werden die Hinweise am Ende meiner letzten Antwort wieder relevant.
Oder Du kannst auch direkt auf andere Seiten/Datensätze zugreifen. Beispielsweise indem Du dir mit FirstSpirit Mitteln den User-Service holst und über diesen einen Store und über diesen dann den gewünschten ID Provider. dazu musst Du nur dessen UID (oder ID) kennen.
$CMS_SET(myContent2,#global.userService.getStore(class("de.espirit.firstspirit.access.store.Store$Type").CONTENTSTORE,false).getContent2ByName("<Content2UID>"))$
$CMS_VALUE(myContent2.getDatasets().get(0).getFormData().get(null,"<component>").get())
Obiges Beispiel sollte (wenn ich mich nicht vertippt habe 😉 den Inhalt der Eingabekomponente <component> des ersten Datensatzes der Datenquelle mit der UID <Content2UID> ausgeben.
Das geht natürlich mit allen Stores, wobei die Art, wie man das entsprechende Element bekommt, dann wieder Store-abhängig ist (meistens benötigt man getStoreElement(@NotNull String uid, @NotNull IDProvider.UidType uidType).
Viele Grüße
Holger
Hoi Holger
Ich habe das mal versucht nachzustellen. Aber verstanden habe ich es glaube noch nicht ganz 😉
getContent2ByName("sfs_inserate_detail") -> Namen der Datenquelle
getFormData().get(null,"Region").get() -> Namen des Feldes
Wie weiss FS welchen Datensatz es holen muss?
$CMS_IF(#global.preview)$
$CMS_SET(myContent2,#global.userService.getStore(class("de.espirit.firstspirit.access.store.StoreType").CONTENTSTORE,false).getContent2ByName("sfs_inserate_detail"))$
DEBUG-1: "-$CMS_VALUE(myContent2.getDatasets().get(0).getFormData().get(null,"Region").get())$-"<br/>
DEBUG-2: "-$CMS_VALUE(myContent2.getDatasets().get(0).getFormData())$-"<br/>
$CMS_END_IF$
Ausgabe:
DEBUG-1: "--"
DEBUG-2: "--"
Grüsse
Thomas
Hallo Thomas,
FirstSpirit weiß nicht, welchen Datensatz Du haben willst. Im Beispiel wird einfach der erste Datensatz (.getDatasets().get(0)) geholt. Das ergibt in der Praxis keinen Sinn. Da würde man im Zweifel über alle Datensätze iterieren, bis man den richtigen gefunden hat.
Oder man überlässt dem Redakteur die Entscheidung, indem man eine FS_DATASET Eingabekomponente verwendet, mit dem er den Datensatz auswählt (dann braucht man auch die Datenquelle nicht zu holen).
Um zum Beispiel zurückzukommen - gibt mal als Debug Ausgabe $CMS_VALUE(myContent2.getDatasets().get(0).getClass())$ aus - wenn das ein Datensatz ist, kannst Du mit getClass() jeweils prüfen, wo es schief läuft. Wenn die Stelle bereits "undefined" ist, prüf mal myContent2.getClass(), ob das überhaupt die Datenquelle ist.
Mir ist aber der gesamte Anwendungsfall nicht klar. Ich glaube, dass Du viel zu umständlich unterwegs bist. Kannst Du mal kurz die Ausgangssituation schildern?
WAS hast Du, WAS benötigst Du und wie sind diese Informationen miteinander verknüpft?
Der Satz hier:
> Ich muss z.b. Stellentitel, Region etc. die aus einer Datenquelle kommen von der Stellendetailseite (Datenquelle) der Bewerber-Seite mit dem Bewerberformular übergeben.
klingt danach, als würden alle Informationen in demselben Datensatz enthalten sein. Wobei ich nicht weiß, was "mit dem Bewerberformular übergeben" bedeutet.
WENN die Informationen aus demselben Datensatz stammen, dann kannst Du über den Datensatz direkt auf diese zugreifen. Je nachdem, wie der Datensatz ausgegeben wird, hast Du wahrscheinlich die Informationen bereits im Context stehen (z.B. über das #row Objekt oder #cs.dataset). Da kannst Du dann auch Informationen aus dem Datensatz holen, die nicht über Eingabekomponenten zur Verfügung stehen.
Viele Grüße
Holger
Hoi Holger
Ich habe versucht das aufzuzeichnen.
Nun ist es für dich ein wenig verständlicher 😉
Grüsse
Thomas
Hallo Thomas,
du möchtest wenn ich es richtig verstehe, diese Informationen „auf der Webseite“ übergeben, richtig?
Das geht nur per JS. Denn auf der generierten Webseite „gibt es ja gar kein FirstSpirit“. Es sind dort ja nur fertig erzeugte Dateien ohne irgendeine Verbindung zu FirstSpirit.
Du bist dort ja nicht im Redaktionssystem/FS unterwegs. Insbesondere wird der Templatecode ja schon bei der Generierung ausgeführt und nicht „von der Webseite aus“.
Oder habe ich doch etwas falsch verstanden?
Viele Grüße
Michael
Hoi Holger und Michael
Ok. Dann habe ich es im Ursprung korrekt umgesetzt. Ich dachte es gäbe noch einen besseren Weg direkt über FS.
Vielen lieben DANK für eure Unterstützung.
Grüsse
Thomas