FS_REFERENCE um Kommentarfeld erweitern

Bei der Umstellung von CMS_INPUT_PICTURE auf FS_REFERENCE fallen diverse Attribute im Java-Objekt weg (width, height, comment, ...), was die Migration von vorhandenen Elementen sehr erschwert. Bisher gibt es keine Aussicht auf ein Migrationsskript von e-Spirit, das z.B. den Kommentar (comment) in ein neues Textfeld mappt. Deshalb muss man für die Migration eigene aufwändige Skripte schreiben, damit der Inhalt aus dem Feld nicht verloren geht. In Projekten, die auf Barrierefreiheit sehr viel Wert legen, wurde das Kommentarfeld als Feld für den Alternativtext benutzt. Somit darf der Inhalt bei der notwendigen Umstellung nicht einfach wegfallen und bei Projekten mit 10.000 Seiten ist ein manuelles Nachpflegen dieser Texte utopisch. Daher wäre eine Erweiterung des FS_REFERENCE Objekts mindestens um das Kommentarfeld (comment) notwendig / wünschenswert.

14 Comments
hoebbel
Crownpeak employee
Crownpeak employee

Ich habe mal ein kleines Skript geschrieben, welches die Umwandlung für genau eine CMS_INPUT_PICTURE Komponente auf genau einer Absatzvorlage durchführt:

Das Skript geht davon aus, dass die umzuwandelnde Eingabekomponente in einem Absatz benutzt wird und das der Ausführende das Recht hat, alle Seiten mit diesem Absatz zu bearbeiten.

Weiterhin habe ich für Testzwecke eine zweite CMS_INPUT_PICTURE Eingabekomponente vorgesehen, in die die Daten der ursprünglichen Eingabekomponente kopiert werden, damit man nach der Umwandlung prüfen kann, ob die Daten korrekt übernommen wurden.

Folgende Dinge sind zu konfigurieren:

Name des Absatztemplates --> templatename

Name der umzuwandelnden Eingabekomponente --> picture_name

Name der Texteingabekompponente, die den Kommentar bekommen soll --> text_name

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

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

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

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

import java.util.Collections;

import java.util.HashSet;

import java.util.Set;

//----VARIABLENAMES-----

templatename = "cms_input_picture_to_fs_reference";

picture_name = "st_picture";

text_name = "st_alttext";

sectiontemplate = context.getUserService().getStore("TEMPLATESTORE",false).getSectionTemplates().getTemplate(templatename);

for (language : context.project.languages) {

                for (ref : sectiontemplate.getIncomingReferences()) {

                               if (!ref.getRelease() && (ref.getReferencedObject() instanceof Section) ) {

                                               section = ref.getReferencedObject();

                                               page = section.getParent().getParent();

                                               context.logDebug("processing page " + page.getUid() + " [" + page.getId() + "]");

                                               formData = section.getFormData();

                                               altText = formData.get(language,picture_name).get().getAltText();

                                               if(!(altText == null)) {

                                                               page.setLock(true,true);

                                                               textField = formData.get(language,text_name);

                                                               textField.set(altText);

                                                               section.setFormData(formData);

                                                               page.save(true);

                                                               page.setLock(false,true);

                                               }

                               }

                }

}

context.logInfo("script finished");

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Dazu empfehle ich folgende Sichtbarkeitsregel, die dafür sorgt, dass die Texteingabekomponente (hier: st_alttext) nur dann sichtbar wird, wenn die Bildeingabekomponente (hier: st_picture) gefüllt ist.

***************************************************

<ON_EVENT>

  <WITH>

    <NOT>

      <PROPERTY source="st_picture" name="EMPTY"/>

    </NOT>

  </WITH>

  <DO>

    <PROPERTY source="st_alttext" name="VISIBLE"/>

  </DO>

</ON_EVENT>

***************************************************

andre
I'm new here

generell kann man hier zu sagen: FS_REFERENCE ist für eine generische Referenze/Verlinkung gedacht, also kein 1:1 Abbildung von CMS_INPUT_PICTURE. Deshalb wird es hier auch kein Kommentarfeld geben.  Die Lösung von Holger ist also genau die bevorzugte.

AndreasOesterle
I'm new here

Hallo Holger,

ich habe dein Script bei uns in der Auftragsverwaltung angelegt. Danach habe ich für die drei Variablen meine spezifischen Werte gesetzt und das Script mit eingeloggtem Admin User über die Auftragsverwaltung ausgeführt.

Das Script startet und die erste Page findet er auch und gibt im Log aus:

...ScriptContextImpl): processing page fuehrerausweise_1 [291425]

Kurz später gibt es aber einen Error mit der Meldung:

(de.espirit.firstspirit.server.scheduler.ScriptTaskExecutor): error during script execution : de.espirit.firstspirit.access.script.ExecutionException: Method Invocation page.setLock at line 25

Im Cause steht noch:

Caused by: java.lang.SecurityException: changes not allowed for current connection

Es klingt alles nach einem Berechtigungsfehler. Da ich aber mit dem Admin User das Script ausführe sollte dies eigentlich nicht auftreten.

Auch wenn ich versuche die gemeldete Seite über den JAVAClient von Hand zu kopieren, kann ich die Aktion durchführen.

Im Script habe ich auch mal eine eigene Connection gesetzt und UserId und Pwd des Admin Users eingegeben. Die Meldung blieb aber die selbe.

Weisst du was hier beim setLock Befehl falsch läuft? Führe ich das Script falsch aus? Muss ich eventuell noch etwas berechtigen?

Danke schon mal!

AndreasOesterle
I'm new here

Ich habe mein Problem selbst gelöst.

Das Script funktioniert nur als clientseitiges Script. Davor hatte ich es als Servicescript laufen.

hoebbel
Crownpeak employee
Crownpeak employee

Hallo Andreas,

tut mir leid - ich hatte den ersten Kommentar irgendwie nicht mitbekommen Smiley Sad

Die Fehlermeldung klingt danach, als wäre keine eigene Verbindung im Auftragsskript benutzt worden. In diesem Fall wird dann eine Read-Only Connection geöffnet, mit der ein Bearbeiten nicht möglich ist (deshalb auch die Exception beim Wechsel in den Bearbeitungsmodus).

Lösung: Im Skript unter Eigenschaften eine eigene Verbindung definieren. Wichtig ist hierbei, dass der entsprechende Benutzer Ändernrechte auf allen betroffenen Objekten hat.

Viele Grüsse aus Dortmund,

  Holger

P.S. Bei technischen Problemen mit FirstSpirit einfach ein Ticket öffnen - das sehe wir im Helpdesk dann schnell. Schlimmstenfalls verweisen wir auf die Community, wenn es ein Thema ist, welches durch die normalen Supportverträge nicht abgedeckt ist Smiley Wink

AndreasOesterle
I'm new here

Hallo Holger,

Die eigene Verbindung hatte ich damals extra gesetzt (siehe oben), aber irgendwie hat es damit auch nicht funktioniert. Warum weiss ich auch nicht.

Für die Übernahme von Kommentaren aus CMS_INPUT_PICTURE Elemente auf Seiten habe ich jetzt ein eigenes Script geschrieben.

Ebenfalls habe ich noch eine Release Logik eingebaut, damit die Seiten, welche vorher schon released sind auch weiterhin auf released gesetzt sind. Macht man das nicht sind sonst alle Pages neu zu releasen und dabei geht der CHANGED Status von einzelnen Pages verloren.

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

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

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

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

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

import java.util.Collections;

import java.util.HashSet;

import java.util.Set;

//----VARIABLENAMES-----

templatename = "pt_museumsseite_form";

picture_name = "pt_logo";

text_name = "pt_logo_alt_text";

pagetemplate = context.getUserService().getStore("TEMPLATESTORE",false).getPageTemplates().getTemplate(templatename);

for (language : context.project.languages) {

                for (ref : pagetemplate.getIncomingReferences()) {

                               if (!ref.getRelease() && (ref.getReferencedObject() instanceof Page) ) {

                                               page = ref.getReferencedObject();

                                               isPageChangedBefore = page.getReleaseStatus() == IDProvider.CHANGED;

                                               context.logDebug("processing page " + page.getUid() + " [" + page.getId() + "]");

                                               formData = page.getFormData();

                                               altText = formData.get(language,picture_name).get().getAltText();

                                               if(!(altText == null)) {

                                                               page.setLock(true,true);

                                                               textField = formData.get(language,text_name);

                                                               textField.set(altText);

                                                               page.setFormData(formData);

                                                               page.save(true);

                                                               if(!isPageChangedBefore){

                                                                  page.release();

                                                               }

                                                               page.setLock(false,true);

                                               }

                               }

                }

}

hoebbel
Crownpeak employee
Crownpeak employee

Hallo Andreas,

zwei kleine Anmerkungen dazu:

> Die eigene Verbindung hatte ich damals extra gesetzt (siehe oben), aber irgendwie hat es damit auch

> nicht funktioniert. Warum weiss ich auch nicht.

Dann tippe ich darauf, dass der Benutzer für bestimmte Seiten kein Ändern Recht hatte. das würde natürlich auch eine entsprechende Security Exception erklären Smiley Wink

>  isPageChangedBefore = page.getReleaseStatus() == IDProvider.CHANGED;

Und was ist mit NEVER_RELEASED? Mit der Logik gibst Du auch niemals freigegebene Seiten später frei, oder übersehe ich etwas?

AndreasOesterle
I'm new here

Hallo Holger,

ich habe den "Admin" User verwendet in der eigenen Connection. Der hat doch immer auf alles Berechtigung zu sperren. Ich habe mit dem Admin User auch versucht die Seite manuell im JAVAClient zu ändern und freizugeben. Für diese Seite bei der das Script abbricht hat die manuelle Änderung prima funktionert. Warum es dann über das Service Script nicht funktioniert weiss ich immer noch nicht. Führe ich den Script Code als Clientseitiges Script aus, läuft das Script ohne Fehler durch mit dem Admin User.

Mit NEVER_RELEASED hast du natürlich recht. Ich habe hierzu das IF Statement angepasst:

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

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

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

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

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

import java.util.Collections;

import java.util.HashSet;

import java.util.Set;

//----VARIABLENAMES-----

templatename = "pt_museumsseite_form";

picture_name = "pt_logo";

text_name = "pt_logo_alt_text";

pagetemplate = context.getUserService().getStore("TEMPLATESTORE",false).getPageTemplates().getTemplate(templatename);

for (language : context.project.languages) {

                for (ref : pagetemplate.getIncomingReferences()) {

                               if (!ref.getRelease() && (ref.getReferencedObject() instanceof Page) ) {

                                               page = ref.getReferencedObject();

                                               isPageChangedBefore = page.getReleaseStatus() == IDProvider.CHANGED;

                                               context.logDebug("processing page " + page.getUid() + " [" + page.getId() + "]");

                                               formData = page.getFormData();

                                               altText = formData.get(language,picture_name).get().getAltText();

                                               if(!(altText == null)) {

                                                               page.setLock(true,true);

                                                               textField = formData.get(language,text_name);

                                                               textField.set(altText);

                                                               page.setFormData(formData);

                                                               page.save(true);

                                                               if(!isPageChangedBefore && page.getReleaseStatus() != IDProvider.NEVER_RELEASED){

                                                                  page.release();

                                                               }

                                                               page.setLock(false,true);

                                               }

                               }

                }

}

context.logInfo("script finished");

Andreas-Knoor
Crownpeak Employee
Crownpeak Employee

Status wurde auf "ARCHIVED" gesetzt, da der Vorschlag nicht der Grundidee der FS_REFERENCE entspricht. Für die Umstellung der alten CMS_INPUT_PICTURE wurde eine Migrationsstrategie beschrieben.

hjaeger
Returning Observer

Hallo Herr Knoor.

Wo wäre diese Migrationsstrategie zu finden?