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


