Anonymous
Not applicable

CMS_INPUT_COMBOBOX im Databasemode mittels API ändern

Jump to solution

Hallo Community,

ich bin so langsam am verzweifeln an der FirstSpirit-API ...

Ziel:

Ein Absatz besitzt eine Combobox, die mit einer Datenquelle verknüpft ist. In dieser Combobox ist bereits ein alter Wert vorhanden, der mittels Skript auf einen neuen Wert gesetzt werden soll.

Da dieser Absatz an ca. 100 Stellen verwendet wird, war der Gedanke es durch ein Skript schnell und einfach lösen zu können. Ich hatte die Rechnung aber ohne die verwirrende FirstSpirit-API gemacht :smileyangry:

Mein Skript pickt sich anfangs beide Entities aus dem Content2, das alte, das ersetzt werden soll, und das neue, das das alte ersetzen wird.

Danach rattert das Skript über alle Sections im PageStore, loggt falls ein Treffer gefunden wird (entsprechender Absatz mit entsprechendem Altwert exisitert) und erstellt dann auf Basis des Formular eine OptionProviderFactory über die auf Basis des Ziel-Entities eine neue Option erstellt wird. Diese Option wird dann in das Combobox-FormField gesteckt und der Absatz gespeichert.

Das klitzekleine Problem: Die Combobox bleibt hat den zu ersetzenden Wert scheinbar so liebgewonnen, dass sie ihn wehement nicht geändert sehen will. In guter Point&Click-Adventure manier würde FirstSpirit "Nichts passiert" oder "Das klappt so nicht" sagen. Tut es leider nicht, es speichert eine neue Revision in der angeblich alles geändert wurde (kleine gelbe !-Boxen in der Versionshistorie) mit meinem Speicherkommentar. Und die Combobox ändert sich kein Stück.

Eine "normale" Combobox mittels API zu ändern verknotet einem ja schon ziemlich das Hirn, funktioniert aber wenigstens über diese Methode.

Daher meine Frage an die Community: Was hab ich hier übersehen? Oder handelt es sich um einen Bug?

//!Beanshell

import de.espirit.firstspirit.agency.StoreAgent;

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

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

import de.espirit.firstspirit.forms.FormField;

import de.espirit.firstspirit.forms.FormData;

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

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

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

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

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

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

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

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

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

import de.espirit.or.schema.Entity;

import de.espirit.common.base.Logging;

import java.lang.Long;

import java.lang.UnsupportedOperationException;

counter = 0;

masterLang = context.project.masterLanguage;

// get stores

storeAgent = context.requireSpecialist(StoreAgent.TYPE);

contentStore = storeAgent.getStore(Store.Type.CONTENTSTORE, false);

content2 = contentStore.getStoreElement("separator_formats", UidType.CONTENTSTORE);

pageStore = storeAgent.getStore(Store.Type.PAGESTORE, false);

// find target entity to create option for

Entity correctEntity = null;

for (Entity entity : content2.getData()) {

    if (entity.getValue("identifier").equals("separator")) {

        correctEntity = entity;

        Logging.logInfo("Correct Entity found: " + correctEntity.getValue("fs_id"), this.getClass());

        break;

    }

}

// find entity that will be switched

Long wrongEntityId = null;

for (Entity entity : content2.getData()) {

    if (entity.getValue("identifier").equals("seperator")) {

        wrongEntityId = entity.getValue("fs_id");

        Logging.logInfo("Wrong Entity found: " + wrongEntityId, this.getClass());

        break;

    }

}

// iterate over all section in pagestore and change separator-format if matching the incorrect one

for (Section section : pageStore.getChildren(Section.class, true)) {

    try {

        if ("separator".equals(section.getTemplate().getUid())) {

            FormData formData = section.getFormData();

            FormField field = formData.get(masterLang, "st_format");

            if (field.get() != null && field.get().getValue().getValue("fs_id").equals(wrongEntityId)) {

                Logging.logInfo("Separator found in '" + section.getParent().getName() + "' of '" + section.getParent().getParent().getUid() + "'", this.getClass());

                counter++;

                section.setLock(true);

                GomFormElement format = formData.getForm().findEditor("st_format");

                OptionFactory optionFactory = ((OptionFactoryProvider) format).getOptionFactory();

                field.set(optionFactory.create(correctEntity));

                section.save("Ersetze Trennerformat \"seperator\" durch \"separator\"");

                section.setLock(false);

            } else {

                Logging.logInfo("null/no match: '" + section.getParent().getName() + "' of '" + section.getParent().getParent().getUid() + "'", this.getClass());

            }

        }

    }

    catch (UnsupportedOperationException e) {

        continue;

    }

}

Logging.logInfo("Found " + counter + " separators to change", this.getClass());

Ausgabe:

INFO  12.09.2013 16:17:01.623 (bsh.This): Correct Entity found: 53760

INFO  12.09.2013 16:17:01.626 (bsh.This): Wrong Entity found: 53888

INFO  12.09.2013 16:17:01.638 (bsh.This): null/no match: 'sidebar' of 'detail_page_person'

INFO  12.09.2013 16:17:01.642 (bsh.This): Separator found in 'stage' of 'detail_page_image_voting'

INFO  12.09.2013 16:17:01.667 (bsh.This): Separator found in 'latch' of 'detail_page_image_voting'

INFO  12.09.2013 16:17:01.686 (bsh.This): null/no match: 'stage' of 'homepage'

INFO  12.09.2013 16:17:01.686 (bsh.This): null/no match: 'content' of 'test_teaser_override_sets'

INFO  12.09.2013 16:17:01.687 (bsh.This): null/no match: 'content' of 'test_teaser_override_sets'

INFO  12.09.2013 16:17:01.687 (bsh.This): Found 2 separators to change

0 Kudos
1 Solution

Accepted Solutions
mbergmann
Crownpeak employee

Hallo Nils,

sieht so aus als würde vor dem save() ein section.setFormData(formData) fehlen.

Viele Grüße

Michael

View solution in original post

0 Kudos
2 Replies
mbergmann
Crownpeak employee

Hallo Nils,

sieht so aus als würde vor dem save() ein section.setFormData(formData) fehlen.

Viele Grüße

Michael

0 Kudos
Anonymous
Not applicable

Hallo Michael,

vielen Dank! Das war's tatsächlich! Ich hatt mir Teile des Skripts aus einer Executable hinter einem FS_BUTTON geholt, da wird StoreElement.setFormData(formData) komischerweise nicht benötigt. Nun läuft's!

Der entgültige Beanshell-Code mit ein paar Verbesserungen (try/finally usw.):

//!Beanshell

import de.espirit.firstspirit.agency.StoreAgent;

import de.espirit.firstspirit.forms.FormField;

import de.espirit.firstspirit.forms.FormData;

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

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

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

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

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

import de.espirit.or.schema.Entity;

import de.espirit.common.base.Logging;

import java.lang.Long;

import java.lang.UnsupportedOperationException;

counter = 0;

masterLang = context.project.masterLanguage;

// get stores

storeAgent = context.requireSpecialist(StoreAgent.TYPE);

contentStore = storeAgent.getStore(Store.Type.CONTENTSTORE, false);

content2 = contentStore.getStoreElement("separator_formats", UidType.CONTENTSTORE);

pageStore = storeAgent.getStore(Store.Type.PAGESTORE, false);

// find target entity to create option for

Entity correctEntity = null;

for (Entity entity : content2.getData()) {

    if (entity.getValue("identifier").equals("separator")) {

        correctEntity = entity;

        Logging.logInfo("Correct Entity found: " + correctEntity.getValue("fs_id"), this.getClass());

        break;

    }

}

// find entity that will be switched

Long wrongEntityId = null;

for (Entity entity : content2.getData()) {

    if (entity.getValue("identifier").equals("seperator")) {

        wrongEntityId = entity.getValue("fs_id");

        Logging.logInfo("Wrong Entity found: " + wrongEntityId, this.getClass());

        break;

    }

}

// iterate over all section in pagestore and change separator-format if matching the incorrect one

for (Section section : pageStore.getChildren(Section.class, true)) {

    try {

        if ("separator".equals(section.getTemplate().getUid())) {

            FormField tempField = section.getFormData().get(masterLang, "st_format");

            if (tempField.get() != null && tempField.get().getValue().getValue("fs_id").equals(wrongEntityId)) {

                try {

                    Logging.logInfo("Separator found in '" + section.getParent().getName() + "' of '" + section.getParent().getParent().getUid() + "'", this.getClass());

                    page = section.parent.parent;

                    page.setLock(true);

                    formData = section.getFormData();

                    editor = formData.getForm().findEditor("st_format");

                    optionFactory = ((OptionFactoryProvider) editor).getOptionFactory();

                    formData.get(masterLang, "st_format").set(optionFactory.create(correctEntity));

                    section.setFormData(formData);

                    page.save("Ersetze Trennerformat \"seperator\" durch \"separator\"");

                } finally {

                    page.setLock(false);

                    counter++;

                }

            } else {

                Logging.logInfo("null/no match: '" + section.getParent().getName() + "' of '" + section.getParent().getParent().getUid() + "'", this.getClass());

            }

        }

    }

    catch (UnsupportedOperationException e) {

        continue;

    }

}

Logging.logInfo(counter + " separators changed", this.getClass());

0 Kudos