Charlotte_Koeni
I'm new here

Navigation in der FS Vorschau

Jump to solution

Hallo zusammen,

ich bastel gerade an einem Navigationsskript und dabei ist folgendes Problem aufgetaucht:

Ich habe eine Hauptnavigation welche die ersten fünf Ordner der ersten Ebene anzeigt, zusätzlich wird die dazugehörige zweite Ebene aufgeklappt, wenn man mit der Maus über einen Menüpunkt der ersten Ebene fährt. Dann gibt es noch eine "Content-Navigation" die alle Ordner der Ebene 2 und 3 darstellen soll. Diese wird erst angezeigt, wenn ich mit der Maus einen Menüpunkt der Ebene 2 angeklickt habe und auf die entsprechende Seite springe.

In der FirstSpirit - Vorschau funktioniert das wunderbar. Ich kann mich über die Hauptnavigation zu den Seiten durchklicken und es erscheint auf den angesteuerten Seiten ordnungsgemäß immer die linke Navigation (Content-Navigation).

Wenn ich aber direkt eine Seite der zweiten bzw. dritten Ebene in der Vorschau öffne, würde ich erwarten, dass dann auch sofort die entsprechende "Content-"Navigation angezeigt wird. Das geschieht aber leider nicht. Erst wenn ich die selbe Seite über die Hauptnavigation anklicke, öffnet sich die "Content-Navigtaion". Warum ist das so? (Es geht nur um die Vorschau in der Inhalteverwaltung)

Das Problem liegt vielleicht am Parameter "root", das Skript schafft es nicht "schnell" genug diesen zu verarbeiten und weiß dann nicht in welche Referenzen es anzeigen soll.... (Wobei das bei der Hauptnavigation zu funktionieren scheint.) Wie kann ich den Wert für "root" schon vorher auslesen und abspeichern?

Das Skript für die "Content-Navigation" sieht so aus:

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

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

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

         <CMS_VALUE_PARAM name="root" value='"pagefolder:"+#global.language.abbreviation.toLowerCase()'/>

  <CMS_ARRAY_PARAM name="beginHTML">

       <CMS_ARRAY_ELEMENT index="1"><![CDATA[$CMS_IF(#nav.hasSubFolders())$<li                              $CMS_IF(#nav.selected)$class="open"$CMS_END_IF$>$CMS_END_IF$]]></CMS_ARRAY_ELEMENT>

     </CMS_ARRAY_PARAM>

    <CMS_ARRAY_PARAM name="innerBeginHTML">

          <CMS_ARRAY_ELEMENT index="1"><![CDATA[<ul>]]></CMS_ARRAY_ELEMENT>

     </CMS_ARRAY_PARAM>

    <CMS_ARRAY_PARAM name="unselectedHTML">

           ...fast gleich wie selected...

     </CMS_ARRAY_PARAM>

    <CMS_ARRAY_PARAM name="selectedHTML">

      <CMS_ARRAY_ELEMENT index="1..2"><![CDATA[$CMS_IF(!#nav.hasSubFolders())$<li class="active">$CMS_END_IF$<a   href="$CMS_REF(#nav.ref)$">$CMS_VALUE(#nav.label.convert2())$</a>$CMS_IF(!#nav.hasSubFolders())$</li>$CMS_END_IF$]]>     </CMS_ARRAY_ELEMENT>

     </CMS_ARRAY_PARAM>

    <CMS_ARRAY_PARAM name="innerEndHTML">

            <CMS_ARRAY_ELEMENT index="1"><![CDATA[</ul >]]></CMS_ARRAY_ELEMENT>

     </CMS_ARRAY_PARAM>

    <CMS_ARRAY_PARAM name="endHTML">

            <CMS_ARRAY_ELEMENT index="1"><![CDATA[$CMS_IF(#nav.hasSubFolders())$</li>$CMS_END_IF$]]></CMS_ARRAY_ELEMENT>

     </CMS_ARRAY_PARAM>

</CMS_FUNCTION>

Es würde mich sehr freuen ein Feedback zu erhalten. (Auch wenn wahrscheinlich die Gedanken bei den Meisten nicht mehr beim Arbeiten sind 🙂

Gruß

Charlotte König

0 Kudos
1 Solution

Accepted Solutions

Hallo Frau König,

das Problem hier ist wahrscheinlich, dass bei der Vorschau aus der Inhalte-Verwaltung immer die Navigation so angezeigt wird, wie Sie für die erste gefundene Seitenreferenz zu der aktuellen Seite gültig wäre.

Aufgrund Ihrer Beschreibung tippe ich darauf, dass die Seite mehrfach in der Struktur-Verwaltung referenziert wird und die für die Vorschau verwendete Seitenreferenz sich außerhalb der angezeigten Navigation befindet.

Sie können dies einfach testen, indem Sie mal eine Vorschau in der Sprache DE aus der Struktur ausführen und dabei eine Seitenreferenz nehmen, die sich außerhalb des Teilbaums in der Struktur befindet, der für die deutsche Sprache benutzt wird. Das Verhalten müsste dann identisch mit der Vorschau aus der Inhalte-Verwaltung sein.

Wenn das so ist, wird es schwierig mit einer Lösung des Problems. Zwar lassen Sie die korrekte Navigation aufgrund sprachabhängiger Variablen darstellen [unterschiedlicher Wert für den root Knoten der Navigation], aber die Navigation ist wohl eine Standardnavigation, deren Inhalt somit davon abhängt, wo der aktuelle Knoten sich gerade befindet.

Lösung wäre es somit, nicht nur den Startpunkt der Navigation sprachabhängig zu definieren, sondern zusätzlich auch noch den aktuell ausgewählten Knoten der Navigation "vorzugeben".

Das klingt nicht uninteressant, also habe ich es mal ausprobiert. Folgendermaßen können Sie Struktur-Variablen auslesen, die in der ersten Ebene definiert wurden - und zwar für alle Seitenreferenzen, die es zu der aktuellen Seite in der Inhalte-Verwaltung gibt. Sie müssen nun nur noch die korrekte Variable prüfen (im Beispiel wird die Variable "Sprachwert" ausgelesen und dann den korrekten Wert als selectedNode übergeben.)

WICHTIG: Die entsprechenden Variablen müssen auf den Ordner gepflegt werden, die für die einzelnen Sprachteilbäume angelegt wurden. Das Beispiel geht davon aus, dass sich diese Ordner direkt unter der Struktur-Wurzel befinden.


$CMS_FOR(reference,#global.page.getIncomingReferences())$

     $CMS_SET(pageref,reference.getReferencedElement())$

     $CMS_SET(folder,pageref)$

     $CMS_FOR(i,[1..pageref.depth-1])$

          $CMS_SET(folder,folder.parent)$

     $CMS_END_FOR$

     $CMS_VALUE(folder.data.get("Sprachwert").editor.get(#global.language))$<br>

$CMS_END_FOR$

Viele Grüsse aus Dortmund,

  Holger Höbbel

View solution in original post

0 Kudos
9 Replies
Peter_Jodeleit
Crownpeak employee

Für die Vorschau ist es egal, ob man über die Client-Navigation oder über Browsing dorthing gelangt. Daher vermute ich, das es unterschiedliche Seiten sind, auf denen es nicht funktioniert. Wahrscheinlich unterscheiden die sich in der Sprache, da im Parameter "root" das Sprachkürzel abgefragt wird.

Schau doch mal, was der Dialog "Fehler der Vorschau" dazu sagt, den kann man dediziert für die einzelnen Sprachen aufrufen.

Peter
0 Kudos

Mh. Also ich öffne eine Seite der Ebne zwei bzw. drei in der Inhalteverwaltung im Sprachreiter "DE". Das bedeutet, root ist in diesem Fall ein Ordner mit dem Referenznamen "de".

- Die linke Navigation wird nicht angezeigt.

Dann klicke ich mich über die Hauptnavigation in der Vorschau nochmals zu der aktuellen Seite durch.

- Die linke Navigation wird angezeigt.

Während ich mich "durchklicke" zu der Seite wechsle ich normalerweise nicht die Sprache.

Aber ich habe jetzt mal auf die ID geachtet:

Beim Öffnen der Seite wir die Seite aus der Inhalteverwaltung angezeigt. Und wenn ich über Browsing die Seite anzeige, wir die Id aus der Strukturverwaltung angezeigt. Ich denke das das der Grund ist...

Aber wie kann ich das entweder verhindern oder aber so abändern das es passt?

0 Kudos

Hallo Frau König,

das Problem hier ist wahrscheinlich, dass bei der Vorschau aus der Inhalte-Verwaltung immer die Navigation so angezeigt wird, wie Sie für die erste gefundene Seitenreferenz zu der aktuellen Seite gültig wäre.

Aufgrund Ihrer Beschreibung tippe ich darauf, dass die Seite mehrfach in der Struktur-Verwaltung referenziert wird und die für die Vorschau verwendete Seitenreferenz sich außerhalb der angezeigten Navigation befindet.

Sie können dies einfach testen, indem Sie mal eine Vorschau in der Sprache DE aus der Struktur ausführen und dabei eine Seitenreferenz nehmen, die sich außerhalb des Teilbaums in der Struktur befindet, der für die deutsche Sprache benutzt wird. Das Verhalten müsste dann identisch mit der Vorschau aus der Inhalte-Verwaltung sein.

Wenn das so ist, wird es schwierig mit einer Lösung des Problems. Zwar lassen Sie die korrekte Navigation aufgrund sprachabhängiger Variablen darstellen [unterschiedlicher Wert für den root Knoten der Navigation], aber die Navigation ist wohl eine Standardnavigation, deren Inhalt somit davon abhängt, wo der aktuelle Knoten sich gerade befindet.

Lösung wäre es somit, nicht nur den Startpunkt der Navigation sprachabhängig zu definieren, sondern zusätzlich auch noch den aktuell ausgewählten Knoten der Navigation "vorzugeben".

Das klingt nicht uninteressant, also habe ich es mal ausprobiert. Folgendermaßen können Sie Struktur-Variablen auslesen, die in der ersten Ebene definiert wurden - und zwar für alle Seitenreferenzen, die es zu der aktuellen Seite in der Inhalte-Verwaltung gibt. Sie müssen nun nur noch die korrekte Variable prüfen (im Beispiel wird die Variable "Sprachwert" ausgelesen und dann den korrekten Wert als selectedNode übergeben.)

WICHTIG: Die entsprechenden Variablen müssen auf den Ordner gepflegt werden, die für die einzelnen Sprachteilbäume angelegt wurden. Das Beispiel geht davon aus, dass sich diese Ordner direkt unter der Struktur-Wurzel befinden.


$CMS_FOR(reference,#global.page.getIncomingReferences())$

     $CMS_SET(pageref,reference.getReferencedElement())$

     $CMS_SET(folder,pageref)$

     $CMS_FOR(i,[1..pageref.depth-1])$

          $CMS_SET(folder,folder.parent)$

     $CMS_END_FOR$

     $CMS_VALUE(folder.data.get("Sprachwert").editor.get(#global.language))$<br>

$CMS_END_FOR$

Viele Grüsse aus Dortmund,

  Holger Höbbel

0 Kudos

Vielen Dank, für Ihre ausführliche Antwort.

Ich werde es auf jeden Fall versuchen umzusetzen. Aber ich denke, ich werde mehr erfolg haben, wenn ich die Vorgänge besser verstehe. Deswegen ein paar Rückfragen/Anmerkungen zu ihrer Antwort:

das Problem hier ist wahrscheinlich, dass bei der Vorschau aus der Inhalte-Verwaltung immer die Navigation so angezeigt wird, wie Sie für die erste gefundene Seitenreferenz zu der aktuellen Seite gültig wäre.

Aufgrund Ihrer Beschreibung tippe ich darauf, dass die Seite mehrfach in der Struktur-Verwaltung referenziert wird...

-> Genau. Jede Seite kommt in jedem "Root"-Ordner vor. Also eine Seite hat mind. neun Referenzen in der Struktur.

Zwar lassen Sie die korrekte Navigation aufgrund sprachabhängiger Variablen darstellen [unterschiedlicher Wert für den root Knoten der Navigation], aber die Navigation ist wohl eine Standardnavigation, deren Inhalt somit davon abhängt, wo der aktuelle Knoten sich gerade befindet.

  • Mh. Aber ich dachte, gerade weil ich einen eindeutigen "root-Ordner" definiere, in dem die Seite nur einmal vorkommt, habe ich der Navigation eindeutig gesagt, wo sich meine Seite/mein Knoten befindet bzw. welche Referenz genommen werden soll.

Oder bedeutet das, dass sich die Navigation ZUERST auf eine Referenz aus der Strukturverwaltung festlegt (unabhängig von root) und DANACH dann den vorgebenen Root Ordner sucht. Wenn dann in dem Ast der  ausgewählten Referenz nicht der definierte root Ordner ist, wird eben nichts angezeigt!?

  • Warum funktioniert es dann bei der Hauptnavigation? hier werden ja direkt die ersten Ordner unter root angezeigt. Und das IMMER korrekt. (Seit ich diese root Variable gesetzt habe.)
0 Kudos

-> Genau. Jede Seite kommt in jedem "Root"-Ordner vor. Also eine Seite hat mind. neun Referenzen in der Struktur.

Gut - das ist sehr hilfreich für das Verständnis.

Zwar lassen Sie die korrekte Navigation aufgrund sprachabhängiger Variablen darstellen [unterschiedlicher Wert für den root Knoten der Navigation], aber die Navigation ist wohl eine Standardnavigation, deren Inhalt somit davon abhängt, wo der aktuelle Knoten sich gerade befindet.

  • Mh. Aber ich dachte, gerade weil ich einen eindeutigen "root-Ordner" definiere, in dem die Seite nur einmal vorkommt, habe ich der Navigation eindeutig gesagt, wo sich meine Seite/mein Knoten befindet bzw. welche Referenz genommen werden soll.

Oder bedeutet das, dass sich die Navigation ZUERST auf eine Referenz aus der Strukturverwaltung festlegt (unabhängig von root) und DANACH dann den vorgebenen Root Ordner sucht. Wenn dann in dem Ast der  ausgewählten Referenz nicht der definierte root Ordner ist, wird eben nichts angezeigt!?

Korrekt. Der Root Parameter sagt der Navigation, welchen Teilbaum Sie darstellen soll. Anhand des darzustellenden Teilbaums in Abhängigkeit der Position der aktuellen Seite wird dann die Navigation entsprechend erzeugt.


  • Warum funktioniert es dann bei der Hauptnavigation? hier werden ja direkt die ersten Ordner unter root angezeigt. Und das IMMER korrekt. (Seit ich diese root Variable gesetzt habe.)

Nehmen wir mal an, Sie benutzen die expansionVisibility=standard. Diese stellt den aktuellen Menüpunkt, seine Kinder, Brüder und Vorfahren da, wobei die Geschwister der Vorfahren ebenfalls dargestellt werden.

Da die aktuelle Seite sich in irgendeinem Teilbaum != dem gewünschten befindet, sind die einzigen Knoten, die dargestellt werden sollen, die Ordner auf der ersten Ebene. Nur diese stellen Sie wahrscheinlich gar nicht da, also müssten eigentlich alle Navigationen leer sein.

Das müsste dann im Umkehrschluß eigentlich bedeuten, dass Sie für die Hauptnavigation eine andere expansionVisibility benutzen, wahrscheinlich "all".

Wenn Sie nun den Parameter selectedNode benutzen, wird die Navigation so erzeugt, als würde die aktuelle Seite sich in dem Ordner befinden, den Sie angeben bzw. in dem die angegebene Seite liegt.

Das Problem, auf dass Sie stoßen könnten ist das, dass Sie als Wert für den Parameter einen String übergeben müssen [hier hilft .toString() Smiley Wink ] und das der Wert zur Verfügung stehen muss, wenn die Navigation aufgebaut wird. Hier müssten Sie probieren, ob zum Beispiel ein mittels CMS_SET gesetzter Wert vor dem Aufruf der Navigationsfunktion übergeben werden kann oder ob die Navigationsfunktion in ein Formattemplate [dort einfach entsprechende <CMS_HEADER> Tags mit der Navigation hinzufügen] ausgelagert werden muss.

Viele Grüsse aus Dortmund,

  Holger Höbbel

0 Kudos

Hallo.

Vielen Dank noch für die Antwort.  🙂

Ich habe mittlerweile das entsprechende Navigationsskript umgebaut von einem Script zu einem Formattemplate. Außerdem nutze ich statt CMS_PARAM "root" nun "selectedNode".

Genau wie sie geschrieben haben, habe ich nun das Problem diesen Parameter zu füllen.

So wie ich das sehe kann man nicht wie bei "root" statt CMS_PARAM auch CMS_VALUE_PARAM nutzen.

Das heitß der Wert muss immer eine Konstante bzw. ein String sein. Wie kann ich diesen Parameter denn dann dynamisch füllen? Ich habe bereits versucht eine CMS_SET-Variable auszugeben oder gar eine Funktion (immer mit .toString() zur Sicherheit). Aber ich habe nicht das Gefühl, dass so etwas mit CMS_PARAM funktioniert. Oder gibt es noch eine andere Möglichkeit?

Gruß

charlotte

Ps. Wie kann man den Status "als beantwortet angenommen" eigentlich wieder raus nehmen ?

0 Kudos

Hallo Charlotte,

Charlotte König schrieb:

Hallo.

Vielen Dank noch für die Antwort.  🙂

Ich habe mittlerweile das entsprechende Navigationsskript umgebaut von einem Script zu einem Formattemplate. Außerdem nutze ich statt CMS_PARAM "root" nun "selectedNode".

Genau wie sie geschrieben haben, habe ich nun das Problem diesen Parameter zu füllen.

So wie ich das sehe kann man nicht wie bei "root" statt CMS_PARAM auch CMS_VALUE_PARAM nutzen.

Das heitß der Wert muss immer eine Konstante bzw. ein String sein. Wie kann ich diesen Parameter denn dann dynamisch füllen? Ich habe bereits versucht eine CMS_SET-Variable auszugeben oder gar eine Funktion (immer mit .toString() zur Sicherheit). Aber ich habe nicht das Gefühl, dass so etwas mit CMS_PARAM funktioniert. Oder gibt es noch eine andere Möglichkeit?

Gruß

charlotte

Ps. Wie kann man den Status "als beantwortet angenommen" eigentlich wieder raus nehmen ?

Auch für selectedNode muss CMS_VALUE_PARAM funktionieren. Die Falle ist hier wahrscheinlich, dass der korrekte Wert übergeben werden muss, also zum Beispiel

<CMS_VALUE_PARAM name='selectedNode' value='"pageref:" + pageref.uid'/>

[hier auf die zwei verschiedenen Arten von Ticks achten!]

bzw.

<CMS_VALUE_PARAM name="selectedNode" value="seletedNodeVar"/>

mit $CMS_SET(seletedNodeVar,"pageref:" + pageref.uid)$

Das Ganze einfach mal testen, indem Du die selectedNode entsprechend zusammenbaust, wobei Du unbedingt den Referenznamen der entsprechenden Seite nehmen musst!

Ich würde sicherheitshalber den Wert für selectedNode im Seitentemplate "zusammenbauen" und dann das Formattemplate aufrufen, in dem dann auch direkt die Ausgabe gemacht wird.

Viele Grüsse aus Dortmund,

  Holger

0 Kudos
hoebbel
Crownpeak employee

Zu früh abgeschickt Smiley Sad

Eigentlich wollte ich zu dem P.S. noch schreiben, dass ich keine Ahnung habe, wie man das wieder rausnimmt, wenn es nicht einen entsprechenden Button [wahrscheinlich am obersten Posting] gibt Smiley Sad

0 Kudos

Yipppih. Nun funktioniert alles so wie gewünscht 🙂

Vielen Dank!!

Gruß

charlotte

0 Kudos