Hallo,
die Frage stammt aus einem Helpdesk-Ticket und kann jetzt hier vielleicht besser weiterdiskutiert werden.
Wir haben ein Formular zum Anlegen von News in einer Datenquelle. Das Formular enthält Pflichtfelder. Wenn die News in einer Sprache angelegt wurde, lässt sie sich noch nicht speichern, weil die Pflichtfelder in allen Sprachen gefüllt sein müssen. Daraus ist der Kundenwunsch entstanden, dass es eine Möglichkeit geben soll, die Formularfelder aus einer Sprache in alle Sprachen zu übertragen.
Dafür habe ich einen FS_BUTTON ins Formular eingebaut, der über eine Executable-Klasse diese Funktionalität bereitstellen soll. Der Button sieht im Formular dann so aus:
<FS_BUTTON
name="tt_button"
onClick="class:de.xxx.FormCopyFieldsToAllLanguages"
style="button"
useLanguages="no">
<LANGINFOS>
<LANGINFO lang="*" label="Copy news to all languages"/>
<LANGINFO lang="DE" label="News in alle Sprachen übernehmen"/>
</LANGINFOS>
<PARAMS>
<PARAM name="tt_headline">#field.tt_headline</PARAM>
<PARAM name="tt_date">#field.tt_date</PARAM>
<PARAM name="tt_category">#field.tt_category</PARAM>
<PARAM name="tt_teaser">#field.tt_teaser</PARAM>
<PARAM name="tt_text">#field.tt_text</PARAM>
<PARAM name="tt_image">#field.tt_image</PARAM>
<PARAM name="tt_image_caption">#field.tt_image_caption</PARAM>
</PARAMS>
</FS_BUTTON>
Über die PARAMS habe ich damit schon die Werte aller Formularfelder der aktuellen Sprache in der Executable zur Verfügung.
Und das entscheidende Code-Stück aus der Executable für das Kopieren sieht wie folgt aus:
DataProvider element = (DataProvider)properties.get("element");
Iterator<Language> languageInterator = element.getProject().getLanguages().iterator();
while (languageInterator.hasNext()) {
Language formLanguage = languageInterator.next();
//initialize operation
OpenElementDataFormOperation operation = context.requireSpecialist(OperationAgent.TYPE).getOperation(OpenElementDataFormOperation.TYPE);
operation.setLanguage(formLanguage);
//get form data
FormData formData = element.getFormData();
propertyKeysIterator = properties.keySet().iterator();
while (propertyKeysIterator.hasNext()) {
String propertyKey = propertyKeysIterator.next();
Object propertyValue = properties.get(propertyKey);
if (propertyValue instanceof ApiRemoteFormField<?>) {
FormField<?> formField = (FormField<?>) properties.get(propertyKey);
Object formFieldValue = formField.get();
formData.get(formLanguage, propertyKey).set(formFieldValue);
}
}
//set filled remoteFormData to operation and dataset
operation.setFormData(formData);
element.setFormData(formData);
//execute operation
operation.perform(element);
}
Das funktioniert im SiteArchitect einwandfrei.
Das entscheidende an der OpenElementDataFormOperation ist der DataProvider element, von dem das FormData-Objekt gezogen und auf dem die Operation ausgeführt wird. Dieser DataProvider steht im SiteArchitect in den Properties zur Verfügung, die an die execute-Methode der Executable übergeben werden.
Und genau dieser DataProvider steht bei der Verwendung im ContentCreator nicht zur Verfügung. In den Properties der execute-Methode ist das Attribut "element" nicht enthalten. Ich habe die Ausweichlösung über "element = (DataProvider) webUiAgent.getPreviewElement();" probiert, aber das hilft nichts. "webUiAgent.getPreviewElement()" liefert einen DataProvider für die im ContentCreator offene Seite. Die News legen wir aber über die Funktion zum Anlegen eines neuen Datensatzes im Inhalte-Bereich der ContentCreator Menüleiste an. Der Dialog zum Anlegen des Datensatzes wird als modales Fenster über der im ContentCreator offenen Seite eingeblendet. "webUiAgent.getPreviewElement()" reagiert aber nicht auf das modale Fenster mit dem Anlegen-Dialog, sondern liefert das Preview-Element für die Seite darunter. Und das ist dann natürlich der falsche DataProvider für die Executable und die Kopierfunktion.
Und ich suche jetzt nach einer Möglichkeit, wie ich auch im ContentCreator an einen geeigneten DataProvider für meine News-Datenquelle herankomme, um damit die OpenElementDataFormOperation ausführen zu können. Und ich hatte mich in dem Zusammenhang gewundert, dass beim Aufruf der Executable über den ContentCreator das aktuelle Element nicht mit in den Executable-Properties zur Verfügung steht. So wie es im SiteArchitect der Fall ist.
Viele Grüße,
Robert