ckohl
I'm new here

'instance of'-Prüfung in Templates

Hallo zusammen,

im Zusammenhang mit einer bevorstehenden Migration versuche ich gerade innerhalb eines Projektes, die Verwendung interner FS-Klassen zugunsten von Klassen der Access API auszumerzen.

Beispiel: anstelle der internen Klasse 'de.espirit.firstspirit.store.access.pagestore.SectionImpl' möchte ich die API-Klasse "de.espirit.firstspirit.access.store.pagestore.Section" verwenden.

Leider wimmelt es in dem Projekt vor IF-Verzweigungen derart, dass auf eine bestimmte interne Klasse geprüft wird.

Bsp.: $CMS_IF(set_section.getClass().toString().equals("de.espirit.firstspirit.access.store.pagestore.SectionImpl"))$ .......

Wenn ich hier stattdessen die API-Klasse Section verwenden möchte, müsste ich also eine InstanceOf-Prüfung machen - das funktioniert offenbar innerhalb von Templates nicht. Ich habe außerdem das folgende Konstrukt verucht:

$CMS_IF(class("de.espirit.firstspirit.store.access.pagestore.Section").isInstance(set_section))$

Ebenfalls ohne Erfolg. :smileyplain:

Kennt jemand von euch einen Weg, dieses Problem zu lösen?

Viele Grüße

Christoph

7 Replies
der_sk
I'm new here

Hallo Christoph,

es geht noch einfacher. Schau dir mal die Methode "getElementType()" vom IDProvider an, die gibt dir Strings zurück (z.B. "Page", "Section", "SectionReference", etc.). Das dürfte nicht nur einfacher sondern auch schneller sein.

Viele Grüße

Sascha

Hallo Sascha,

danke. Das hat mir schonmal sehr geholfen. Hast du zusätzlich vielleicht auch noch eine Idee, wie ich nur mithilfe der Access-API 'TargetReferenceImpl'-  und 'GraphicalMediumImpl'- Objekte auseinanderhalten kann?

Viele Grüße

Christoph

0 Kudos

Hallo Christoph,

ich vermute, dass du an einigen Stellen noch veraltete Formaule verwendest und dort statt Referenz noch mit Picture gearbeitet wird. Kannst du die Eingabekomponenten nicht aktualisieren? Das müsste in diesem Falle problemlos funktionieren und dann hättest du das Problem nicht mehr.

Wenn das für dich wirklich keine Option ist, habe ich nur einen relativ unschönen Weg, wie du das mit API-only lösen kannst: Du könntest dir den Klassennamen holen und mit startsWith() schauen, ob du das den beiden Klassen zugehörige Interface hast oder nicht. Die beiden Interfaces wären TargetReference und GraphicalMedium. Also sowas wie startsWith("TargetReference").

Grüße,

Hannes

0 Kudos

Hallo Christoph,

ich muss mich nochmal korrigieren - die von mir genannte Lösung mit dem startsWith birgt natürlich das Risiko, dass die Implementiernde Klasse das Namensschema ändert - in diesem Falle hättest du nicht viel gewonnen.

Eine vielleicht bessere Alternative wäre ein Renderskript zu verwenden. Suche hierzu in der Hilfe nach "CMS_RENDER". Im Skript könntest du dann instanceof verwenden und könntest damit die Ausgabe steuern. Gib uns mal Bescheid, ob dir das im vorliegenden Fall weiterhilft.

Grüße,

Hannes

0 Kudos
MichaelaReydt
Community Manager

Hallo Christoph,

benötigst du noch weitere Hilfe oder dir die bisherigen Antworten bereits geholfen? In diesem Fall wäre es super, wenn du die "richtige Antwort" entsprechend markierst.

Solltest du zwischenzeitlich eine eigene Lösung gefunden haben, wäre es toll, wenn du diese hier bereitstellst.

Viele Grüße

Michaela

0 Kudos
hbarthel
New Responder

Hallo,

mich haben die zig Klassennamenvergleiche (die ja die konkrete Impl. abfragen und damit weit weg von dem sind, was e-Spirit als API bezeichnet), die von unseren Vorgängern im Projekt hinterlassen wurden, auch genervt. Noch schlimmer gehts auch: myFor2.getClass().toString().trim().contains("Dataset")

Meine Lösung ist ein FS-Skript "sc_instanceof":

return java.lang.Class.forName(className).isInstance(object);

Verwendung:

$CMS_SET(set_isGenerationContext)$$CMS_RENDER(script:"sc_instanceof", object:#global, className:"de.espirit.firstspirit.access.GenerationContext")$$CMS_END_SET$

$CMS_SET(set_isGenerationContext, "true".equals(set_isGenerationContext.toString().trim()))$

$CMS_IF(set_isGenerationContext)$

    Wir sind in einem GenerationContext.

$CMS_END_IF$

Vielleicht hilft's wem.

So long, Heiko

0 Kudos

Hallo,

eine instanceof-Prüfung kann man seit einiger Zeit auch sehr viel einfacher machen, und zwar mit isCase:

$CMS_IF(class("de.espirit.firstspirit.access.store.pagestore.Page").isCase(someVar))$

... entspricht einem

if(someVar instanceof Page)

Siehe auch hier: Online Dokumentation FirstSpirit - class(...)

Viele Grüße

Michael