Questions & Answers

SOLVED
gofur
I'm new here

Scripting: Zugriff auf die Werte einer CMS_INPUT_CHECKBOX

Jump to solution

Hallo,

Wir speichern fรผr ein Element in einer Datenquelle รผber ein Eingabeformular Checkbox-Werte. Dieses Eingabeelement ist รผber eine CMS_INPUT_CHECKBOX, die 20 Werte aus einer anderen Datenquelle erhรคlt, realisiert:

<CMS_INPUT_CHECKBOX name="cs_countrylist" gridWidth="3" hFill="yes" useLanguages="no">

        <CMS_INCLUDE_OPTIONS type="database">

          <LABELS>

            <LABEL lang="*">#item.name</LABEL>

          </LABELS>

          <TABLE>xxx.cs_country</TABLE>

        </CMS_INCLUDE_OPTIONS>

        <LANGINFOS>

          <LANGINFO lang="*" label="xxx"/>

        </LANGINFOS>

</CMS_INPUT_CHECKBOX>

Der Anwender sieht im FS-Client also 20 Checkboxen, die er an- bzw. abhaken kann. Neben der Initialbefรผllung mรถchten wir aus Convenience-Grรผnden nun per Script รผber das Kontextmenรผ eine Funktion anbieten, um fรผr einen Datenquelleneintrag alle Checkboxen an- bzw. alle abzuhaken. In der Developer-Doku finde ich zwar ein API-Beispiel (CheckboxEditorValueExample), dies bringt mich auf Script-Ebene leider nicht weiter, da ich nicht weiรŸ, wie ich รผber das Script an das Editor-Objekt gelange. Wahrscheinlich gibt es aber auch eine einfache Mรถglichkeit, per Script alle Hรคkchen zu setzen bzw. wegzunehmen, oder?

Vielen Dank im Voraus und viele GrรผรŸe aus Hamburg

Reza Nazarian

0 Kudos
1 Solution

Accepted Solutions

Puh, so hat es geklappt:

// Retrieve all available countries from the corresponding data source and construct a HashSet of it.

UserService userService = context.getUserService();

ContentStoreRoot contentStore = (ContentStoreRoot) userService.getStore(Store.Type.CONTENTSTORE, false);

Content2 myDataSource = contentStore.getContent2ByName("country");

data = myDataSource.getData();

Set countrySet = new HashSet();

for (int i = 0; i < data.size(); i++) {

    String country = data.get(i).getValue("fs_id").toString();

    countrySet.add(country);

}

// Lock the selected element and check all available countries using the HashSet.

session = myDataSource.getSession();

storeElement = context.getStoreElement();

row = context.getSelectedRow();

dataSet = storeElement.getDataset(row);

currentEntity = dataSet.getEntity();

storeElement.lock(currentEntity);

storeElement.setLock(true, false);

formData = dataSet.getFormData();

formData.get(null, "cs_countrylist").set(countrySet);

dataSet.setFormData(formData);

// Save and unlock the element, commit the changes.

storeElement.save();

storeElement.unlock(currentEntity);

storeElement.setLock(false, false);

session.commit();

"Leider" nur รผber das Kontextmenรผ. รœber einen FS-BUTTON wรคre es noch schรถner, da habe ich aber leider keinen Weg gefunden.

View solution in original post

0 Kudos
11 Replies
Peter_Jodeleit
Crownpeak employee

รœber ein Kontextemenรผ-Skript wird das nicht funktionieren (zumindest nicht in 4.2).

Du willst ja nicht (nur) die Werte modifizieren, sondern die Anzeige in der GUI (und zwar nur, wenn das Formular im Bearbeitungszustand ist).

Das funktioniert รผber FS_BUTTON, was fรผr den Redakteur sogar komfortabler ist, weil dadurch eine Schaltflรคche direkt im Formular an der Komponente eingeblendet werden kann.

Zu dem Thema findest du einiges hier in der Community.

Peter
0 Kudos

Okay, danke. Ich werde dann hier mal weiterschauen.

Aber auch รผber den FS_BUTTON wird doch ein Script aufgerufen, daher muss ich die gleiche Frage nochmals stellen. ๐Ÿ˜‰

0 Kudos

Wie gesagt, dazu gibt es schon Infos hier in der Community. Und auch eine Doku: http://www.e-spirit.com/odfs42/de/vorlagenentwicklung/formular/fs/fs_button/button.html

Community-Diskussion die zu dem Thema passen kรถnnte: Formular nach Klick auf FS_BUTTON aktualisieren

Das Suchfeld fรผr die Community ist รผbrigens oben rechts Smiley Wink

Peter
0 Kudos

Ah! Danke! Aber da oben รผbersieht man es ja so leicht!! Smiley Wink

0 Kudos

So, mit den Beitrรคgen aus dem Forum und dem folgenden Code hรคtte ich eigentlich gedacht, dass es funktioniert. Das tut es aber leider nicht. Wenn ich ein leeres Hashset รผber checkbox.set(countrySet) setze, so werden alle Werte deselektiert. Dies deutet schon mal darauf, dass es grundsรคtzlich zu funktionieren scheint. Wenn ich aber das Hashset mit Werten der verfรผgbaren Checkboxen fรผlle, so tut sich nach dem set() leider nichts.

FS_BUTTON:

<FS_BUTTON

        name="cs_select_country_button"

        allowEmpty="yes"

        hFill="yes"

        noBreak="no"

        onClick="script:select_all_countries"

        style="firstspirit"

        useLanguages="no">

        <LANGINFOS>

          <LANGINFO lang="*" label="Select all countries"/>

        </LANGINFOS>

        <PARAMS>

          <PARAM name="checkbox">#field.cs_countrylist</PARAM>

        </PARAMS>

  </FS_BUTTON>

Script:

//!Beanshell

if (null != element) {

    entity = element.getEntity();

    countrySet = new HashSet();

    countrySet.add("1");

    countrySet.add("0");

    checkbox.set(countrySet);

}

0 Kudos

Hallo Reza,

Folgendes Skript kรถnnte weiterhelfen um alle Werte einer Checkbox zu selektieren:

import java.io.IOException;

import java.util.HashSet;

import java.util.List;

import java.util.Set;

import de.espirit.firstspirit.access.Connection;

import de.espirit.firstspirit.access.ConnectionManager;

import de.espirit.firstspirit.access.UserService;

import de.espirit.firstspirit.access.editor.value.Option;

import de.espirit.firstspirit.access.project.Project;

import de.espirit.firstspirit.access.store.ElementDeletedException;

import de.espirit.firstspirit.access.store.LockException;

import de.espirit.firstspirit.access.store.Store;

import de.espirit.firstspirit.access.store.IDProvider.UidType;

import de.espirit.firstspirit.access.store.contentstore.Content2;

import de.espirit.firstspirit.access.store.contentstore.ContentStoreRoot;

import de.espirit.firstspirit.access.store.pagestore.Body;

import de.espirit.firstspirit.access.store.pagestore.Page;

import de.espirit.firstspirit.access.store.pagestore.PageStoreRoot;

import de.espirit.firstspirit.access.store.pagestore.Section;

import de.espirit.firstspirit.forms.FormData;

import de.espirit.firstspirit.forms.FormField;

import de.espirit.or.schema.Entity;

        String DATASOURCE = "pressreleases";

        String SECTIONNAME="textbildhomepageteaser";

        String CHECKBOXNAME = "cs_countryList";

        String PAGE="mithras_home";

        UserService us2 = context.getUserService();

        PageStoreRoot pageStore = (PageStoreRoot) us2.getStore(

                Store.Type.PAGESTORE, false);

        ContentStoreRoot contentStore = (ContentStoreRoot) us2.getStore(

                Store.Type.CONTENTSTORE, false);

        Content2 myDataSource = contentStore.getContent2ByName(DATASOURCE);

        data = myDataSource.getData();

        opt = new HashSet();

        for (int i = 0; i < data.size(); i++) {

            opt.add(data.get(i).getValue("fs_id").toString());

        }

        Page page = (Page) pageStore.getStoreElement(PAGE, UidType.PAGESTORE);

        Section mySec=(Section) page.getChildByName(Section.class, SECTIONNAME);

        try {

            page.setLock(true);

            FormData d = mySec.getFormData();

            FormField f = d.get(us2.getProject().getMasterLanguage(), CHECKBOXNAME);

            eval = f.get();

            f.set(opt);

            mySec.setFormData(d);

            mySec.save();

            page.release();

            page.setLock(false);

        } catch (LockException e) {

            e.printStackTrace();

        }

und folgendes um alle Werte einer Checkbox zu deselektieren:

import java.io.IOException;

import java.util.HashSet;

import java.util.List;

import java.util.Set;

import de.espirit.firstspirit.access.Connection;

import de.espirit.firstspirit.access.ConnectionManager;

import de.espirit.firstspirit.access.UserService;

import de.espirit.firstspirit.access.editor.value.Option;

import de.espirit.firstspirit.access.project.Project;

import de.espirit.firstspirit.access.store.ElementDeletedException;

import de.espirit.firstspirit.access.store.LockException;

import de.espirit.firstspirit.access.store.Store;

import de.espirit.firstspirit.access.store.IDProvider.UidType;

import de.espirit.firstspirit.access.store.contentstore.Content2;

import de.espirit.firstspirit.access.store.contentstore.ContentStoreRoot;

import de.espirit.firstspirit.access.store.pagestore.Body;

import de.espirit.firstspirit.access.store.pagestore.Page;

import de.espirit.firstspirit.access.store.pagestore.PageStoreRoot;

import de.espirit.firstspirit.access.store.pagestore.Section;

import de.espirit.firstspirit.forms.FormData;

import de.espirit.firstspirit.forms.FormField;

import de.espirit.or.schema.Entity;

      

        String CHECKBOXNAME = "cs_countryList";

        String SECTIONNAME="textbildhomepageteaser";

        String PAGE="mithras_home";

        UserService us2 = context.getUserService();

        PageStoreRoot pageStore = (PageStoreRoot) us2.getStore(

                Store.Type.PAGESTORE, false);

        Page page = (Page) pageStore.getStoreElement(PAGE, UidType.PAGESTORE);

        Section mySec=(Section) page.getChildByName(Section.class, SECTIONNAME);

        try {

            page.setLock(true);

            FormData d = mySec.getFormData();

            FormField f = d.get(us2.getProject().getMasterLanguage(), CHECKBOXNAME);

            eval = f.get();

            f.set(null);

            mySec.setFormData(d);

            mySec.save();

            page.release();

            page.setLock(false);

        } catch (LockException e) {

            e.printStackTrace();

        }

Nach Refresh der Seite sollten je nach aufgerufenem Skript die Items alle selektiert oder deselektiert sein. Die Parameter PAGE, DATASOURCE, SECTIONNAME und CHECKBOXNAME mรผssten ggfls. angepasst werden.

Anmerkung: Die Methode StoreElement.getChildByName(...) ist deprecated.

Freundliche GrรผรŸe

Ismail

Eine einfache Deselektion aller Werte รผber einen FS_Button lieรŸe sich auch so implementieren:

Template:

  <FS_BUTTON

        name="button_uncheck"

        allowEmpty="yes"

        hFill="yes"

        noBreak="no"

        onClick="script:uncheckall"

        useLanguages="no">

        <LANGINFOS>

          <LANGINFO lang="*" label="Keins auswรคhlen" description="TEXT"/>

        </LANGINFOS>

        <PARAMS>

          <PARAM name="uncheck">#field.cs_countryList</PARAM>

        </PARAMS>

      </FS_BUTTON>

Skript:

     uncheck.set(null);

Hallo Ismail,

Vielen Dank schon mal fรผr die Antworten. Sorry, dass es sich so lange hinzieht.

Das Deselektieren habe ich bereits vor einiger Zeit mit Hilfe eine s FS-BUTTON umgesetzt, genau wie du vorgeschlagen hast. Das war einfach! ๐Ÿ™‚ ich habe fรผr das Selektieren zuerst auch den Weg รผber einen FS-BUTTON gewรคhlt, jedoch hat sich das Formular respektive die Daten nicht verรคndert (siehe Posting #5).

Beim Selektieren aller Checkboxen verwenden wir eine Datenquelle und haben mit folgendem Code (an deinen Post anlehnend) angefangen:

e = context.getStoreElement();

row = context.getSelectedRow();

dataSet = e.getDataset(row);

currentEntity = dataSet.getEntity();

formData = dataSet.getFormData();

ContentStoreRoot contentStore = (ContentStoreRoot) us2.getStore(Store.Type.CONTENTSTORE, false);

Content2 myDataSource = contentStore.getContent2ByName("country");

data = myDataSource.getData();

opt = new HashSet();

for (int i = 0; i < data.size(); i++) {

    opt.add(data.get(i).getValue("fs_id").toString());

}

Bis hierhin funktioniert alles sehr gut. Wenn ich das HashSet dann allerdings wieder der FormData zuweise (formData.set(opt);), so kommt die Exception, dass die Methode "set" fรผr dieses FormData nicht verfรผgbar ist. Bei einem Eintrag aus der Datenquelle ist dies wahrscheinlich auch der falsche Weg.

:smileyconfused:

0 Kudos

Puh, so hat es geklappt:

// Retrieve all available countries from the corresponding data source and construct a HashSet of it.

UserService userService = context.getUserService();

ContentStoreRoot contentStore = (ContentStoreRoot) userService.getStore(Store.Type.CONTENTSTORE, false);

Content2 myDataSource = contentStore.getContent2ByName("country");

data = myDataSource.getData();

Set countrySet = new HashSet();

for (int i = 0; i < data.size(); i++) {

    String country = data.get(i).getValue("fs_id").toString();

    countrySet.add(country);

}

// Lock the selected element and check all available countries using the HashSet.

session = myDataSource.getSession();

storeElement = context.getStoreElement();

row = context.getSelectedRow();

dataSet = storeElement.getDataset(row);

currentEntity = dataSet.getEntity();

storeElement.lock(currentEntity);

storeElement.setLock(true, false);

formData = dataSet.getFormData();

formData.get(null, "cs_countrylist").set(countrySet);

dataSet.setFormData(formData);

// Save and unlock the element, commit the changes.

storeElement.save();

storeElement.unlock(currentEntity);

storeElement.setLock(false, false);

session.commit();

"Leider" nur รผber das Kontextmenรผ. รœber einen FS-BUTTON wรคre es noch schรถner, da habe ich aber leider keinen Weg gefunden.

0 Kudos

Type a product name