TimoMeister
Returning Responder

contentSelect + CMS_INPUT_CHECKBOX

Jump to solution

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

1 Solution

Accepted Solutions

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

View solution in original post

0 Kudos
9 Replies
mikula
Crownpeak employee

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>

0 Kudos

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.

0 Kudos

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

0 Kudos

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

0 Kudos
TimoMeister
Returning Responder

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

0 Kudos

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

0 Kudos
TimoMeister
Returning Responder

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

0 Kudos

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

TimoMeister
Returning Responder

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);

0 Kudos