Search the FirstSpirit Knowledge Base
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
Hallo Nils,
sieht so aus als würde vor dem save() ein section.setFormData(formData) fehlen.
Viele Grüße
Michael
Hallo Nils,
sieht so aus als würde vor dem save() ein section.setFormData(formData) fehlen.
Viele Grüße
Michael
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());