Changes for page Unterseiten-Kacheln (Makro)
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
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
on 2026/08/19 15:48
Change comment:
Wiki-Makro childtiles (Unterseiten-Kacheln) anlegen/aktualisieren
Summary
-
Objects (1 modified, 0 added, 0 removed)
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}}


