jan
I'm new here

Zugriff auf DataValue

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.

8 Replies
gockel
Crownpeak employee

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.

0 Kudos

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.

0 Kudos
gockel
Crownpeak employee

Was für eine Fehlermeldung erhalten sie denn, wenn sie das Template-Debugging einschalten ($CMS_SET(#global.debugMode, true)$)?

0 Kudos

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.

0 Kudos
gockel
Crownpeak employee

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.

0 Kudos
jan
I'm new here

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.

0 Kudos
gockel
Crownpeak employee

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$
0 Kudos