Search the FirstSpirit Knowledge Base
Hallo zusammen,
sitze gerade an einem merkwürdigen Problemchen, vielleicht hat jemand von euch eine Antwort darauf:
Folgendes Szenario:
FirstSpirit Version 5.1.416
In einer Page wird über eine CMS_INPUT_COMBOBOX mit CMS_INCLUDE_OPTIONS die Möglichkeit geschaffen dem Redakteur eine Entity aus einer Datenquelle auswählen zu lassen.
Nun soll diese über die FirstSpirit API ausgelesen werden. Dazu habe ich folgende BeanShell Ausgabe, die sich anders verhält, als das Java (FSM) Pendant.
Beanshell
bsh % e.getClass();
<class de.espirit.firstspirit.store.access.pagestore.PageImpl>
bsh % ((Option) e.getFormData().get(e.getProject().getMasterLanguage(), "pt_product_range").get()).getClass();
<class de.espirit.firstspirit.store.access.contentstore.ContentOptionFactory$ContentOption>
bsh % ((Option) e.getFormData().get(e.getProject().getMasterLanguage(), "pt_product_range").get()).getValue();
<de.espirit.or.impl.EntityImpl@759cdcc7{ProductRange,PERSISTENT,FS_ID=27559,FS_VALID_FROM=1421840121451,FS_VALID_TO=9223372036854775807,FS_RELEASE_TO=0}>
Java FSM (inkl. Logausgabe aus Generierung)
context.logInfo("Page: " + context.getPage().getClass() + " - " + context.getPage().getUid());
context.logInfo("Option:" + context.getPage().getFormData().get(context.getProject().getMasterLanguage(), "pt_product_range").get().getClass());
context.logInfo("Option Content:" + ((Option) context.getPage().getFormData().get(context.getProject().getMasterLanguage(), "pt_product_range").get()).getValue());
productRangeEntity = (Entity) ((Option) context.getPage().getFormData().get(language, "pt_product_range").get()).getValue();
INFO 10.07.2015 18:56:31.328{g-node=266289} (de.espirit.firstspirit.generate.SiteProduction): Page: class de.espirit.firstspirit.store.access.pagestore.PageImpl
INFO 10.07.2015 18:56:31.328{g-node=266289} (de.espirit.firstspirit.generate.SiteProduction): Option:class de.espirit.firstspirit.access.editor.value.SimpleOption
INFO 10.07.2015 18:56:31.328{g-node=266289} (de.espirit.firstspirit.generate.SiteProduction): Option Content:530392a2-262b-455b-a341-17e8604bb8f7
Der Unterschied liegt in der Option begründet, die sie via Beanshell wohl eine ContentOption ist und via Java FSM eine SimpleOption.
Mir erklärt sich aktuell nicht warum. Kann da jemand helfen? Oder handelt es sich um einen Fehler?
Viele Grüße,
Philipp
Hallo Philipp,
könntest du noch kurz ausgeben und hier posten, was für eine Kontextklasse du im FSM-Fall bekommst?
Beste Grüße
Stefan
Hallo Stefan,
ich befinde mich da im GenerationContext.
Die Klasse lautet: de.espirit.firstspirit.generate.SiteProduction
Ich gehe mal davon aus, dass du den context aus der Map, die der execute-Methode übergeben wird, meinst.
Vielleicht noch zum Hintergrund:
Die CMS_INPUT_COMBOBOX mit dem Namen "pt_product_range" ist eine Eingabekomponente einer Seite, die bei der Generierung Informationen zu einer bestimmten product_range in Form von JSON bereitstellen soll. Der Inhalt der JSON Datei wird im HTML Kanal der Seite über ein Script aufruf ($CMS_RENDER(script:...)$) bewerkstelligt. Dieses Script ruft die FSM Klasse auf, dessen Log-Ausgaben im o.g. Beispiel zu sehen sind.
Viele Grüße,
Philipp
Ok, auf den Kontext hätte ich auch selbst kommen können, Lesen hilft
Allerdings sehe ich aktuell (im Code) nicht, wieso die Option anders aufgelöst wird. Interessant wäre vielleicht noch die Klasse des FormData-Objekts. Eventuell übersehe ich irgendwo eine Sonderbehandlung.
Alles gut (das übliche Wald-lauter-Bäume-Problem, kenn ich nur zu gut )
Habe mal die Klassen für das FormData und das FormField Objekt rausgesucht:
FSM-Fall:
context.logInfo("FormData Class:" + context.getPage().getFormData().getClass());
context.logInfo("FormField Class:" + context.getPage().getFormData().get(language, "pt_product_range").getClass());
INFO 13.07.2015 11:47:55.958{g-node=266289} (de.espirit.firstspirit.generate.SiteProduction): FormData Class:class de.espirit.firstspirit.store.access.DataWrappingFormData
INFO 13.07.2015 11:47:55.958{g-node=266289} (de.espirit.firstspirit.generate.SiteProduction): FormField Class:class de.espirit.firstspirit.store.access.DataWrappingFormData$EditorValueWrappingFormField
Im BeanShell-Fall:
bsh % e.getFormData();
<de.espirit.firstspirit.store.access.DataWrappingFormData@8b11c8e1>
bsh % e.getFormData().get(e.getProject().getMasterLanguage(), "pt_product_range");
<de.espirit.firstspirit.store.access.DataWrappingFormData$EditorValueWrappingFormField@1d1ba6>
Also aus meiner Sicht nichts auffälliges.
Viele Grüße,
Philipp
Nun, auch bei abgesäbeltem Wald sieht man die Bäume nicht mehr. Sehr verwirrend. Gleicher Ausgangspunkt, gleiche Klassen. :smileyconfused:
Könnte ein Fehler sein.
Hallo Stefan,
ich hab da mal ein Ticket angelegt:
https://helpdesk.e-spirit.com/requests/18583
Unabhängig von dem Fehler, der Workaround wäre ja dann über die FS-ID bzw. GUID an die Entity zu kommen. Der schnellste Weg der mir einfällt wäre über eine Session eine Query zu erstellen um dann direkt auf die GUID oder FS-ID abzufragen, korrekt?
Grüße,
Philipp
Hi Philipp,
wenn du eine GID bekommst und den EntityType hast (zumeist über das passende TableTemplate), kannst du direkt über die Session eine Anfrage mittels find(type, uuid) starten. Ansonsten wohl eine Query bauen, ja.
Beste Grüße
Stefan