nikb
I'm new here

Tabellen: Kategorienbaum mit Selbstreferenz (1:n)

Jump to solution

Hallo Community,

ich würde gerne einen Kategorienbaum mit variabler Tiefe aufbauen. Hierzu habe ich eine Tabelle angelegt die eine 1:n Beziehung zu sich selbst hat, d.h. eine Kategorie kann eine Vaterkategorie haben oder nicht (Wurzelkategorie).

In der Tabellenvorlage muss dem Redakteur also die Möglichkeit gegeben werden eine Vaterkategorie auszuwählen. Wenn nun ein Objectchooser verwendet wird, wird folgende Meldung angezeigt:

"Ein Formularelement darf nicht die eigene Tabellenvorlage als Ziel definieren."

Frage: Ist es möglich das Vorhaben in FirstSpirit abzubilden oder muss als Workaround eine Tiefe vorgegeben werden und somit mit mehreren gleichen Tabellen (z.B. category1 -> category2 -> category3) gearbeitet werden?

0 Kudos
1 Solution

Accepted Solutions

Die Exception kommt, weil in den Daten die angezeigt werden sollen, bereits eine Endlosschleife vorhanden ist. Das Thema habe ich bei uns aufgenommen, unter der ID #115307.

Es sollte aber funktionieren, wenn die Zuordnungen frei von Zyklen sind.

Vielleicht reicht es auch aus, CMS_INPUT_COMBOBOX als Auswahlkomponente einzusetzen? Die könnte später immer noch durch FS_DATASET ersetzt werden (wenn ein Fix für #115307 verfügbar ist).

Peter

View solution in original post

0 Kudos
5 Replies
Peter_Jodeleit
Crownpeak employee

Mit FS_DATASET müsste das gewünschte möglich sein. Allerdings könnte es da zu Problemen bei Zyklen kommen (Kategorie A hat Kategorie B als Vater und umgekehrt). Mindestens die Ausgabe im Template müsste damit dann umgehen können.

Peter
0 Kudos

Hallo Peter,

danke für die schnelle Antwort, das habe ich bereits ausprobiert, erhalte dann allerdings folgende Meldung im Formular präsentiert:

de.espirit.firstspirit.client.access.editor.EndlessEditorLoopException: Detected endless loop in GOM definition for 'tt_category'!

    at de.espirit.firstspirit.client.access.editor.swing.AbstractValueGuiEditor.stack(AbstractValueGuiEditor.java:1180)

    at de.espirit.firstspirit.client.access.editor.swing.DatasetGuiEditor.getEditorComponent(DatasetGuiEditor.java:355)

    at de.espirit.firstspirit.ui.gadgets.swing.legacy.GuiEditorWrappingSwingGadget.getEditorComponent(GuiEditorWrappingSwingGadget.java:424)

    at de.espirit.firstspirit.ui.gadgets.swing.legacy.GuiEditorWrappingSwingGadget.getComponent(GuiEditorWrappingSwingGadget.java:401)

    at de.espirit.firstspirit.ui.gadgets.swing.ValueHoldingSwingGadgetWrapper.getEditorComponent(ValueHoldingSwingGadgetWrapper.java:199)

    at de.espirit.firstspirit.ui.gadgets.swing.ValueHoldingSwingGadgetWrapper.getComponent(ValueHoldingSwingGadgetWrapper.java:239)

    at de.espirit.firstspirit.ui.gadgets.swing.ValueHoldingSwingGadgetMediator.getComponent(ValueHoldingSwingGadgetMediator.java:596)

    at de.espirit.firstspirit.ui.gadgets.swing.AggregatingSwingGadgetPanel.add(AggregatingSwingGadgetPanel.java:132)

    at de.espirit.firstspirit.ui.gadgets.swing.module.ModuleSwingGadget$1.invoke(ModuleSwingGadget.java:53)

    at de.espirit.firstspirit.ui.gadgets.swing.module.ModuleSwingGadget$1.invoke(ModuleSwingGadget.java:51)

    at de.espirit.firstspirit.ui.gadgets.swing.AbstractAspectableAggregate.forEach(AbstractAspectableAggregate.java:96)

    at de.espirit.firstspirit.ui.gadgets.swing.module.ModuleSwingGadget.getComponent(ModuleSwingGadget.java:50)

    at de.espirit.firstspirit.ui.gadgets.swing.AggregatingSwingGadgetMediator.getComponent(AggregatingSwingGadgetMediator.java:301)

    at de.espirit.firstspirit.client.gui.SwingFormView.getComponent(SwingFormView.java:161)

    at de.espirit.firstspirit.client.gui.SwingMultiFormView.getComponent(SwingMultiFormView.java:258)

    at de.espirit.firstspirit.client.gui.tree.store.pagestore.GomModuleView.getComponent(GomModuleView.java:158)

    at de.espirit.firstspirit.client.gui.GomModulePanel.getViewComponent(GomModulePanel.java:256)

    at de.espirit.firstspirit.client.gui.GomModulePanel.initialize(GomModulePanel.java:159)

    at de.espirit.firstspirit.client.gui.GomModulePanel$3.run(GomModulePanel.java:229)

    at de.espirit.common.gui.EventDispatchThreadHelper.invokeLater(EventDispatchThreadHelper.java:78)

    at de.espirit.firstspirit.client.gui.GomModulePanel.setVisibleLanguage(GomModulePanel.java:227)

    at de.espirit.firstspirit.client.gui.GomModulePanel.getVisibleLanguage(GomModulePanel.java:241)

    at de.espirit.firstspirit.client.gui.tree.store.contentstore.AbstractGuiXmlPanel.getGomPanel(AbstractGuiXmlPanel.java:121)

    at de.espirit.firstspirit.client.access.editor.swing.DatasetGuiEditor$InternalGuiXmlPanel.<init>(DatasetGuiEditor.java:1178)

    at de.espirit.firstspirit.client.access.editor.swing.DatasetGuiEditor$InternalGuiXmlPanel.<init>(DatasetGuiEditor.java:1170)

    at de.espirit.firstspirit.client.access.editor.swing.DatasetGuiEditor.getEditorComponent(DatasetGuiEditor.java:358)

    at de.espirit.firstspirit.ui.gadgets.swing.legacy.GuiEditorWrappingSwingGadget.getEditorComponent(GuiEditorWrappingSwingGadget.java:424)

    at de.espirit.firstspirit.ui.gadgets.swing.legacy.GuiEditorWrappingSwingGadget.getComponent(GuiEditorWrappingSwingGadget.java:401)

    at de.espirit.firstspirit.ui.gadgets.swing.ValueHoldingSwingGadgetWrapper.getEditorComponent(ValueHoldingSwingGadgetWrapper.java:199)

    at de.espirit.firstspirit.ui.gadgets.swing.ValueHoldingSwingGadgetWrapper.getComponent(ValueHoldingSwingGadgetWrapper.java:239)

    at de.espirit.firstspirit.ui.gadgets.swing.ValueHoldingSwingGadgetMediator.getComponent(ValueHoldingSwingGadgetMediator.java:596)

    at de.espirit.firstspirit.ui.gadgets.swing.AggregatingSwingGadgetPanel.add(AggregatingSwingGadgetPanel.java:132)

    at de.espirit.firstspirit.ui.gadgets.swing.module.ModuleSwingGadget$1.invoke(ModuleSwingGadget.java:53)

    at de.espirit.firstspirit.ui.gadgets.swing.module.ModuleSwingGadget$1.invoke(ModuleSwingGadget.java:51)

    at de.espirit.firstspirit.ui.gadgets.swing.AbstractAspectableAggregate.forEach(AbstractAspectableAggregate.java:96)

    at de.espirit.firstspirit.ui.gadgets.swing.module.ModuleSwingGadget.getComponent(ModuleSwingGadget.java:50)

    at de.espirit.firstspirit.ui.gadgets.swing.AggregatingSwingGadgetMediator.getComponent(AggregatingSwingGadgetMediator.java:301)

    at de.espirit.firstspirit.client.gui.SwingFormView.getComponent(SwingFormView.java:161)

    at de.espirit.firstspirit.client.gui.SwingMultiFormView.getComponent(SwingMultiFormView.java:258)

    at de.espirit.firstspirit.client.gui.tree.store.pagestore.GomModuleView.getComponent(GomModuleView.java:158)

    at de.espirit.firstspirit.client.gui.GomModulePanel.getViewComponent(GomModulePanel.java:256)

    at de.espirit.firstspirit.client.gui.GomModulePanel.initialize(GomModulePanel.java:148)

    at de.espirit.firstspirit.client.gui.GomModulePanel$3.run(GomModulePanel.java:229)

    at de.espirit.common.gui.EventDispatchThreadHelper.invokeLater(EventDispatchThreadHelper.java:78)

    at de.espirit.firstspirit.client.gui.GomModulePanel.setVisibleLanguage(GomModulePanel.java:227)

    at de.espirit.firstspirit.client.gui.applications.FormTabConfiguration$GomFormView$1.run(FormTabConfiguration.java:161)

    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)

    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:677)

    at java.awt.EventQueue.access$000(EventQueue.java:85)

    at java.awt.EventQueue$1.run(EventQueue.java:638)

    at java.awt.EventQueue$1.run(EventQueue.java:636)

    at java.security.AccessController.doPrivileged(Native Method)

    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)

    at java.awt.EventQueue.dispatchEvent(EventQueue.java:647)

    at de.espirit.firstspirit.client.AWTDispatchingEventQueue.defaultDispatchEvent(AWTDispatchingEventQueue.java:130)

    at de.espirit.firstspirit.client.AWTDispatchingEventQueue._dispatchEvent(AWTDispatchingEventQueue.java:122)

    at de.espirit.firstspirit.client.AWTDispatchingEventQueue.dispatchEvent(AWTDispatchingEventQueue.java:108)

    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296)

    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211)

    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201)

    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196)

    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188)

    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

GOM Definition:

  <FS_DATASET name="tt_category" allowDelete="no">

    <LANGINFOS>

      <LANGINFO lang="*" label="Dataset" description="Please select a dataset"/>

      <LANGINFO lang="DE" label="Datensatz" description="Bitte wählen Sie einen Datensatz"/>

    </LANGINFOS>

    <LEGACYTEMPLATE>content.category</LEGACYTEMPLATE>

    <SOURCES>

      <CONTENT name="content_category"/>

    </SOURCES>

  </FS_DATASET>

Ich überlege mir gerade alternative Lösungen.

0 Kudos

Die Exception kommt, weil in den Daten die angezeigt werden sollen, bereits eine Endlosschleife vorhanden ist. Das Thema habe ich bei uns aufgenommen, unter der ID #115307.

Es sollte aber funktionieren, wenn die Zuordnungen frei von Zyklen sind.

Vielleicht reicht es auch aus, CMS_INPUT_COMBOBOX als Auswahlkomponente einzusetzen? Die könnte später immer noch durch FS_DATASET ersetzt werden (wenn ein Fix für #115307 verfügbar ist).

Peter
0 Kudos

Vielen Dank, mit der Combobox funktionieren selbstreferenzen. Nach eigenen Tests hat es sich allerdings als unpraktisch für Redaktuere herausgestellt den Kategorienbaum so aufzubauen.

Die Eingabe mit Standardmitteln über mehrere Ebenen ist zu kompliziert, da der Kategorienpfad für den Redakteur nicht erkennbar ist (ausser im Label liesse sich die Ausgabe rekursiv generieren).

Nachtrag: Es lagen übrigens keine Zyklen in den Daten vor bei meinen ersten Tests mit dem Objectchooser, die Tabellen waren leer.

0 Kudos

Vielen Dank, mit der Combobox funktionieren selbstreferenzen. Nach eigenen Tests hat es sich allerdings als unpraktisch für Redaktuere herausgestellt den Kategorienbaum so aufzubauen.

Die Eingabe mit Standardmitteln über mehrere Ebenen ist zu kompliziert, da der Kategorienpfad für den Redakteur nicht erkennbar ist (ausser im Label liesse sich die Ausgabe rekursiv generieren).

Stellen Sie doch einen Feature-Request für so eine Komponente.

Eventuell fühlt sich auch ein e-Spirit-Parter berufen, so eine Komponente als Modul zu entwickeln?

Peter
0 Kudos