Search the FirstSpirit Knowledge Base
Hallo Community,
bin am Verzweifeln.
Ich habe eine Checkbox in einer Absatzvorlage mit der ich Nachrichtenziele auswähle
<CMS_INPUT_CHECKBOX name="cs_target" gridWidth="3" sortOrder="ascending" useLanguages="no">
<CMS_INCLUDE_OPTIONS type="database">
<LABELS>
<LABEL lang="*">#item.name</LABEL>
</LABELS>
<TABLE>FSStoinside.news_types</TABLE>
</CMS_INCLUDE_OPTIONS>
<LANGINFOS>
<LANGINFO lang="*" label="Show ONLY news of the following types (optional)"/>
<LANGINFO lang="DE" label="NUR folgende Nachrichtenart anzeigen (optional)"/>
</LANGINFOS>
</CMS_INPUT_CHECKBOX>
Wie kann ich die ausgewählten Ziele in einem contentSelect filtern?
Habe es bisher nur über über den filter in CMS_FOR() geschafft. Möchte es aber gerne im contentSelect abbilden.
<CMS_HEADER>
<CMS_FUNCTION name="contentSelect" resultname="fr_st_news">
<CMS_PARAM name="schema" value="FSStoinside" />
<CMS_VALUE_PARAM name="set_category" value="st_category.value.vkorg" />
<CMS_VALUE_PARAM name="set_target" value="cs_target" />
<QUERY entityType="news">
<FILTERPARAM parameter="set_category" datatype="java.lang.String" />
<FILTERPARAM parameter="set_target" datatype="java.lang.String" />
<ORDERCRITERIA attribute="start_date" descending="1" />
<ORDERCRITERIA attribute="fs_id" descending="1" />
<AND>
<EQ attribute="news_targetsList.companies.vkorg" parameter="set_category" />
<LIKE attribute="news_targetsList.type" parameter="set_target" />
<EQ attribute="set_online" datatype="java.lang.Boolean" value="true"/>
<LTE attribute="start_date" datatype="de.espirit.common.Now" value="" />
<OR>
<GT attribute="end_date" datatype="de.espirit.common.Now" value="" />
<IS_NULL attribute="end_date" />
</OR>
</AND>
</QUERY>
</CMS_FUNCTION>
</CMS_HEADER>
Danke
Hallo Timo,
ich denke das wird über ein simples ContentSelect nicht funktionieren, da es hier kein "IN" gibt. D.h. man müsste es theoretisch abbilden über eine "dynamische Anzahl von ORs" - was im ContentSelect nicht möglich ist. Falls die Anzahl der möglichen Werte fix ist, könnte man hier noch versuchen, über eine Kombination von Parameterpaaren "BerücksichtigeParameter1 / ParameterWert1" zu tricksen, falls das überhaupt geht wäre es aber keine schöne Lösung.
Hier wäre wohl der beste Weg, mit einem Beanshell-Script (bzw. besser: Executable) zu arbeiten, das die passenden Einträge per API abfragt (in der API gibt es nämlich ein IN) und zurückliefert.
Das "Zurückliefern" kannst Du hier über ein im Template definiertes "Container-Objekt" erledigen, in diesem Fall am besten eine Liste:
$CMS_SET(set_result,[])$
$CMS_RENDER(script:"my_query_script",
schema:"FSStoinside",
category:st_category.value.vkorg,
... //weitere parameter auf denen das Script arbeiten soll
targets: set_target //ggf. noch per Lambda in ein nutzbares Format bringen
resultList:set_result //container zur Rückgabe übergeben
)$
Im Script / Executable kannst Du dann per API (createSelect, setConstraint etc.) die Abfrage machen und die Ergebnisse in die übergebene Liste legen, ganz grob etwa so:
// session holen, select zusammenbauen...
results = session.executeQuery(select);
resultList.addAll(results);
return "";
Dann sollte das Ergebnis im Template zur Verfügung stehen:
$CMS_FOR(for_entry, set_result)$
...
$CMS_END_FOR$
Viele Grüße
Michael
Hallo Timo,
ich habe mal ein kleines Beispiel für dich herausgesucht, ich hoffe das hilft dir weiter:
<CMS_INPUT_COMBOBOX name="st_category" singleLine="no">
<CMS_INCLUDE_OPTIONS type="database">
<LABELS>
<LABEL lang="*">#item.name</LABEL>
</LABELS>
<TABLE>trainer.categories</TABLE>
</CMS_INCLUDE_OPTIONS>
<LANGINFOS>
<LANGINFO lang="*" label="Limit to:"/>
<LANGINFO lang="DE" label="Beschränken auf:"/>
</LANGINFOS>
</CMS_INPUT_COMBOBOX>
<CMS_FUNCTION name="contentSelect" resultname="fr_newsList">
<CMS_VALUE_PARAM name="category" value="st_category.value.id"/>
<CMS_PARAM name="schema" value="trainer" />
<QUERY entityType="News" limit="4">
<FILTERPARAM datatype="java.lang.Long" parameter="category" value="-1"/>
<ORDERCRITERIA attribute="date" descending="1" />
<EQ attribute="category.fs_id" datatype="java.lang.Long" parameter="category"/>
</QUERY>
</CMS_FUNCTION>
Hallo Martin,
danke für das Beispiel.
Mit einer COMBOBOX bekomme ich es hin. Ich habe allerdings ein CHECKBOX Formular.
Das scheint so nicht zu funktionieren.
Ich hab es jetzt nicht getestet aber laut API müsste es funktionieren.
Zitat: "Zusätzlich können bei der Verwendung in der Datenquellen-Verwaltung mit dem allgemeinen Tag CMS_INCLUDE_OPTIONSDatenbankinhalte in der Eingabekomponente dargestellt werden."
Siehe:
http://www.e-spirit.com/odfs52/vorlagenentwicklung/formulare/eingabekomponenten/checkbox/
http://localhost:8000/help/odfs/vorlagenentwicklung/formulare/eingabekomponenten/combobox/index.html
Liebe Grüße
Martin
Hallo Timo,
benötigst Du noch weitere Hilfe oder haben Dir die Antworten von Martin bereits geholfen? In diesem Fall wäre es super, wenn Du die "richtige Antwort" entsprechend markierst, damit auch andere Community-Teilnehmer diese auf den ersten Blick finden. Solltest Du zwischenzeitlich eine eigene Lösung gefunden haben, wäre es nett, wenn Du diese hier bereitstellst.
Viele Grüße
Marian
Hallo Marian,
leider habe ich es immer noch nicht hinbekommen.
Gibt es den keine Möglichkeit Werte aus einem CMS_INPUT_CHECKBOX in einem contentSelect abzufragen? Ich glaube mein Problem wurde noch nicht so richtig verstanden.
Viele Grüße
Timo
Hallo Timo,
ich denke das wird über ein simples ContentSelect nicht funktionieren, da es hier kein "IN" gibt. D.h. man müsste es theoretisch abbilden über eine "dynamische Anzahl von ORs" - was im ContentSelect nicht möglich ist. Falls die Anzahl der möglichen Werte fix ist, könnte man hier noch versuchen, über eine Kombination von Parameterpaaren "BerücksichtigeParameter1 / ParameterWert1" zu tricksen, falls das überhaupt geht wäre es aber keine schöne Lösung.
Hier wäre wohl der beste Weg, mit einem Beanshell-Script (bzw. besser: Executable) zu arbeiten, das die passenden Einträge per API abfragt (in der API gibt es nämlich ein IN) und zurückliefert.
Das "Zurückliefern" kannst Du hier über ein im Template definiertes "Container-Objekt" erledigen, in diesem Fall am besten eine Liste:
$CMS_SET(set_result,[])$
$CMS_RENDER(script:"my_query_script",
schema:"FSStoinside",
category:st_category.value.vkorg,
... //weitere parameter auf denen das Script arbeiten soll
targets: set_target //ggf. noch per Lambda in ein nutzbares Format bringen
resultList:set_result //container zur Rückgabe übergeben
)$
Im Script / Executable kannst Du dann per API (createSelect, setConstraint etc.) die Abfrage machen und die Ergebnisse in die übergebene Liste legen, ganz grob etwa so:
// session holen, select zusammenbauen...
results = session.executeQuery(select);
resultList.addAll(results);
return "";
Dann sollte das Ergebnis im Template zur Verfügung stehen:
$CMS_FOR(for_entry, set_result)$
...
$CMS_END_FOR$
Viele Grüße
Michael
Hallo Michael,
ich habe es fast geschafft. Einzig die Abfrage mit IN fehlt mir noch. Wie mache ich eine Abfrage auf ein Fremdschlüssel-Attribut?
Die Werte der Checkbox (st_targets) übergebe ich dem Script.
$CMS_RENDER(script:"news_query_script",
targets:st_targets,
now:#global.now,
resultList:set_result
)$
Habe es so versucht. Leider ohne Ergebnisse.
In in_targets = new In("news_targetsList",targets);
Viele Grüße
Timo
Hallo Timo,
news_targetsList ist hier das "zu-n"-Attribut, richtig? Das st_targets ist ja hier ein Set<Option> - das wird man hier nicht direkt verwenden können, da ja auf die "echten" Objekte (in der Option) geprüft werden muss, ggf. auch über deren ID.
Versuch mal etwas in dieser Richtung:
In in_targets = new In("news_targetsList.type",targets.map(x->x.value)); // oder
In in_targets = new In("news_targetsList.type.fs_id",targets.map(x->x.value.getValue("fs_id")));
Ich bin mir hier allerdings nicht sicher, ob das so direkt geht weil (wenn ich es richtig verstehe) hier auch "auf der linken Seite" (an den News?) mehrere targets vorhanden sein können...
Viele Grüße
Michael
Hallo Michael,
Danke für die schnelle Antwort. Das hat mir geholfen.
Im Template ist es nun so:
$CMS_SET(set_result,[])$
$CMS_RENDER(script:"news_query_script",
targets:st_targets.map(x->x.value.getValue("fs_id")),
now:#global.now,
resultList:set_result
)$
Im Script:
In in_targets = new In("news_targetsList.fs_id",targets);