kannengi
Elite Observer

Refresh-Problem wenn im Bearbeitungsmodus

Jump to solution

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\"");
     }
}
0 Kudos
1 Solution

Accepted Solutions
StefanSchulz
I'm new here

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

View solution in original post

0 Kudos
2 Replies
StefanSchulz
I'm new here

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

0 Kudos

Vielen Dank Herr Schulz,

Der Einsatz von OpenElementDataFormOperation hat das Problem gelöst!

Viele Grüße,

Benny Kannengießer

// re-lounge

0 Kudos