Search the FirstSpirit Knowledge Base
Hallo Community,
ich möchte alle Referenzen (vom Typ Reference und nicht ReferenceEntry!!!) ausgehend von einer Section ermitteln. Der Grund ist, dass ich wissen möchte für welche Sprache welche Referenz gilt. Als Beispiel kann ein Medium z.B. in der Medienverwaltung für mehrere Sprachen und in unterschiedlichen Dateiformaten gepflegt werden. Dabei kann dann z.B. der Fall auftreten, dass in der Seitenverwaltung bei Pflege einer Seite das Medium für die Sprache Deutsch referenziert ist und für die Sprache Englisch nicht. Wenn man nun wissen möchte, welche Medien-Dateitypen tatsächlich aktuell referenziert sind, braucht man also eine Unterscheidung der Sprachen bzgl. der Referenzen. Dies scheint nicht direkt vorgesehen zu sein, aber mit dem Code wäre ein Workaround möglich, da der Typ Reference sowohl eine Referenz auf Language als auch eine auf ReferenceEntry enthält und den Zugriff auf diese Member-Variablen auch ermöglicht.
Ich habe nun als ersten Schritt den etwas unschönen Code dazu geschrieben (siehe z.B. expliziter Typecast auf DataWrappingFormData). Das Problem ist, dass EditorValueFormDataWrapper keinen Zugriff auf den EditorValue gestattet. Aber nur dieses Interface besitzt die Methoden-Signatur findReferences().
public static Set determineReferences(Section section) {
Set references = Sets.newHashSet();
DataWrappingFormData formData = (DataWrappingFormData) section.getFormData();
List variableNames = formData.getForm().appendEditorNames(null);
for (final String variableName : variableNames) {
final EditorValue editor = formData.getData().get(variableName).getEditor(); references.addAll(editor.findReferences());
}
return references;
}
Gibt es hier eine bessere/sauberere Alternative?
Viele Grüße
Hi,
generell findet getOutgoingReferences mehr Referenzen, weil hier nicht nur die Formulardaten betrachtet werden. Stellt sich also die Frage, welche Art Referenzen in dem Projekt benötigt werden.
Ein Cast nach DataWrappingFormData ist allerdings sehr unschön, da die Klasse weder in der API ist, noch ein garantierter Rückgabewert für alle StoreElement-Objekte ist. Der direkte Weg wäre aktuell wohl noch die Nutzung der getData() Methode in Section. Diese ist zwar als veraltet markiert, wird aber in der aktuellen Version und in 5.2 noch enthalten sein. Weiter bietet sich an, einen entsprechenden Feature-Wunsch für zukünftige Versionen zu stellen. Interessant ist hier vor allem aber der Anwendungsfall und nicht das Umsetzungsziel.
Beste Grüße
Stefan
Mir ist aufgefallen, dass es einen Unterschied bei den folgenden Ermittlungsmethoden bzgl. der ermittelten Referenzen gibt:
1.) editor.findReferences()
findet nur einen Bruchteil der existierenden Referenzen, dafür aber vom Typ Reference
(besitzt Language-Membervariable => Sprachunterscheidung möglich)
2.) section.getOutgoingReferences()
findet wirklich alle existierenden Referenzen, leider aber nur vom Typ ReferenceEntry
(besitzt keine Language-Membervariable => Sprachunterscheidung nicht möglich).
Gibt es einen Weg, alle Referenzen vom Typ Reference
zu einer Section
zu ermitteln?
Hi,
generell findet getOutgoingReferences mehr Referenzen, weil hier nicht nur die Formulardaten betrachtet werden. Stellt sich also die Frage, welche Art Referenzen in dem Projekt benötigt werden.
Ein Cast nach DataWrappingFormData ist allerdings sehr unschön, da die Klasse weder in der API ist, noch ein garantierter Rückgabewert für alle StoreElement-Objekte ist. Der direkte Weg wäre aktuell wohl noch die Nutzung der getData() Methode in Section. Diese ist zwar als veraltet markiert, wird aber in der aktuellen Version und in 5.2 noch enthalten sein. Weiter bietet sich an, einen entsprechenden Feature-Wunsch für zukünftige Versionen zu stellen. Interessant ist hier vor allem aber der Anwendungsfall und nicht das Umsetzungsziel.
Beste Grüße
Stefan
Hallo,
so wie es den Anschein hat gibt es derzeit keine Möglichkeit Referenzen sprachgebunden zu ermitteln bzw. zu filtern. Man erhält zwar aus dem Typ Reference
die Sprache, jedoch ist eine Filterung dann nur möglich, wenn die Eingabe-Komponente im von der Seite genutzten Template mit useLanguages="yes"
markiert wurde und nur falls keine Verschachtelung von Eingabe-Komponenten vorliegt. Im Fall von verschachtelten FS_LIST
s (Bsp.: Mithras-Projekt -> Download-Center) kann die umhüllende Datasource z.B. sprachunabhängig sein und eine darinliegende FS_LIST
sprachabhängig. Die Ermittlung mit findReferences()
bzgl. einer Sprache ist hier nicht möglich, da z.B. nur die st_linklist -> downloadcenterlinkinternal-
Template-Referenzen mit ihrer Sprache ausgewiesen werden, da hier für die Datasource useLanguages="yes"
angegeben ist, jedoch die darin verknüpften downloadcenterlinkinternal -> FS_REFERENCE-
Referenzen durch das useLanguages="no"
nur mit Language null. Es werden also stets alle Referenzen in einer flachen Liste (unkategorisiert) zurückgeliefert. Eigentlich schade, da alle Informationen für eine sprachliche Differenzierung im Objektbaum vorhanden wären. Es müsste z.B. lediglich ein rekursiver Aufruf aller verschachtelten Eingabe-Komponenten z.B. mit findReferences(language) möglich sein oder findReferences() nur die obersten Referenzen zurückgeben, die dann eine sprachgebundene Navigation ermöglichen.
Die folgende API wäre also wirklich hilfreich:
List<Reference> references = editor.findReferences(language);
oder
List<Reference> references = editor.findReferences(); // Returns only top level references
for(Reference reference : references) {
List<Reference> nestedReferences = reference.findNestedReferences(language);
}
Viele Grüße