Search the FirstSpirit Knowledge Base
Hallo zusammen,
ich frage in einer Seite auf das vorhandesein eines bestimmten Absatzes ab,
im positiven Fall speichere ich mir den Absatz als Objekt in cs_element.
Der Absatz ist eine Absatzliste mit beliebig vielen Absätzen und ist in
einem Contentsharing-Projekt (enthält nur die Datenquellen) gespeichert.
Dort liegen die in der Liste
aufgeführten Absätze als kompletter Block in einem Datensatz vor.
Die Eingabekomponente ist:
<CMS_INPUT_CONTENTLIST
name="absatzliste"
table="contentsharing@ContentSharing.gauss_info_content"
useLanguages="yes">
<LANGINFOS>
<LANGINFO lang="*" label="absatzliste" description="absatzliste"/>
</LANGINFOS>
</CMS_INPUT_CONTENTLIST>
$CMS_FOR(elem, #global.page.body("Hauptbereich").getChildren())$
$CMS_IF(elem.getTemplate().getTemplateId() == 2731426)$
$CMS_SET(containsCS,"1")$
$CMS_SET(cs_element, elem)$
$CMS_END_IF$
$CMS_END_FOR$
In der Seite möchte ich jetzt die ID des Datensatzes ausgeben, der im
Contensharing-Projekt die Absätze enthält.
Dazu lasse ich mir dieses Konstrukt ausgeben:
$CMS_IF(containsCS.equals("1"))$
$CMS_SET(cs_id)$$CMS_VALUE(cs_element.getData().get("absatzliste"))$$CMS_END_SET$
$CMS_VALUE(cs_id)$
$CMS_END_IF$
Dies bekome ich als Ausgabe im Quelltext der Webseite
<CMS_VALUE name="absatzliste">
<LANG id="DE" set="1">
<LIST
table="gauss_info_content"
template="contentsharing@ContentSharing.gauss_info_content">
<VALUE>
<KEY_VALUE
class="java.lang.Integer">5467</KEY_VALUE>
</VALUE>
</LIST>
</LANG>
</CMS_VALUE>
Mein einziges Problem besteht jetzt darin, dass ich gerne die Zahl 5467 aus
der xml-Struktur herausgelöst haben möchte.
Ich komme aber nicht darauf, wie ich dem Objekt (DataValue - zumindest
glaube ich das), den Wert aus KEY_VALUE entlocke.
Hallo,
mit
$CMS_VALUE(cs_element.getData().get("absatzliste").get(#global.language))$
erhalten sie den Persistenztyp der CMS_INPUT_CONTENTLIST für die aktuell erzeugte Sprache. Dies ist eine Liste von Entity (siehe ODFS, API). Über diese Liste müssen sie dann mit $CMS_FOR$ iterieren und entsprechende Methoden auf dem Entity aufrufen.
Die verfügbaren Methoden sollten diese sein.
Das klappt leider nicht, dabei kommt offenbar nichts verwertbares mehr raus, es wird mir auch keine Klasse mehr zu dem Objekt angegeben. Die Liste, die rauskommt, sollte ja diese sein:
<LIST
table="gauss_info_content"
template="contentsharing@ContentSharing.gauss_info_content">
<VALUE>
<KEY_VALUE
>5467</KEY_VALUE>
</VALUE>
</LIST>
aber an die komme ich nicht richtig dran.
Was für eine Fehlermeldung erhalten sie denn, wenn sie das Template-Debugging einschalten ($CMS_SET(#global.debugMode, true)$)
?
Da kommt das:
18.10.2010 13:02:28.416 WARN ($CMS_VALUE(cs_element.getData().get("absatzliste").get(#global.language))$ at 184, 19): Replacing null value with empty default! Undefined method 'de.espirit.firstspirit.store.access.DataValueImpl#get(de.espirit.firstspirit.server.projectmanagement.LanguageImpl)'!
Das Template-Debugging war aber schon mal sehr hilfreich, damit kann ich jetzt all die anderen Methoden, die man auf das Objekt absetzen kann, durchtesten.
O.K. mein Fehler. Hier fehlte noch ein #getEditor()
$CMS_VALUE(cs_element.getData().get("absatzliste").getEditor().get(#global.language))$
Ok, das klappt soweit:
$CMS_VALUE(cs_element.getData().get("absatzliste").getEditor().get(#global.language).class)$ => de.espirit.common.event.NotifyingList (zu der schweigt sich die API-Dokumentation allerdings aus)
$CMS_SET(cs_ids)$$CMS_VALUE(cs_element.getData().get("absatzliste").getEditor().get(#global.language))$$CMS_END_SET$
[$CMS_VALUE(cs_ids.class)$] => de.espirit.firstspirit.parser.impl.TemplateDocumentImpl
Die Schleife funktioniert allerdings gar nicht:
Cannot iterate over: class de.espirit.firstspirit.parser.impl.TemplateDocumentImpl
$CMS_FOR(cs_id, cs_ids)$
-- $CMS_VALUE(cs_id.FS_ID)$ --
$CMS_END_FOR$
Wenn ich mir den Inhalt von $CMS_VALUE(cs_element.getData().get("absatzliste").getEditor().get(#global.language))$ ausgeben lasse, dann bekomme ich das raus: de.espirit.or.impl.EntityImpl@fb1f38ee{gauss_info_content,PERSISTENT,released,FS_ID=4992,FS_VALID_FROM=1249550594272,FS_VALID_TO=9223372036854775807,FS_RELEASE_TO=9223372036854775807
Klingt eigentlich gut, nur wenn ich darauf jetzt mit Methoden der OR-Schicht darauf zugreifen möchte, klappt das nicht. Die NotifiyingList scheint keinerlei Methoden zu haben, die irgendetwas ausgeben können.
Ich hab das Problem jetzt zwar nicht gelöst, aber "umgangen", indem ich das Objekt in einen String gewandelt habe und darin die benötigte Stelle rausfische. Für den Zweck, für den ich das benötige ist das Verfahren völlig ausreichend.
Hallo,
indem ich das Objekt in einen String gewandelt habe und darin die benötigte Stelle rausfische.
Für den Zweck, für den ich das benötige ist das Verfahren völlig ausreichend.
das würde ich allein schon aus Performancegründen vermeiden wollen.
Ich denke das Problem ist die Verwendungsart von $CMS_SET
$CMS_SET(cs_ids)$
$CMS_VALUE(cs_element.getData().get("absatzliste").getEditor().get(#global.language))$$CMS_END_SET$
Mit dieser Notation steht in der Variable "cs_ids" nur ein Vorlagenfragment zur Verfügung. (Vergl. auch die Hinweise zu $CMS_SET).
Sie sollten den Wert der Liste aber sofort mit $CMS_FOR weiterverarbeiten können:
$CMS_FOR(entity, cs_element.data.get("absatzliste").editor.get(#global.language))$
// notwendige Methoden für jeden Eintrag vom Typ Entity aufrufen
// z.B.
Wert von Spalte 'X'=$CMS_VALUE(entity.getValue("X"))$;
// bzw. in der Kurzform
Wert von Spalte 'X'=$CMS_VALUE(entity.X))$;
$CMS_END_FOR$