cobra707
I'm new here

Programmatisches Anlegen eines Datensatzes

Jump to solution

Hallo zusammen,

Ich würde gerne bei der Generierung meiner Navigation (rendertemplates) die ID des Navigationspunkts + Label und einem Boolean "IsMapped" einer Datenquelle hinzufügen.

Meine Seite ist ein "One-Pager" und braucht somit Ankerpunkte.. Ich will mit dem befüllen dieser Datenquelle bezwecken, dass der Redakteur beim Anlegen einer Sektion eine Auswahl von Menüpunkten hat (Label als Preview) und hinter dem Label dann die ID steckt, die wiederum als Ankerpunkt mit dem Menü verknüpft ist. (href)

Mein Problem ist, dass ich es nicht schaffe mit der FirstSpirit-Syntax Datensätze hinzuzufügen... Ist das nur über ein Skript möglich?

Mein Ansatz sieht wie folgt aus:

<CMS_ARRAY_PARAM name="unselectedHTML">

<CMS_ARRAY_ELEMENT index="0..4"><![CDATA[

<a href="#$CMS_VALUE(#nav.label)$">$CMS_VALUE(#nav.label.convert2)$ $CMS_IF(#nav.hasSubFolders)$<em></em>$CMS_END_IF$</a>

$CMS_SET(set_navDBAccess,global.gca("nav_db_access"))$

$CMS_SET(set_navRow,{

"tt_id":#nav.id,

"tt_label": #nav.label,

"tt_isMapped": true

})$

$CMS_SET(void,set_navDBAccess.set(#nav.label,set_navRow))$

]]></CMS_ARRAY_ELEMENT>

</CMS_ARRAY_PARAM>

Habe es mit FS_DataSet und FS_INDEX versucht. Habe ebenfalls das Objekt, was theoretisch erwartet wird, nachzubilden und zu befüllen und dieses Objekt der "add"-Methode bzw. jetzt bei DataSet hier "set"-Methode zu übergeben. Aber kein Erfolg..

Hat jemand eine Idee? Oder gibt es einen viel besseren Ansatz Navigation aufzubauen bei einem One-Page Template mit Ankerpunkten?

Viele Grüße

Peter

22 Replies

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

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

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