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

Hallo Michael,

Ich habe vorab ein paar Fragen die eventuell meine Unklarheiten klären könnten:

  1. Meinst du mit Dokumentengruppen die Seitengruppen in der Strukturverwaltung?
  2. Kann ich für die Generation der Navigation, die Generation eines Inhaltsverzeichnis als Vorlage verwenden oder benutze ich dort die CMS_FUNCTION name="PageGroup"?
    1. Sollte ich PageGroup verwenden, wie ist dann die Erstellung einer Navigation vorgesehen? Dort existiert wahrscheinlich keine Parameter wie BeginHTML etc...
  3. Muss ich alle Seiten in einen Ordner packen ohne Unterordner um die Gruppieren zu können?

Danke schonmal!

Viele Grüße

Peter

0 Kudos

Hallo Peter,

  1. Nein, Seitengruppen dienen dazu, über die PageGroup-Funktion eine Art "Seitwärtsbeziehung" zwischen Seitenreferenzen innerhalb eines Ordners zu ermöglichen, das ist etwas komplett anderes. Dokumentengruppen ermöglichen es, bestimmte Bereiche ausgehend von der Strukturverwaltung (einen oder mehrere Ordner oder auch einzelne Seitenreferenzen) in einer einzigen generierten Datei "zusammenzufassen". Sowas wird z.B. gerne für einen PDF-Ausgabekanal im Rahmen eines "Katalogs" benutzt: Auf der Website haben die Produkte einzelne Seiten, im PDF-Ausgabekanal wird dann eine Dokumentengruppe benutzt durch die aus denganzen einzelnen Seiten dann ein PDF entsteht.
    Du erzeugst eine Dokumentengruppe per Rechtsklick auf einen Sitestore-Ordner und dann "Neu => Dokumentengruppe". Die Dokumentengruppe kann dabei "irgendwo" liegen.
  2. Für die Navigation müsstest Du weiterhin die "normale" Navigationsfunktion nutzen können, da allerdings die Ziele "umbiegen", damit sie eben nicht auf die "normale" Seite der Struktur (die gibt es nämlich immer noch) verweisen sondern nur die Anker enthalten (wenn Du in der Dokumentengruppe bist). Als Anker kannst Du ja z.B. die UIDs der Seitenreferenzen nehmen.
  3. Sollte sich mit (1) erledigt haben (Dokumentengruppe != Seitengruppe)

Ich habe das so selber noch nicht für "SPA-artiges" benutzt, war erstmal als Hinweis gedacht, dass es diesen Mechanismus gibt. Ob es in Deinem konkreten Fall wirklich passt kann ich nicht sagen.

Die grobe Idee war, Dein initiales Konstrukt und/oder auch die Sichtweise quasi "umzudrehen". Anstatt eine (Inhalts-)Seite in FS zu haben, innerhalb derer man eine Navigationsstruktur hat (bzw. irgendwie eine erzeugt), baut man mehrere Seiten - sorgt dann aber per Dokumentengruppe dafür, dass diese "nachträglich" in einer einzelnen Seite/Datei zusammengefasst werden.

Das Ganze hat allerdings auch ein paar Nachteile, insbesondere kann man Dokumentengruppen im CC nicht (ohne Skripting) anlegen (aber anzeigen). Der Vorteil ist halt, dass Du die ganzen Aspekte bzgl. Hierarchie (Anlegen, Navigation) "geschenkt" bekommst und im CC die "Einzelseiten" pflegen würdest, was oft auch einfacher ist. Wenn das "es ist eine einzige Seite" (=eine HTML-Datei) eher ein rein "technischer" Aspekt ist (wie bei SPAs), sind Dokumentengruppen oft eine sinnvolle Option. Im Template muss man allerdings auch einige Anpassungen machen, insbesondere die Abfrage ob die Seite gerade über die Dokumentengruppe oder "solo" erzeugt wird.

Viele Grüße

Michael

0 Kudos
pavone
I'm new here

Hallo Peter,

benötigst Du noch weitere Hilfe oder haben Dir die Antworten von Michael bereits geholfen? In diesem Fall wäre es super, wenn Du die "richtige Antwort" entsprechend markierst, damit auch andere Community-Teilnehmer diese auf den ersten Blick finden. Solltest Du zwischenzeitlich eine eigene Lösung gefunden haben, wäre es nett, wenn Du diese hier bereitstellst.

Viele Grüße

Tim

0 Kudos

Hallo Tim,

Ich bin leider noch nicht dazu gekommen die Idee von Michael zu testen. Aber theoretisch scheint dieser Ansatz der zu sein den ich gesucht habe. Ich werde diesen Beitrag erstmal als "Vermutlich beantwortet" markieren.

Viele Grüße

Peter

0 Kudos

Hi Michael,

Wie würde denn eine exemplarische Header-Funktion für eine Dokumentengruppe aussehen? Finde dazu keine Hilfe in der Dokumentation... Sehe bislang auch nur die Knoten wenn ich mit unter Seitenstruktur -> Dokumentengruppen-Item die Vorschau ansehe. Aber das Seitentemplate hat diese nicht mehr..

Viele Grüße

Peter

0 Kudos

Hallo Peter,

die Idee war, einfach die Navigationsfunktion für die "Einzelseiten" zu nutzen (z.B. durch Setzen des root-Parameters) - dann aber innerhalb der Navigationsfunktion beim Verlinken eben nicht wie sonst üblich $CMS_REF(#nav.ref)$ zu nutzen, sondern Links zu erzeugen die auf Anker (#) innerhalb der Dokumentengruppe zielen.

Viele Grüße

Michael

0 Kudos

Hi Michael,

Dort habe ich genau mein Verständnisproblem. Wie generiere ich Links zur Erzeugung der Anker? #docGroup oder #global.docgroup hilft mir an der Stelle nicht weiter, bzw. liefert mir keine Daten wie z.B. #nav an der Stelle...

Hätte jetzt mit einer Navigation Funktion gerechnet für Dokumentengruppen wo man dann statt #nav die #doc Systemobjekte verwenden kann..

Könntest du mir das an einem Beispiel erklären, wie man mit der Header-Funktion "Navigation" nun mit den Dokumentengruppen arbeitet?

Viele Grüße

Peter

0 Kudos

Hallo Peter,

du arbeitest streng genommen in der Navigationsfunktion gar nicht "mit der Dokumentengruppe" sondern lässt sie einfach auf den „Einzelseiten“ laufen, sorgst aber dafür dass der durch die Navigationsfunktion generierte Code dann auf die Dokumentengruppe zugeschnitten ist. D.h. du nutzt sie eigentlich nur zum Iterieren über die Ebenen. Die Navigationsfunktion weiß quasi gar nichts von der Dokumentengruppe.

Wenn Du die Dokumentengruppe so definiert hast, dass sie nur einen Ordner - und dadurch den entspr. Teilbaum - enthält (würde in Deinem Fall glaube ich Sinn machen), wäre das Konstrukt ungefähr so:

Du baust Dir eine separate Navigationsfunktion - z.B. fr_nav_docgroup -  die Du nur aufrufst, wenn Du in einer Dokumentengruppe bist.

$CMS_VALUE(if(#global.docgroup, fr_nav_docgroup))$

In dieser Navigationsfunktion benutzt Du für die hrefs kein CMS_REF sondern schreibst Anchor-Links mit "etwas identifizierbarem", z.B. die numerische ID der Seitenreferenz:

<CMS_ARRAY_PARAM name="unselectedHTML">

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

          <a ... href="#sub_$CMS_VALUE(#nav.ref.id)$">$CMS_VALUE(#nav.label.convert2)$</a>

        ]]></CMS_ARRAY_ELEMENT>

</CMS_ARRAY_PARAM>

Außerdem sorgst Du dafür, dass die Navigationsfunktion den ersten Ordner der Dokumentengruppe als Rootknoten benutzt:

<CMS_VALUE_PARAM name="root" value="#docGroup.root.childs.first.node" />

In den entsprechenden Seitentemplates baust du eine Abfrage ein ob Du in einer Dokumentengruppe bist, wenn ja lässt du den „oberen“ und „unteren“ Bereich im HTML weg (das würde dann in die Start- und Endvorlage der Dokumentengruppe gehören - d.h. separate Seitentemplates) und schreibst zu Beginn der "Seite" - das wieder im normalen Seitentemplate - den Anker rein z.B. mit

$CMS_IF(#global.docgroup)$

    <a name="sub_$CMS_VALUE(#docNode.node.id)$"></a>

$CMS_END_IF$

Letztlich muss das was du in das <a name=...> schreibst, zu dem "passen" was auch die Navigationsfunktion erzeugt.

Wahrscheinlich solltest Du auch dafür sorgen, dass bei der Zusammenstellung der Dokumentengruppe immer zuerst die jeweiligen Seitenreferenzen (bzw. deren Inhalt) generiert wird bevor in die Ordner hineingelaufen wird. Das geht durch das Setzen von #docGroup.pageFirst im Start-Template (in den Seitentemplates der "eigentlichen" Seiten funktioniert es nicht):

$CMS_SET(#docGroup.pageFirst,true)$

Viele Grüße

Michael

0 Kudos

Hi Michael,

Erstmal vielen lieben Dank für die ausführliche Erklärung.

Tut mir leid, falls ich mich etwas doof anstelle aber ich bekomme in meinem Rendertemplate mit der Funktion keine Werte für #docGroup oder #global.docgroup...

Habe den Ordner mit den Unterordnern der Dokumentengruppe hinzugefügt. Nur wie sage ich nun z.B. meiner Funktion das er diese Dokumentengruppe berücksichtigen soll. Bei der Ausgabe von #global.docgroup bekomme ich false...

Ebenfalls dieser Eintrag #docGroup.root.childs.first.node ist für den Root leer...

Schwieriges Thema...

Viele Grüße

Peter

0 Kudos

Hallo Peter,

was meinst Du mit "berücksichtigen"? Falls Du die Navigationsfunktion meinst: Die kann streng genommen keine Navigation für eine Dokumentengruppe erstellen sondern nur für "echte" Navigationspunkte, also normale Strukturordner. Genau das ist hier der "Trick": Der Navigationsfunktion als Rootknoten den "echten" Strukturordner geben - das passiert über den CMS_VALUE_PARAM. Das funktioniert auch nur aus der Dokumentengruppe heraus, d.h. wenn Du dir deren Vorschau ansiehst.

Du generierst (ohne weitere Vorkehrungen zu treffen, s.u.) die entsprechenden Inhalte zwei mal: Einmal also normale einzelne Seiten. Während das passiert, sind die Seiten sozusagen gar nicht in der Dokumentengruppe. Dann wird zusätzlich die Dokumentengruppe generiert, die keine "eigenen" Inhalte hat sondern die in ihr enthaltenen Seiten einfach nochmal rendert und dabei "zusammenklebt", dadurch entsteht aus dem Knoten der Dokumentengruppe dann eine einzige Ausgabe-Datei. Dabei wird zuerst das spezielle in den Eigenschaften der Dokumentengruppe hinterlegte "Start-Template" gerendert, dann alle enthaltenen Seiten gemäß ihrer jeweiligen Seitentemplates und am Ende dann das "End-Template" der Dokumentengruppe.

Kann es vielleicht sein, dass Du das einfach gedanklich "aus der falschen Richtung" angehst? In den einzelnen Seitentemplates geht es nicht um die Frage "ist meine Seite in (irgendeiner) Dokumentengruppe?" sondern "wird meine Seite gerade durch eine / als Teil einer Dokumentengruppe generiert oder einzeln?"

Viele Grüße

Michael

0 Kudos