MarcusDau
Occasional Collector

Einträge in einer FS_LIST per API ändern

Hallo!

Dies ist wahrscheinlich eine banale Frage, aber ich komme gerade nicht weiter. Und zwar habe ich in der Seitenvorlage eine Eingabekomponente:

<FS_LIST name="pt_autor" allowEmpty="no" height="200" rows="6">

        <DATASOURCE type="database" useLanguages="no">

....

Leider haben sich im Laufe der Jahre Dubletten in der Autorenliste angesammelt und nun hat z.B. Autor x zwei Datensätze a und b. Diese Autorenliste möchte ich nun derart per API überarbeiten, dass ich auf alle Seiten durchlaufe, die FS_LIST auslese und wenn dort beispielsweise b drin steht, dann möchte ich diesen Eintrag löschen und a setzen.

Ich habe dies bisher wie folgt versucht (Code-Auszug). Ja es ist Beanshell, aber ich wollte das nur mal fix nebenbei machen:

long[] autorenAlt = {14273,448,68,144,74,133,9856,75,5760,3392,643,65};

long[] autorenNeu = {163,163,17408,5824,77,5826,13888,5825,7424,9472,17088,7360};

String[] feldName = {"pt_autor","pt_ansprechpartner"};

counter = 1;

Language language = context.getProject().getMasterLanguage();

us = context.getUserService();

e = context.getElement();

childs = e.getChildren(PageRef.class, true);

it = childs.iterator();

while(it.hasNext()) {

     Page page = it.next().getPage();

     state = page.getReleaseStatus();

     FormData pageData = page.getFormData();

     for (String feldNameWert : feldName) {

          ff = pageData.get(language, feldNameWert);

          formDataList = ff.get();

          for (IdProvidingFormData idProvidingFormData : formDataList) {

               FormField ffAutorAlt = idProvidingFormData.get(language,"fs_id");

               autorAlt = ffAutorAlt.get().toString();

               counterAutorenAlt = 1;

               for (long autorenAltWert : autorenAlt) {

                    if (autorenAltWert.toString().equals(autorAlt)) {

                         autorNeu = autorenNeu[counterAutorenAlt];

                         try {

                                   page.setLock(true);

                                   ffAutorAlt.set(autorNeu);

                                   page.save("WEB-3562: Wert für Feld '" + feldNameWert + "' neu gesetzt", false);

                                   if(state == IDProvider.RELEASED){

                                        page.release(false);

                                   }

                                   page.setLock(false);

                          }

                          catch (Exception e) {

                               e.printStackTrace();

                          }

                    }

                    counterAutorenAlt++;

               }

          }

          counter=1;

     }

}

Das Problem ist, dass mir der Autor aber nicht neu gesetzt wird. Was genau muss ich noch wegspeichern oder völlig umbauen, damit das geht?

Danke für Eure Hilfe.

Grüße

Marcus

0 Kudos
3 Replies
mbergmann
Crownpeak employee

Hallo Marcus,

da scheint mir auf jeden Fall schonmal ein page.setFormData(...) vor dem page.save() zu fehlen... Weiter habe ich jetzt erstmal nicht geschaut.

Viele Grüße

Michael

0 Kudos
MarcusDau
Occasional Collector

Das hatte ich auch schon drin.

page.setFormData(pageData);

Aber bringt leider auch rein gar nichts.

0 Kudos

Hallo Marcus,

ich würde hier grundsätzlich empfehlen, das erstmal über die IDE mit einer externen Verbindung zu testen bzw. auch einfach zu machen (da es ja eine einmalige Sache ist). Da kannst Du dann auch viel einfacher debuggen (breakpoints usw.).

Mir scheint hier aber auf den ersten Blick der Ansatz nicht ganz zu passen: Du änderst ja ffAutorNeu - das ist aber ein FormField im "verlinkten" Datensatz. So wie ich es verstanden habe, willst Du aber einzelne Einträge in der FS_LIST auf andere Datensätze zeigen lassen, oder? Hierzu müsstest Du den jeweiligen Eintrag entfernen und den "richtigen" hinzufügen. Zum Erzeugen des passenden Eintrages musst Du letztlich ContentFormsProducer.create(Entity) nutzen - basierend auf dem jew. DB-Eintrag. Den müsstest Du Dir vorher auch besorgen.

Viele Grüße

Michael

0 Kudos