Thomas1
I'm new here

Link in einem FS_CATALOG, welches in einem Datensatz liegt per API ersetzen

Jump to solution

Hallo Community,

ich komme hier aktuell nicht mehr weiter und wüsste nicht wo ich was übersehen haben könnte. Ich möchte nämlich über eine Datenquelle iterieren und mir einen externen Link aus einer Liste auslesen und ersetzen lassen. Dieser Link befindet sich in einer Section, die wiederum von einem FS_CATALOG verwendet wird.

Über die API habe ich der genauen Ort des Links schon ausfindig gemacht und dieser wird auch ersetzt. Doch leider wird der geänderte Wert nicht gespeichert...ich habe schon alles möglich ausprobiert und verstehe nicht wo der Fehler liegen könnte....ich habe das Skript nun sehr vereinfacht umgebaut, damit man genau sieht wo das Problem liegen könnte:

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

import de.espirit.firstspirit.access.store.templatestore.Template;

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

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

import de.espirit.firstspirit.access.AdminService;

import de.espirit.firstspirit.access.store.sitestore.*;

import de.espirit.firstspirit.access.store.mediastore.*;

import de.espirit.firstspirit.access.*;

import de.espirit.firstspirit.access.store.contentstore.*;

import de.espirit.firstspirit.agency.*;

import de.espirit.or.*;

import java.lang.*;

import de.espirit.firstspirit.io.ServerConnection;

import de.espirit.firstspirit.access.project.Project;

import de.espirit.firstspirit.access.store.templatestore.TemplateStoreRoot;

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

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

import de.espirit.firstspirit.access.store.templatestore.gom.GomFormElement;

import de.espirit.firstspirit.forms.FormField;

import de.espirit.firstspirit.access.link.Link;

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

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

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

import de.espirit.firstspirit.forms.FormData;

import de.espirit.firstspirit.client.access.editor.lists.Catalog.Card;

import de.espirit.firstspirit.client.access.editor.lists.Catalog;

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

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

import de.espirit.firstspirit.access.store.contentstore.Datatset;

import java.io.FileWriter;

import java.io.IOException;

import java.util.regex.Pattern;

import java.lang.NullPointerException;

import java.lang.IllegalStateException;

import de.espirit.firstspirit.access.store.globalstore.GCAPage;

import de.espirit.firstspirit.access.store.globalstore.GCASection;

import de.espirit.firstspirit.access.database.EntityTypeNotFoundException;

import de.espirit.firstspirit.access.Language;

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

import de.espirit.firstspirit.access.store.templatestore.WorkflowLockException;

import de.espirit.firstspirit.access.store.templatestore.LinkTemplate;

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

import de.espirit.or.schema.Entity;

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

us = context.getUserService();

contentStoreRoot = us.getStore(Store.Type.CONTENTSTORE, false);

Content2 content2 = contentStoreRoot.getContent2ByName("news");

for (Dataset dataset: content2.getDatasets()) {

    try {

        FormData formData = dataset.getFormData();

        FormField formfield = formData.get(null, "cs_text_bottom");

        Catalog catalog = (Catalog) formData.get(null, "cs_text_bottom").get();

        dataset.setLock(true);

        for (Catalog.Card card: catalog) {

            if (card.getTemplate().getType() == Template.SECTION_TEMPLATE) {

                FormData formDataCatalog = card.getItem();

                FormField formFieldSection = formDataCatalog.get(null, "st_link");

                Link link = (Link) formFieldSection.get();

                if (link != null) {

                    if (link.getTemplate().getUid().equals("external_link")) {

                        FormData formDataLink = link.getFormData();

                        FormField formFieldLink = formDataLink.get(null, "lt_url");

                        context.logInfo("###FOUND###: " + dataset.getName() + " with Link-Url: " + formFieldLink.get());

                        String changedUrl = formFieldLink.get().replaceAll("http://www.dasIstEinTestLink.zo", "http://www.dasIstEinTestLink.de");

                        formFieldLink.set(changedUrl);

                        card.getItem().get(null, "st_link").set(formDataLink);

                        dataset.setFormData(dataset.getFormData());

                    }

                }

            }

        }

        dataset.getFormData().get(null, "cs_text_bottom").set(catalog);

        dataset.save();

        dataset.setLock(false);

    } catch (Exception e) {

        e.printStackTrace();

    }

}

JOptionPane.showMessageDialog(null, "Skript ist durchgelaufen!");

1 Solution

Accepted Solutions

Hallo Stefan,

cool, danke für die Info. Für alle die in Zukunft das selbe Problem haben könnten, hier das Ergebnis:

...

dataset.setLock(true);

FormField formField = formData.get(null, "cs_text_bottom");

if (Catalog.class.isAssignableFrom(formField.getType())) {

     FormField formfield  = formData.get(null, "cs_text_bottom");

     Catalog catalog = (Catalog) formData.get(null, "cs_text_bottom").get();

     for (Catalog.Card card: catalog) {

          FormData formDataCatalog = card.getItem();

          FormField formField = formDataCatalog.get(null, "st_link");

          Link link = (Link) formField.get();

          if (link != null) {

               if (link.getTemplate().getUid().equals("external_link")) {

                    linkFormData = link.getFormData();

                    FormField formFieldLink = linkFormData.get(null, "lt_url");

                    String changedUrl = formFieldLink.get().replaceAll("http://www.dasIstEinTestLink.zo","http://www.dasIstEinTestLink.de");

                   

                    formFieldLink.set(changedUrl);

                    link.setFormData(linkFormData);            

                  

                    card.loadItem(formDataCatalog);

               }

          }

     }

     formData.get(null, "cs_text_bottom").set(catalog);

     dataset.setFormData(formData);

}

dataset.save("Migrationskript gelaufen");

dataset.setLock(false);

...

Viele Grüße,

Thomas

View solution in original post

4 Replies
mbergmann
Crownpeak employee

Hallo Thomas,

soweit ich mich erinnere, kannst du bei einem Catalog nicht einfach per item.get(…).set(…) den vorhandenen Wert ändern.

Versuch mal, card.loadItem(…) zu nutzen.

Viele Grüße

Michael

0 Kudos

Hallo Michael,

danke für den Tipp. Leider hat das auch nicht funktioniert:

...

dataset.setLock(true);

for (Catalog.Card card: catalog) {

     if (card.getTemplate().getType() == Template.SECTION_TEMPLATE) {

          FormData formDataCatalog = card.getItem();

          FormField formFieldSection = formDataCatalog.get(null, "st_link");

          Link link = (Link) formFieldSection.get();

          if (link != null) {

              if (link.getTemplate().getUid().equals("external_link")) {

                        FormData formDataLink = link.getFormData();

                        FormField formFieldLink = formDataLink.get(null, "lt_url");

                      

                        context.logInfo("###FOUND###: "+dataset.getName()+" with Link-Url: "+formFieldLink.get());

                        String changedUrl = formFieldLink.get().replaceAll("http://www.dasIstEinTestLink.zo","http://www.dasIstEinTestLink.de");

                        formFieldLink.set(changedUrl);

                        card.loadItem(formDataLink);

                       

               }

          }

     }

}

dataset.getFormData().get(null, "cs_text_bottom").set(catalog);

dataset.save();

dataset.setLock(false);

..

Habe es auch in diversen Varianten ausprobiert, jedoch ohne Erfolg.

Viele Grüße,

Thomas

0 Kudos

Hallo Thomas,

wenn ich das richtig sehe, ist der Ablauf so auch nicht korrekt. loadItem lädt ein FormData-Objekt als Inhalt für den Katalogeintrag. formDataLink passt da nicht.

Im Prinzip musst du die Auslesekette zurückgehen: formFieldLink setzen (machst du bereits), formDataLink für st_link in formDataCatalog setzen, formDataCatalog über loadItem in die Card schreiben, catalog in das FormData des Datensatzes schreiben (machst du bereits).

Beste Grüße

Stefan

0 Kudos

Hallo Stefan,

cool, danke für die Info. Für alle die in Zukunft das selbe Problem haben könnten, hier das Ergebnis:

...

dataset.setLock(true);

FormField formField = formData.get(null, "cs_text_bottom");

if (Catalog.class.isAssignableFrom(formField.getType())) {

     FormField formfield  = formData.get(null, "cs_text_bottom");

     Catalog catalog = (Catalog) formData.get(null, "cs_text_bottom").get();

     for (Catalog.Card card: catalog) {

          FormData formDataCatalog = card.getItem();

          FormField formField = formDataCatalog.get(null, "st_link");

          Link link = (Link) formField.get();

          if (link != null) {

               if (link.getTemplate().getUid().equals("external_link")) {

                    linkFormData = link.getFormData();

                    FormField formFieldLink = linkFormData.get(null, "lt_url");

                    String changedUrl = formFieldLink.get().replaceAll("http://www.dasIstEinTestLink.zo","http://www.dasIstEinTestLink.de");

                   

                    formFieldLink.set(changedUrl);

                    link.setFormData(linkFormData);            

                  

                    card.loadItem(formDataCatalog);

               }

          }

     }

     formData.get(null, "cs_text_bottom").set(catalog);

     dataset.setFormData(formData);

}

dataset.save("Migrationskript gelaufen");

dataset.setLock(false);

...

Viele Grüße,

Thomas