Search the FirstSpirit Knowledge Base
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
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
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);
}