Search the FirstSpirit Knowledge Base
Hallo Community,
ich habe ein Skript, mit dem ich in einem Absatz eine Liste mit Bildern "fülle".
Das Skript öffnet einen Dialog zur Auswahl eines Ordners im globalen Medienprojekts. Die in diesem Ordner liegenden Bilder werden dann in die Liste in dem Absatz geschrieben.
Das Skript wird per Rechtsklick auf dem Absatz gestartet. Dabei ist egal, ob die betreffende Seite im Bearbeitungsmodus ist oder nicht.
Das Problem, das ich habe, ist ein visuelles (Anzeige-)problem und und zwar nur dann, wenn die betreffende Seite zur Skriptausführung im
Bearbeitungsmodus ist. Die ausgewählten Bilder werden zwar in den Absatz geschrieben, aber dies wird erst dann für den Redakteur "sichtbar", wenn er (manuell) den Bearbeitungsmodus verläßt.
In meinem Skript "imitiere" ich genau dieses Verhalten (aus dem Bearbeitungsmodus herausgehen) mit den entsprechenden setLock() Methoden, trotzdem klappt der "Refresh" nicht.
Auch F5 hilft nicht.
Wenn ich dagegen das Skript auf dem Absatz ausführe und die Seite ist NICHT im Bearbeitungsmodus, erscheinen die hinzugefügten Bilder sofort.
Hier das Skript und schon mal danke für einen Tip!
(FS-Version 5.1.311.65223)
import de.espirit.firstspirit.access.store.contentstore.Content2;
import de.espirit.firstspirit.access.store.*;
import de.espirit.firstspirit.access.store.mediastore.Media;
import de.espirit.firstspirit.access.store.mediastore.MediaFolder;
import de.espirit.firstspirit.access.store.mediastore.MediaStoreRoot;
import de.espirit.firstspirit.access.store.pagestore.Section;
import de.espirit.firstspirit.access.store.Data;
import de.espirit.firstspirit.access.Language;
import de.espirit.firstspirit.access.editor.value.TargetReference;
import de.espirit.firstspirit.access.store.StoreElementFilter;
import de.espirit.firstspirit.forms.FormData;
import de.espirit.firstspirit.access.editor.value.SectionFormsProducer;
import de.espirit.firstspirit.access.editor.FormDataProducer;
import de.espirit.firstspirit.access.editor.fslist.IdProvidingFormData;
import de.espirit.firstspirit.access.store.templatestore.SectionTemplate;
import de.espirit.firstspirit.access.editor.value.TargetReference;
import de.espirit.firstspirit.access.editor.value.TargetReference.TargetReferences;
import de.espirit.firstspirit.access.store.pagestore.Page;
import de.espirit.firstspirit.forms.FormDataList;
import de.espirit.firstspirit.forms.FormField;
import de.espirit.firstspirit.common.gui.CMSDialog;
import de.espirit.common.util.Listable;
import java.util.Iterator;
// Konfiguration pro Projekt
String galleryTemplateUid = "intra_bildergalerie";
String galleryMediaTemplateUid = "intra_bildergalerie_bild";
void addMediaRef(FormDataList list, Media media) {
Language lang = context.getProject().getMasterLanguage();
FormDataProducer producer = list.getProducer();
Iterator it = producer.getAllowedTemplates().iterator();
while (it.hasNext()) {
// Template aus Liste holen
SectionTemplate template = (SectionTemplate) it.next();
if (template.getUid().equals(galleryMediaTemplateUid)) {
// Neuer Absatz
FormData newFormData = producer.create(template);
// Formularfeld für Bild holen
FormField newFormField = newFormData.get(lang, "st_galery_picture");
// neue Referenz auf das Bild
TargetReference ref = TargetReferences.newInstance(lang, media, "MediaPool");
// Referenz speichern
newFormField.set(ref);
// Absatz zu Liste hinzufügen
list.add(newFormData);
return;
}
}
}
Data gui = context.showGui();
if (gui != null) {
// Sprache
Language lang = context.getProject().getMasterLanguage();
// alle Medien aus Auswahldialog holen
TargetReference folderRef = gui.get("sc_folder").getEditor().get(lang);
Store remoteMediaStore = context.getUserService().getRemoteUserService("MediaPool").getStore(Store.Type.MEDIASTORE, false);
MediaFolder mediaFolder = remoteMediaStore.getStoreElement(folderRef.get().getId());
Listable newMediaList = mediaFolder.getChildren(Media.class, true);
// aktuellen Absatz holen
Section currentSection = context.getElement();
// nur weitermachen wenn es sich um eine Bildergalerie handelt
if (currentSection.getTemplate().getUid().equals(galleryTemplateUid)) {
// Medien vom aktuellen Absatz holen
FormData formData = currentSection.getFormData();
FormField fsList = formData.get(lang, "st_galery_cal");
FormDataList mediaList = fsList.get();
Page page = currentSection.getParent().getParent();
boolean wasLocked = page.isLocked();
// Seite sperren
if (!wasLocked) {
page.setLock(true);
}
// vorhandene Bilder löschen
mediaList.clear();
// neue Bilder einfügen
Iterator it = newMediaList.iterator();
while (it.hasNext()) {
addMediaRef(mediaList, (Media)it.next());
}
// neue Formulardaten schreiben
fsList.set(mediaList);
currentSection.setFormData(formData);
// Section speichern
currentSection.save();
page.save();
// Seite entsperren
page.setLock(false);
// lock if page was already locked before
if (wasLocked) {
page.setLock(true);
}
CMSDialog.showInfoDialog(mediaList.size() + " Medien wurden hinzugefügt. \nWenn sie nicht direkt angezeigt werden, verlassen Sie bitte den Bearbeitungsmodus.");
} else {
CMSDialog.showInfoDialog("Dieses Skript funktioniert nur mit Absätzen mit der Vorlage \"Bildergalerie\"");
}
}
Hallo,
über das Skript werden die Formulardaten des persistierten Elements manipuliert. Einen Rückkanal zum angezeigten Formular gibt es nicht und eine Aktualisierung (refresh) darf dort auch keine Auswirkung haben, da an dieser Stelle Benutzereingaben erfolgen.
Einen alternativen Weg gibt es mit der OpenElementDataFormOperation. Hierüber erhält man nach der Ausführung der Operation einen Remote-Zugriff auf das geöffnete Formular und kann dieses entsprechend manipulieren. Man kann die Operation immer nutzen (Sperren des Elements nicht vergessen) oder nur für den Fall, dass das Element bereits gesperrt ist.
Ich hoffe, dies hilft weiter. Ansonsten gerne wieder hier melden.
Beste Grüße
Stefan
Hallo,
über das Skript werden die Formulardaten des persistierten Elements manipuliert. Einen Rückkanal zum angezeigten Formular gibt es nicht und eine Aktualisierung (refresh) darf dort auch keine Auswirkung haben, da an dieser Stelle Benutzereingaben erfolgen.
Einen alternativen Weg gibt es mit der OpenElementDataFormOperation. Hierüber erhält man nach der Ausführung der Operation einen Remote-Zugriff auf das geöffnete Formular und kann dieses entsprechend manipulieren. Man kann die Operation immer nutzen (Sperren des Elements nicht vergessen) oder nur für den Fall, dass das Element bereits gesperrt ist.
Ich hoffe, dies hilft weiter. Ansonsten gerne wieder hier melden.
Beste Grüße
Stefan
Vielen Dank Herr Schulz,
Der Einsatz von OpenElementDataFormOperation hat das Problem gelöst!
Viele Grüße,
Benny Kannengießer
// re-lounge