Hi Peter,
noch nicht ganz - aber wir nähern uns 😉
Kann es sein, dass Du bei den Eigenschaften der Dokumentengruppe keinen Ausgabekanal (in Deinem Fall wohl HTML) aktiviert hast? Falls das so ist: Mach das mal, ich glaube dann wird es klarer 😉
Deine "echten" Seiten die in der DG liegen werden wie vorher auch als einzelne Seiten generiert (dazu später). Die DG erzeugt eine zusätzliche Datei in der Ausgabe, in der alle in ihr enthaltenen Seiten nochmal drin stecken.
Sobald der Ausgabekanal der DG aktiviert ist, müsstest Du in der Vorschau im SA alle Seiten der DG "zusammengeklebt am Stück" sehen. D.h. es geht durchaus in der Vorschau und verhält sich bei der Generierung nicht anders. Das was letztlich auf den Webserver soll ist also das Generat der DG.
Da hier also die Einzelseiten eher ein Hilfskonstrukt sind, die man in Deinem Fall nur zum Bearbeiten und Organisieren der "inneren" Navigationsstruktur nutzt, muss man nun noch dafür sorgen, dass die einzelnen Seiten bei der "echten" Generierung nicht erzeugt werden (außer Du willst sie zusätzlich als eine Art Fallback). Da gibt es mehrere Möglichkeiten.
Du kannst die Einzelseiten "abseits" der eigentlichen Website-Struktur platzieren, also dort wo sie vom Generierungsauftrag nicht berücksichtigt werden. Oder an einer "sinnvollen Stelle" vermerken, dass diese Seiten nicht als Einzelseiten erzeugt werden sollen und dann - unter Verwendung der Abfrage auf "#global.docgroup" dann die Erzeugung der Einzelseiten unterbinden. Das geht grundsätzlich, indem Du irgendwo im Template z.B. sowas machst:
$CMS_IF(set_isPartOfDocGroup && !#global.docgroup)$
$CMS_SET(#global.stopGenerate,true)$
$CMS_END_IF$
Das "set_isPartOfDocGroup" steht hier nicht für "ich werde jetzt gerade als Teil einer DG generiert" sondern allgemein für "ich bin (auch) Teil irgendeiner DG". Diese Variable müsste entsprechend gesetzt werden.
Ein anderer Weg wäre noch, die Seite einfach selbst ermitteln zu lassen, ob sie auch im Rahmen einer DG generiert wird, aktuell aber als einzelne Seite erzeugt wird. In diesem Fall wäre die Einzelseite "überflüssig" und könnte ihre eigene Generierung abbrechen. Da man hier ein bisschen über den Referenzgraph laufen und prüfen muss, ist das etwas komplizierter - mal schnell zusammengebastelt in etwa so:
$CMS_IF(!#global.docgroup)$
$-- walk up the tree and check for each parent if it is referenced from a docGroup node --$
$CMS_SET(class_docGroup, class("de.espirit.firstspirit.access.store.sitestore.DocumentGroup"))$
$CMS_SET(set_elem, #global.node)$
$CMS_FOR(for_foo, [1..#global.node.depth])$
$CMS_SET(set_containedInDocGroups,
set_elem
.incomingReferences
.map(refEntry->refEntry.referencedElement)
.filter(elem->class_docGroup.isCase(elem))
.filter(elem->elem.containsElement(#global.node))
)$
$-- set_containedInDocGroups contains all docGroup nodes this pageref is part of --$
$CMS_IF(!set_containedInDocGroups.isEmpty)$
$-- This node is also part of a docGroup generation
but currently rendered as single page - stop generation
--$
<h3>Part of a docgroup but currently rendered as single page</h3>
$CMS_SET(#global.stopGenerate, true)$
$CMS_SET(void, #for.BREAK)$
$CMS_END_IF$
$CMS_SET(set_elem, set_elem.parent)$
$CMS_END_FOR$
$CMS_END_IF$
Das ist jetzt theoretisch noch nicht extrem effizient, weil es gerade im "false"-Fall am längsten dauert da immer zum Sitestore-Root hochgelaufen werden muss. Allerdings auch nicht unbedingt direkt eine Performance-Katastrophe - das Erstellen einer Breadcrumb macht ja auch nicht viel weniger. Den Code kann man bestimmt noch etwas kompakter schreiben (direkt auf isEmpty prüfen usw.), ich habe es mal etwas mehr "ausformuliert" damit hoffentlich klarer ist was da so passiert.
Viele Grüße
Michael