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
11 Replies

Hey Reza,

es geht auch mit einem FS_BUTTON.

Der Trick (danke an Rouven Broszeit!) ist, in Deinem Script nicht countrySet.add(<String>) sondern countrySet.add(<Option>) zu nutzen.

Also nicht:

countrySet = new HashSet();

countrySet.add("1");

countrySet.add("0");

checkbox.set(countrySet);

sondern

optionFactory = element.getFormData().getForm().findEditor("pt_checkbox").getOptionFactory();

optionModel = optionFactory.getOptionModel(context,language,false);

countrySet = new HashSet();

countrySet.add(optionModel.getOption("1"));

countrySet.add(optionModel.getOption("0"));

checkbox.set(countrySet);

Viele Grüße,
Steffi

0 Kudos
gockel
Crownpeak employee

Hallo,

noch ein paar Anmerkungen zu obigem Code.

bisheriger Code:

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

* Lock sollte IMMER im try/finally (vergl. Locking-Hints )

* im obigen Code wird NICHT-rekursiv gelockt und dann rekursiv gespeichert (falsch)

* im konkreten Fall ist das locken und speichern des StoreElementes (in diesem Fall Content2) komplett unnötig und erzeugt nur unnötige Revisionen

* wenn man komplett über das Dataset arbeitet, kann man sich das commit auf der Session sparen

Reduzierter Code:

content2 = context.getStoreElement();

entity = context.getSelectedRow();

dataSet = content2.getDataset(entity);

dataSet.setLock(true, false);

try {

     formData = dataSet.getFormData();

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

     dataSet.setFormData(formData);

     dataSet.save("set countries", false);

} finally {

     dataSet.setLock(false, false);

}

0 Kudos