Last modified by Christian Holzner on 2026/08/19 15:48

From version 2.1
edited by Christian Holzner
on 2026/08/19 15:48
Change comment: Wiki-Makro childtiles (Unterseiten-Kacheln) anlegen/aktualisieren
To version 1.1
edited by Christian Holzner
on 2026/08/10 13:43
Change comment: Wiki-Makro childtiles (Unterseiten-Kacheln) anlegen/aktualisieren

Summary

Details

XWiki.WikiMacroClass[0]
Macro code
... ... @@ -2,59 +2,98 @@
2 2  ## Hole das aktuelle Dokument
3 3  #set($discard = $doc.use($doc))
4 4  ##
5 -## --- Direkte Unterseiten der aktuellen Seite ermitteln + wie im linken
6 -## Menue (Panels.SectionNav) sortieren: zuerst angepinnte Seiten in
7 -## Pin-Reihenfolge, danach der Rest alphabetisch nach Titel. ---
8 -#set($curRef = $doc.documentReference.lastSpaceReference)
9 -#set($curPath = $services.model.serialize($curRef, 'local'))
10 -#set($rows = $services.query.xwql("where doc.name='WebHome' and doc.space like :p and doc.space not like :p2 order by lower(doc.title)").bindValue('p', "${curPath}.%").bindValue('p2', "${curPath}.%.%").setLimit(500).execute())
5 +## Versuche verschiedene Methoden, um Child-Pages zu finden
6 +#set($_pageChildren = [])
7 +#set($_debugMethod = "none")
11 11  ##
12 -## childMap: letzter Space-Name -> Kind-Dokument (nur sichtbare, lesbare)
13 -#set($childMap = {})
14 -#set($alpha = [])
15 -#foreach($fn in $rows)
16 - #set($cref = $services.model.resolveDocument($fn))
17 - #if($services.security.authorization.hasAccess('view', $cref))
18 - #set($cdoc = $xwiki.getDocument($cref))
19 - #if(!$cdoc.isHidden())
20 - #set($ln = $cref.lastSpaceReference.name)
21 - #set($discard = $childMap.put($ln, $cdoc))
22 - #set($discard = $alpha.add($ln))
9 +## Methode 1: getChildren()
10 +#set($_pageChildren = $doc.getChildren())
11 +#if(!$_pageChildren.isEmpty())
12 + #set($_debugMethod = "getChildren: ${_pageChildren.size()}")
13 +#end
14 +##
15 +## Methode 2: Für WebHome - finde alle Subspaces (direkte Suche nach Pattern)
16 +#if($_pageChildren.isEmpty() && $doc.name == 'WebHome')
17 + #set($_currentSpace = $doc.space)
18 + #set($_spacePrefix = "${_currentSpace}.")
19 + ## Suche alle WebHome-Dokumente in Subspaces, sortiert nach Erstellungsdatum
20 + ## So bleibt die Import-Reihenfolge (z.B. Seiltechnik zuerst unter Themen) stabil.
21 + #set($_allDocs = [])
22 + #try
23 + #set($_allDocs = $services.query.hql("select doc.fullName from XWikiDocument as doc where doc.fullName like :prefix and doc.name = 'WebHome' order by doc.creationDate asc").bindValue('prefix', "${_spacePrefix}%").execute())
24 + #catch
25 + ## Fallback auf breite Suche, falls Query-Service nicht verfuegbar ist
26 + #set($_allDocs = $xwiki.searchDocuments(""))
27 + #end
28 + #set($_filtered = [])
29 + #foreach($_docName in $_allDocs)
30 + #if($_docName.startsWith($_spacePrefix))
31 + ## Prüfe, ob es nur eine Ebene tiefer ist (kein weiterer Punkt nach dem Prefix)
32 + #set($_restPath = $_docName.substring($_spacePrefix.length()))
33 + ## Zähle Punkte in restPath - wenn 0 oder 1 (für .WebHome), dann direkte Kinder
34 + #set($_dotCount = 0)
35 + #foreach($_char in $_restPath.toCharArray())
36 + #if($_char.toString() == '.')
37 + #set($_dotCount = $_dotCount + 1)
38 + #end
39 + #end
40 + ## Nur hinzufügen wenn maximal 1 Punkt (für .WebHome am Ende)
41 + #if($_dotCount <= 1)
42 + #set($discard = $_filtered.add($_docName))
43 + #end
23 23   #end
24 24   #end
46 + #if($_filtered.size() > 0)
47 + #set($_pageChildren = $_filtered)
48 + #set($_debugMethod = "manual filter: ${_filtered.size()}")
49 + #end
25 25  #end
26 26  ##
27 -## Reihenfolge: angepinnte (Pin-Reihenfolge) zuerst, dann Rest alphabetisch
28 -#set($prefDoc = $xwiki.getDocument("${curPath}.WebPreferences"))
29 -#set($pinObj = $prefDoc.getObject('XWiki.PinnedChildPagesClass'))
30 -#set($ordered = [])
31 -#if($pinObj)
32 - #set($pinned = $pinObj.getValue('pinnedChildPages'))
33 - #if($pinned)
34 - #foreach($p in $pinned)
35 - #set($nm = $stringtool.removeEnd("$p", '/'))
36 - #if($childMap.containsKey($nm) && !$ordered.contains($nm))#set($discard = $ordered.add($nm))#end
52 +## Methode 3: Verwende getSpaces() API wenn verfügbar
53 +#if($_pageChildren.isEmpty() && $doc.name == 'WebHome')
54 + #set($_currentSpace = $doc.space)
55 + #try
56 + #set($_spaces = $xwiki.spaces)
57 + #set($_filtered = [])
58 + #foreach($_space in $_spaces)
59 + #if($_space.startsWith("${_currentSpace}."))
60 + #set($_docRef = "${_space}.WebHome")
61 + #if($xwiki.exists($_docRef))
62 + #set($discard = $_filtered.add($_docRef))
63 + #end
64 + #end
37 37   #end
66 + #if($_filtered.size() > 0)
67 + #set($_pageChildren = $_filtered)
68 + #set($_debugMethod = "spaces api: ${_filtered.size()}")
69 + #end
38 38   #end
39 39  #end
40 -#foreach($nm in $alpha)
41 - #if(!$ordered.contains($nm))#set($discard = $ordered.add($nm))#end
42 -#end
43 43  ##
44 44  ## Start HTML Grid Container
45 45  #set($_output = '<div style="display: grid; grid-template-columns: repeat(auto-fill, 175px); gap: 30px; padding: 15px 0; margin: 20px 0; align-items: start; justify-content: start;">')
46 46  ##
47 -## Pruefe ob Kinder vorhanden sind
48 -#if($ordered.isEmpty())
49 - #set($_output = $_output + '<div style="grid-column: 1/-1; text-align: center; padding: 30px; background: #f5f5f5; border-radius: 0; font-family: Ubuntu, sans-serif;"><p style="color: #666; margin: 0;">Keine Unterseiten vorhanden</p></div>')
76 +## DEBUG: Zeige Informationen an
77 +#set($_debugInfo = "Space: ${doc.space} | Page: ${doc.name} | Found: ${_pageChildren.size()} | Method: ${_debugMethod}")
78 +##
79 +## Prüfe ob Kinder vorhanden sind
80 +#if($_pageChildren.isEmpty())
81 + #set($_output = $_output + '<div style="grid-column: 1/-1; text-align: center; padding: 30px; background: #f5f5f5; border-radius: 0; font-family: Ubuntu, sans-serif;"><p style="color: #666; margin: 0;">Keine Unterseiten vorhanden</p><small style="color: #999; display: block; margin-top: 10px;">' + $_debugInfo + '</small></div>')
50 50  #else
51 - ## Iteriere in der ermittelten Reihenfolge
52 - #foreach($nm in $ordered)
53 - #set($_childPage = $childMap.get($nm))
54 - #set($_child = $_childPage.getDocumentReference())
55 - #set($_title = $_childPage.getDisplayTitle())
56 - #set($_url = $_childPage.getURL())
57 - #set($_img = "")
83 + ## Iteriere durch alle Kinder
84 + #foreach($_child in $_pageChildren)
85 + ## Handle sowohl DocumentReference als auch String
86 + #if($_child.class.name.contains('DocumentReference'))
87 + #set($_childPage = $xwiki.getDocument($_child))
88 + #else
89 + #set($_childPage = $xwiki.getDocument($_child))
90 + #end
91 + ##
92 + ## Überspringe die aktuelle Seite selbst
93 + #if($_childPage && !$_childPage.isHidden() && $_childPage.fullName != $doc.fullName)
94 + #set($_title = $_childPage.getDisplayTitle())
95 + #set($_url = $xwiki.getURL($_child))
96 + #set($_img = "")
58 58   ##
59 59   ## Suche nach Bildern in Attachments
60 60   #set($_atts = $_childPage.getAttachmentList())
... ... @@ -94,6 +94,7 @@
94 94   #set($_output = $_output + $_card)
95 95   #end
96 96   #end
136 +#end
97 97  ##
98 98  #set($_output = $_output + '</div>')
99 99  {{html}}$_output{{/html}}