Questions & Answers

SOLVED
mseyfarth
Elite Observer

Selbst definierte Java Objekte im CMS verwenden?

Jump to solution

Hallo zusammen,

ich habe zwar schon mal in der Community gesucht, bin aber zu keinem Ergebnis gekommen, daher die Frage hier.

Ist es mรถglich dem CMS selbst definierte Objekte beizubringen?

Beispiel:

Ich man definiere in Java eine neue Klasse

public class Mensch {

private int alter;

private long hoehe;

private String vorname;

private String nachname;

// Getter & Setter

// toString

// whatever

}

}

รœber ein Modul wird ein Objekt erzeugt und mit Werten befรผllt, welches im Anschluss an das CMS รผbermittelt wird.

Kann ich im CMS irgendwie auf das Objekt mit den Werten zugreifen alร 

mein_cms_objekt.getAlter();

$CMS_VALUE(mein_cms_objekt.getAlter())$

??

Kann man das definierte Model als Dependency (oder direkt รผber das Modul) anziehen, sodass das CMS weiรŸ, ok dieses Objekt ist vom Objekttyp "Mensch" und hat alle diese Attribute (auch interessant fรผr Debugger).

Wenn das schon irgendwie geht. lasst mich das bitte wissen, weil wir uns immer extrem abmรผhen alles in eine Map<String,String> zu kapseln, das wir spรคter auf die Werte zugreifen kรถnnen.

Verwendete FS Version 2018-8

Danke und GruรŸ

Matthias

0 Kudos
1 Solution

Accepted Solutions

Hi Matthias,

du kannst im Template auf die Eigenschaften des Java-Objekts "ganz normal" zugreifen. Also in deinem Beispiel kannst du sowohl $CMS_VALUE(mensch.getAlter())$ als auch verkรผrzt $CMS_VALUE(mensch.alter)$ benutzen. Voraussetzung ist natรผrlich das die Klasse Mensch eine รถffentliche Methode "getAlter()" hat.

LG, Peter

Peter

View solution in original post

0 Kudos
7 Replies
mbergmann
Crownpeak employee

Hallo Matthias,

suchst Du sowas hier?

Rรผckgabe einer Datenstruktur von einem Executable in ein Template

Viele GrรผรŸe

Michael

0 Kudos

Hallo Michael,

jain.

Was ich vermeiden mรถchte, ist in einem Executable oder in einem einfachen Modul, welches irgendeinen Service aufruft,

dass wir im Modul ein manuelles Mapping der Daten durchfรผhren mรผssen, Bsp.

  1. ... 
  2. Map<String, Object> result = (Map<String,Object>) params.get("result"); 
  3. ... 
  4. result.put("someKey", someResultObject); 
  5. result.put("anotherKey", anotherResultObject); 
  6. ...
  7. return result;

Sondern, das wir aus dem Beispiel oben, das ganze Objekt "Mensch" zurรผckgeben und verwenden kรถnnen.

Wenn man ein neues Modul entwickelt, wird jeder halbwegs gescheite Java Entwickler Klassen (Models) definieren, mit dem er Objekte erzeugt und mit diesen dann arbeitet.

Meine Frage nun nochmal spezifiziert: Wenn das Modul im Firstspirit Server installiert wird, kann ich dann diese Objekte vom Typ "Mensch", "Human", "Car", was_auch_immer_fรผr_ein_java_Objekt_ich_definiere im CMS verwenden?

Bsp:

Im Template:

$CMS_SET(set_mensch,"Modulname.Mensch.class")$  // definiere Typ der Variable als Mensch aus dem Modul

$CMS_RENDER(script:"some_script_name", result:set_mensch)$ 

$-- und dann z.B. sowas: --$ 

$CMS_VALUE(result.someMethod())$ // result ist jetzt vom Typ "Mensch", welches aus dem Modul zurรผckgegeben wird

Im Modul:

Mensch mensch = new Mensch();

... 

mensch.setAbc(abc);

mensch.setDef(def);

...

return mensch;

Java ist eine OOP. Derzeit empfinde ich aber, dass das CMS dieses Konzept missachtet.

Ausgenommen alle Objekte, die Java nativ mitbringt.

Hinweis:

Ein Executable ist evtl. ein schlechtes Beispiel, da hier die Signatur fest definiert wird auf Map<String, Object>.

Aber ein eigenes Modul kann ja zurรผck geben, was wir definieren.

Hoffe das ist etwas verstรคndlicher

GruรŸ

Matthias

0 Kudos

Hi Matthias,

du kannst im Template auf die Eigenschaften des Java-Objekts "ganz normal" zugreifen. Also in deinem Beispiel kannst du sowohl $CMS_VALUE(mensch.getAlter())$ als auch verkรผrzt $CMS_VALUE(mensch.alter)$ benutzen. Voraussetzung ist natรผrlich das die Klasse Mensch eine รถffentliche Methode "getAlter()" hat.

LG, Peter

Peter
0 Kudos

Hallo Matthias,

wichtig zu wissen ist hier noch: Der "Umweg" รผber das Executable ist hier nur nรถtig, damit man die Klassen im Modul-Scope lassen kann. Das Executable (aufgerufen per Renderscript) dient hier nur als Zwischenstation, weil Executables eine "Sonderrolle" haben und - solange sie als PUBLIC-Komponente in der Module.xml deklariert sind - รผber den #executable-class-Mechanismus auch aufgerufen werden kรถnnen, wenn ihre Ressourcen im Modul-Scope liegen. Du muss dann dem Executable aus dem Template heraus nur eine leere Map (oder Liste) mitgeben. In diese Liste legt dann das Executable ein beliebiges Objekt hinein und im Template holst Du es Dir wieder heraus.

Ich hoffe das macht es etwas klarer ๐Ÿ˜‰

Viele GrรผรŸe

Michael

0 Kudos

Hallo Peter,

Und das funktioniert, sobald ich das CMS-Modul, welches diese Klassen beinhaltet installiert habe?

Rafft das dann eigentlich auch der Debugger, dass das zurรผckgegebene Objekt von diesem Typ ist (inkl Autocomplete / Vorschlรคge)?

GruรŸ

Matthias

0 Kudos

Ja, das funktioniert auch im Debugger - da ist ja dann die konkrete Klasse bekannt. Daher ist es an der Stelle egal, das das Executable "untypisiert" ist.

Peter
0 Kudos

Vielen Dank Euch beiden!

Mein Kollege und ich werden das in den nรคchsten Tagen mal testen.

Jedoch werde ich den Thread als beantwortet kennzeichnen

GruรŸ

Matthias

0 Kudos

Type a product name