Anonymous
Not applicable

FS_LIST-Entity bei Erstellung mit Werten aus Vaterformular befüllen

Hallo Community,

ich bin heute über eine Anforderung gestoßen, die mich doch ziemlich fordert. Daher hoffe ich, dass mir hier geholfen wird.

Es geht darum, dass wir in einer Tabellenvorlage mehrere Textfelder (Kicker, Vorspann, Text) und eine FS_LIST (Übersteuerungen) besitzen. Die Übersteuerungen übersteuern (was sonst...) die in den Textfeldern gesetzten Werte, je nach Teasertyp.

Nun wurde die Anforderung gestellt, dass beim Erstellen eines neuen Übersteuerungs-Entities auch gleich die Werte der Textfelder mit denen des Vaterformulars vorbefüllt werden sollen. Der Redakteur muss sonst jeden Wert einzeln kopieren, die Übersteuerung per Doppelklick öffnen (modularer Dialog poppt auf) und dort einfügen, was ziemlich umständlich ist.

Nun die Frage:

Ist es überhaupt möglich solche eine Vorbefüllung über die Regeln (Rules) zu bewerkstelligen?

Mein erster Gedanke war ein ValueService, jedoch weiß ich gar nicht welch ein Event (falls überhaupt) das Erstellen eines Entities in einer FS_LIST auslöst, so dass hier eine Regel getriggert wird.

Eine andere Idee war ein FS_BUTTON mit angehängtem Skript/Executable innerhalb des Übersteuerungs-Formulars, das die Werte ausliest. Hier ist mir nur die Verknüpfung der beiden Formulare unklar (vermutlich über eine ForeignKey-Beziehung, da im DB-Schema so hinterlegt zwischen Tabelle "artikel" und "übersteuerung").

Zur Veranschaulichung habe ich Screenshots mit den Schritten der Anforderung angehängt.

Viele Grüße,

Nils

0 Kudos
3 Replies
thmarx
I'm new here

Hallo Nils,

ich bin mir ziemlich sicher, dass du es mit den Regeln alleine nicht gehen wird.

Ich glaube, der Ansatz mit dem FS_BUTTON und einem Skript ist der vielversprechendste.

Viele Grüße

Thorsten

0 Kudos

Hallo Nils,

ist diese Frage noch aktuell und benötigst du weitere Hilfe oder konnte Thorstens Antwort Deine Frage bereits beantworten?

Solltest du inzwischen eine eigene Lösung gefunden haben, wäre es nett, wenn du diese hier beschreibst, um sie auch den anderen Community-Teilnehmern zur Verfügung zu stellen.

Viele Grüße

Michaela

0 Kudos
Anonymous
Not applicable

Das Problems wurde nun wie folgt gelöst:

FS_BUTTON innerhalb des Kind-Tabellentemplates:

<FS_BUTTON name="cs_importStoryTextButton" onClick="class:ocm-copy-story-text-into-teaser" useLanguages="no">

  <LANGINFOS>

    <LANGINFO lang="*" label="Texte aus Beitrag übernehmen"/>

  </LANGINFOS>

  <PARAMS>

    <PARAM name="field1">#field.cs_kicker</PARAM>

    <PARAM name="field2">#field.cs_headline</PARAM>

    [...]

  </PARAMS>

</FS_BUTTON>

ocm-copy-story-text-into-teaser ist dabei per <public>-Komponente innerhalb der module.xml mit einer ausgelagerten Executable (bzw. unserem Wrapper AbstractCommonExecutable) verknüpft:

public class CopyStoryTextIntoTeaser extends AbstractCommonExecutable {

    @Override

    protected Object execute() {

        Dataset teaser = (Dataset) getParams().get("element");

        Entity story = (Entity) teaser.getEntity().get("stories");

        FormData storyFormData = getStoryTemplate().getDataset(story).getFormData();

        setFieldValue(storyFormData, "cs_kicker", "field1");

        setFieldValue(storyFormData, "cs_headline", "field2");

        [...]

        return null;

    }

    private TableTemplate getStoryTemplate() {

        StoreAgent storeAgent = getContext().requireSpecialist(StoreAgent.TYPE);

        Store templateStore = storeAgent.getStore(Store.Type.TEMPLATESTORE);

        TableTemplate template = (TableTemplate) templateStore.getStoreElement(Constants.SCHEMA_NAME + "." + EntityType.stories.getTableName(), IDProvider.UidType.TEMPLATESTORE_SCHEMA);

        return template;

    }

    private void setFieldValue(final FormData storyFormData, final String storyFieldName, final String teaserFieldName) {

        if (getParams().containsKey(teaserFieldName)) {

            FormField<?> field = (FormField<?>) getParams().get(teaserFieldName);

            if (field != null && field.isEmpty()) {

                field.set(storyFormData.get(getMasterLanguage(), storyFieldName).get());

            }

        }

    }

}

0 Kudos