cobra707
I'm new here

Re: Programmatisches Anlegen eines Datensatzes

Jump to solution

Hi Michael,

Ich glaube ich hatte einen kompletten Denkfehler. Das Schlüsselwort in deiner letzten Antwort war "Generierung". Ergebnisse sehe ich somit erst auf meinem Server, wo die zusammengefasste HTML liegt.

Wenn ich das richtig verstehe, ändert sich somit meine Live-Preview von der Datei im Seitentemplate auf der Dokumentengruppendatei in der Strukturverwaltung.

Das heißt, dass ich deswegen die Dokumentengruppe verwende, weil ich durch die Gruppierung die Informationen über die Referenzdateien im Seitentemplate besitze und diese somit für meine Sektionen(Anker) verlinken kann? (Navigation wird nachwievor zusammengebaut, außer das ich zwischen zwei Rendertemplates switche jenachdem ob ich mich in der Dokumentengruppe befinde oder nicht)

Habe ich das alles richtig wiedergeben?

Viele Grüße

Peter

0 Kudos
mbergmann
Crownpeak employee
Crownpeak employee

Re: Programmatisches Anlegen eines Datensatzes

Jump to solution

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

cobra707
I'm new here

Re: Programmatisches Anlegen eines Datensatzes

Jump to solution

Hi Michael,

Vielen vielen Dank für diese ausführliche Erklärung!

Michael Bergmann schrieb:

[...]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 ;-)[...]

Das ist wohl das wichtigste was mir gefehlt hat... :smileyplain:

Habe in der Strukturverwaltung sogar die Vorschau gesehen. Habe es aber erst nach einer Generierung gesehen... Habe wohl per Zufall den HTML Ausgabekanal angehackt und dachte die Vorschau funktionierte nur in Kombination mit einer Generierung. (DEM IST NICHT SO!)

Viele Grüße

Peter

PS: Habe mich zu deiner Advancedschulung am 16.04 eingetragen.

0 Kudos