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

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

Summary

Details

XWiki.WikiMacroClass[0]
Macro code
... ... @@ -2,98 +2,59 @@
2 2  ## Hole das aktuelle Dokument
3 3  #set($discard = $doc.use($doc))
4 4  ##
5 -## Versuche verschiedene Methoden, um Child-Pages zu finden
6 -#set($_pageChildren = [])
7 -#set($_debugMethod = "none")
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())
8 8  ##
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
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))
44 44   #end
45 45   #end
46 - #if($_filtered.size() > 0)
47 - #set($_pageChildren = $_filtered)
48 - #set($_debugMethod = "manual filter: ${_filtered.size()}")
49 - #end
50 50  #end
51 51  ##
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
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
65 65   #end
66 - #if($_filtered.size() > 0)
67 - #set($_pageChildren = $_filtered)
68 - #set($_debugMethod = "spaces api: ${_filtered.size()}")
69 - #end
70 70   #end
71 71  #end
40 +#foreach($nm in $alpha)
41 + #if(!$ordered.contains($nm))#set($discard = $ordered.add($nm))#end
42 +#end
72 72  ##
73 73  ## Start HTML Grid Container
74 74  #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;">')
75 75  ##
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>')
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>')
82 82  #else
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 = "")
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 = "")
97 97   ##
98 98   ## Suche nach Bildern in Attachments
99 99   #set($_atts = $_childPage.getAttachmentList())
... ... @@ -133,7 +133,6 @@
133 133   #set($_output = $_output + $_card)
134 134   #end
135 135   #end
136 -#end
137 137  ##
138 138  #set($_output = $_output + '</div>')
139 139  {{html}}$_output{{/html}}