Juncus
Returning Observer

Abfrage auf Datenquelle mit Filterparam aus Element CMS_INPUT_CHECKBOX

Hallo Community,

ich habe eine Frage zur Nutzung einer Abfrage auf eine Datenquelle.
Die Datenquelle enthält einzelne Newsbeiträge als Datensätze. Diese Newsbeiträge können anhand eines  Formularelements vom Typ CMS_INPUT_CHECKBOX nochmal verschiedenen Typen von Newsbeiträgen zugeordnet werden (Pressemeldung value: pm, News, value: nr).

Der Inhalt dieser Checkbox wird in das Datensatzfeld 'formats' geschrieben.
Nun will ich eine Abfrage auf die Datenquelle (Name: news) bauen in der nur Datensätze angezeigt werden in denen der Typ 'News' (value: nr) angeklickt ist. Datensätze die nur als Pressemeldung (value: pm) gekennzeichnet sind sollen nicht ausgegeben werden.

Dies probiere ich über eine Abfrage im Definitionsmodus 'Quelltext'
<QUERY entityType="news">
<FILTERPARAM parameter="formats" datatype="java.util.List"/>
<EQ attribute="formats" parameter="Format"/> ???
</QUERY>

Hier bin ich mir nicht sicher ob der Datatype java.util.List so stimmt und mit welcher Abfrage ich auf den Wert für News abfragen könnte.
Überlegungen:
Bräuchte ich ein Contains auf den String der Liste ? Wie kann ich dies dann in der Syntax schreiben?
Kann ich irgendwie eine Abfragebedingung auf den Datatype Option (Checkbox) machen?
Gibt es eine Möglichkeit über eine Abfrage nur die als News gekennzeichneten Datensätze ausgeben zu lassen.

Hatte hier schonmal jemand ein ähnliches Problem?
Für Hilfe und Tips wäre ich sehr dankbar.

Eine Lösung wäre sicherlich für viele Programmierer interessant, die ein Formularelement vom Typ 'Option'   (z.B.CMS_INPUT_CHECKBOX  oder cms_input_radiobutton) in einer Tabellenvorlage verwenden und dann einen Filter dazu benötigen.

 

0 Kudos
2 Replies
hoebbel
Crownpeak employee

Hallo Juncus,

ich fange mal mit ein paar Hintergrundoptionen an. Wenn eine CMS_INPUT_CHECKBOX in ein Datenbankfeld geschrieben wird, so ist dieses normalerweise vom Typ FirstSpirit Editor (die Sonderfälle, dass das irgendwie einen anderen Feldtyp gemappt wurde, ignoriere ich hier mal).
Das bedeutet, dass in der Datenbank der Wert als XML gespeichert wird. Wobei die Datenbank das Ganze als String behandelt. (der exakte Typ der Spalte hängt davon ab, wie ein [üblicherweise bis zu 64kB großer] String in der jeweiligen Datenbank gespeichert wird). 
In dem XML, dass gespeichert wird, stehen viele zusätzliche Informationen, die schnell dazu führen können, dass der Versuch, entsprechende Daten abzufragen, zu unerwarteten Ergebnissen führt. Das Ganze sieht ungefähr so aus:
<CMS_VALUE name="tt_news"><LANG id="DE" set="1"><SEL><VALUE>pm</VALUE><VALUE>nr</VALUE></SEL></LANG></CMS_VALUE>
Man könnte nun versuchen, eine Abfrage zu machen, die auf einen Teilstring (in diesem Fall "pm" oder "nr") des Strings abfragt. Aber das ist weder performant noch empfehlenswert!
Besser wäre es, statt dessen eine Fremdschlüsselbeziehung zu einer weiteren Tabelle anzulegen, in der die Optionen stehen, die in der CMS_INPUT_CHECKBOX (oder COMBOBOX, RADIOBUTTON) angezeigt werden sollen. In diesem Fall wäre das eine N:M Beziehung, bei den beiden anderen Eingabekomponenten eine 1:N Beziehung.
Die möglichen Optionen bekommt man jeweils über <CMS_INCLUDE_OPTIONS type="DATABASE">. Man kann dann problemlos eine Abfrage erstellen, die alle Datensätze zurückgibt, die über die entsprechende Fremdschlüsselbeziehung die gewünschte Option ausgewählt haben. 
Und wenn man will, kann man auf den Datensätzen für die Optionen noch eine Eingabekomponente anzeigen lassen, die die Rückrichtung visualisiert (z.B. FS_INDEX).

Viele Grüße
Holger

0 Kudos
Juncus
Returning Observer

Hallo Holger,
danke für deine schnelle und ausführliche Beantwortung meiner Frage.
Viele Grüße v.
Juncus

0 Kudos