Aller au contenu principal

Programmatisches Anlegen eines Datensatzes

Commentaires

19 commentaires

  • Zendesk API User
    Author: mbergmann - 12/19/2017 11:41

    Hallo Peter,

    das geht auf diesem Weg nicht - und ich bin mir auch nicht sicher, ob das hier ein sinnvoller Weg wäre. Erstens ist sowieso während der Generierung kein Schreibzugriff möglich (readonly session), außerdem würdest Du ja bei jeder Vorschau-Anforderung neue Datensätze anlegen.

    Ich glaube mir ist das Konstrukt / Zielbild noch nicht ganz klar... Du hast eine Navigation, die aber nur innerhalb einer Seite funktionieren soll. Dieser Seite soll der Redakteur Absätze hinzufügen und gleichzeitig einen Eintrag für die seiteninterne Navigation machen? Welche Struktur soll die Navigation haben - ist sie "flach"? Sollen denn mehrere Absätze unterhalb eines Navigationspunktes möglich sein?

    Viele Grüße

    Michael

    0
  • Zendesk API User
    Author: cobra707 - 12/20/2017 11:24

    Hallo Michael,

    Das Klicken eines Navigationspunktes lässt den User zu einem SECTION-Container scrollen (automatisch). Das heißt, dass der href in dem Navigationspunkt kein #nav.ref ist sondern eine ID des SECTION-Containers...

    Wie bekomme ich da eine bestimmte Synchronität hin? Also das die SECTION-ID die gleiche ist die in dem Navigationspunkt. Freie Text-Inputfelder sind meiner Meinung nach eine potenzielle Fehlerquelle und bricht bei einem größeren Projekt sehr schnell zu einer Unübersichtlichkeit aus... Deswegen wollte ich die IDs in einer Datenbank persistieren... Nur gefällt mir dieser Ansatz auch nicht wirklich

    Viele Grüße

    Peter

    0
  • Zendesk API User
    Author: mbergmann - 12/20/2017 11:33

    Hallo Peter,

    soll denn zu jedem Absatz ein Navigationspunkt erstellt werden, d.h. entsprechen die SECTIONs den FS-Absätzen? Oder soll es da noch irgendeine Kontrollmöglichkeit geben oder kann das grundsätzlich "automatisch" anhand der vorhandenen Infos passieren?

    Generell haben die FS-Absätze eine ID. Im jeweiligen Absatztemplate kannst Du darauf mit

    $CMS_VALUE(#global.section.id)$

    zugreifen.

    Viele Grüße

    Michael

    0
  • Zendesk API User
    Author: cobra707 - 12/20/2017 11:41

    Hallo Michael,

    Nein, nicht jeder Absatz ist ein Navigationspunkt. Aber die Absätze, die zu einem Navigationspunkt gehören, können auch z.B. über einen Footer-Anker drauf zugegriffen werden.

    Beispiel:

    Navigation Home hat den href #home

    Dann gibt es noch

    <SECTION ID="home"> CONTENT </SECTION>

    <SECTION ID="aboutUs"> CONTENT </SECTION>

    <SECTION ID="contact"> CONTENT </SECTION>

    ==> Klick auf Navigationspunkt Home ==>  Scrollt zu der Stelle wo die Section Home beginnt

    ----

    Generell habe ich über deinen oben genannten Ansatz auch schon nachgedacht. Jedoch weiß die Navigation nichts von dieser FS-Absatz-ID oder? Ich muss ja die ID bei der Ausführung des Rendertemplates schon wissen...

    Viele Grüße

    Peter

    0
  • Zendesk API User
    Author: mbergmann - 12/20/2017 12:28

    Hallo Peter,

    an die FS-Absätze kommst Du auch über eine Iteration heran:

    $CMS_FOR(for_section, #global.page.getChildren(class("de.espirit.firstspirit.access.store.pagestore.Section"), true))$

    ...ID:$CMS_VALUE(for_section.id)$

    $CMS_END_FOR$

    Das for_section ist dann eine Section aus der API.

    Die Frage ist letztlich, woher die Labels für die Navigation kommen (sollen). Und wie man einem Absatz am sinnvollsten sagt, dass er einen Navigationspunkt darstellt. Hier ist es wohl am einfachsten, diese Infos am Absatz selbst zu pflegen, z.B. mit einem Toggle "st_hasNavEntry" und "st_navLabel" (oder Du nimmst für den Nav-Label die Überschrift falls das passt). Oder beide Infos in ein INPUT_LINK auslagern (dann ist der Zugriff ein bisschen anders). Theoretisch könnte man hier die Metadaten für nutzen, die hätten aber den Nachteil nicht sprachabhängig zu sein.

    Im Seitentemplate (bzw. Rendertemplate) - Erzeugen der Navigation:

    $CMS_FOR(for_section,

         #global.page.getChildren(class("de.espirit.firstspirit.access.store.pagestore.Section"), true)

         .toList

         .filter(section -> section.formData.st_hasNavEntry==true)

    )$

         <a href ="#section_$CMS_VALUE(for_section.id)$">$CMS_VALUE(for_section.formData.st_navLabel.convert2)$</a>

    $CMS_END_FOR$

    Und im jeweiligen Absatz (bzw. auch dort ausgelagert in ein Rendertemplate):

    <section $CMS_VALUE(if(st_hasNavEntry==true, "id=\"section_"+#global.section.id+"\""))$>

    ...

    </section>

    Viele Grüße

    Michael

    0
  • Zendesk API User
    Author: cobra707 - 1/8/2018 9:35

    Hallo Michael,

    Vielen Dank erstmal für die ausführliche Antwort.

    Wenn ich das richtig verstehe, kann ich nun nicht mehr die CMS_FUNCTION Navigation werden? Weil wir diese nicht mehr über die Struktur erstellen? Das hieße, ich müsste diese Funktionalität manuell über eine FOR-Schleife nachbilden? Das heißt auch die Erstellung des Sub-Menus? Dazu bräuchte ich wiederum eine Auswahl bereits bestehender Hauptmenüpunkte, falls es ein Unterpunkt sein sollte...

    EDIT: Kann ich dann auf die Struktur verzichten?

    Viele Grüße

    Peter

    0
  • Zendesk API User
    Author: mbergmann - 1/8/2018 10:23

    Hallo Peter,

    zum Verständnis: Geht es hier eher um eine einzelne Seite mit „ein paar“ Einsprungpunkten (in page navigation) oder um eine Art SPA wo die ganze Site in einer Seite „lebt“? Ich war bis jetzt eher von Ersterem ausgegangen.

    Viele Grüße

    Michael

    0
  • Zendesk API User
    Author: cobra707 - 1/8/2018 10:33

    Hallo Michael,

    Sowohl als auch...

    Die Einstiegsseite ist eine SPA. Dort findet man u.A. ein Navigationspunkt wie Services und Unterpunkte mit Service1 und Service2 etc. und das alles auf eine Single-Page-Application mit Ankerpunkten(href="#about_us" etc...).

    Zusätzlich gibt es aber auch ein Navigationspunkt der heißt Gallery, der wiederum auf eine neue Seite verlinkt ist..

    Mein Ansatz wäre jetzt gewesen für eine Sektion:

    1. Ist Navigationspunkt auf On (Toggle)
    2. Ist Unternavigation auf On (Toggle)
      1. Erscheinen von einer Liste mit bereits erstellten Sektionen die Navigationspunkte sind. ( Noch unklar wie ich diese Elemente "de.espirit.firstspirit.access.store.pagestore.Section" in eine Liste bekomme..)
    3. Label füllen für den Menüpunkt

    Anschließend in deiner oben genannten FOR-Schleife diese Form-Data Elemente berücksichtigen..

    Evtl. noch unter der eigen-erstellen-Projekteinstellungsseite diese Liste benutzerseitig sortierbar machen und dann diese der FOR-Schleife übergeben..

    Für die Navigationspunkte, die auf eine neue Seite verweisen, würden nachwievor über die Struktur erstellt werden... (Bin aber eher unzufrieden mit der Mischung von zwei Erstellungsmethoden für die Navigation...)

    Sind alles aber erste spontane Ideen die im Moment durch meinen Kopf fliegen..

    Bisheriger Stand:

    <CMS_HEADER>

    <CMS_FUNCTION name="Navigation" resultname="fr_nav">

    <CMS_PARAM name="expansionVisibility" value="all"/>

    <CMS_PARAM name="wholePathSelected" value="1" />

    <CMS_VALUE_PARAM name="root" value="ss_navRoot"/>

    <CMS_ARRAY_PARAM name="innerBeginHTML">

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

    <ul>

    ]]></CMS_ARRAY_ELEMENT>

    </CMS_ARRAY_PARAM>

    <CMS_ARRAY_PARAM name="beginHTML">

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

    <li class="$CMS_IF(#nav.hasSubFolders)$sub-menu$CMS_END_IF$ sub-menu-$CMS_VALUE(#nav.level)$">

    ]]></CMS_ARRAY_ELEMENT>

    </CMS_ARRAY_PARAM>

    <CMS_ARRAY_PARAM name="unselectedHTML">

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

    $CMS_IF(#nav.comment.isEmpty)$

    $CMS_ELSE$

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

    $CMS_END_IF$

    ]]></CMS_ARRAY_ELEMENT>

    </CMS_ARRAY_PARAM>

    <CMS_ARRAY_PARAM name="selectedHTML">

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

    $CMS_IF(#nav.comment.isEmpty)$

    $CMS_ELSE$

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

    $CMS_END_IF$

    ]]></CMS_ARRAY_ELEMENT>

    </CMS_ARRAY_PARAM>

    <CMS_ARRAY_PARAM name="endHTML">

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

    </li>

    ]]></CMS_ARRAY_ELEMENT>

    </CMS_ARRAY_PARAM>

    <CMS_ARRAY_PARAM name="innerEndHTML">

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

    </ul>

    ]]></CMS_ARRAY_ELEMENT>

    </CMS_ARRAY_PARAM>

    </CMS_FUNCTION>

    </CMS_HEADER>

    $--

    This template will create a navigation.

    --$

    <div class="navbar-collapse navbar-collapse_ collapse">

    <ul class="nav navbar-nav sf-menu clearfix">

    $CMS_FOR(for_section,

         #global.page.getChildren(class("de.espirit.firstspirit.access.store.pagestore.Section"), true)

         .toList

         .filter(section -> section.formData.st_hasNavEntry==true)

    )$

    <li class="sub-menu">

         <a href ="#section_$CMS_VALUE(for_section.id)$">$CMS_VALUE(for_section.formData.st_navLabel.convert2)$</a>

    </li>

    $CMS_END_FOR$

    $CMS_VALUE(fr_nav)$

    </ul>

    </div>

    Viele Grüße

    Peter

    0
  • Zendesk API User
    Author: mbergmann - 1/8/2018 10:57

    Hallo Peter,

    für „SPA-artiges“ bieten sich vielleicht „Dokumentengruppen“ an, schau dir das mal im ODFS an. Kurzversion: Damit kann man die Ausgabe mehrerer Seitenreferenzen (bzw. auch kompletter Strukurordner) in EINER Datei bündeln.

    Vorteil: Eine „logische“ Seite ist auch in FirstSpirit eine Seite.

    Viele Grüße

    Michael

    0
  • Zendesk API User
    Author: cobra707 - 1/9/2018 11:54

    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
  • Zendesk API User
    Author: mbergmann - 1/9/2018 12:31

    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
  • Zendesk API User
    Author: pavone - 1/26/2018 12:44

    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
  • Zendesk API User
    Author: cobra707 - 1/29/2018 8:36

    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
  • Zendesk API User
    Author: cobra707 - 1/29/2018 12:29

    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
  • Zendesk API User
    Author: mbergmann - 1/29/2018 23:41

    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
  • Zendesk API User
    Author: cobra707 - 1/30/2018 8:18

    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
  • Zendesk API User
    Author: mbergmann - 1/30/2018 10:28

    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
  • Zendesk API User
    Author: cobra707 - 1/30/2018 12:21

    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
  • Zendesk API User
    Author: mbergmann - 1/30/2018 12:42

    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

Vous devez vous connecter pour laisser un commentaire.