Page 1 of 1

last-Klasse für letzte Navigationselemente in Untermenüs hinzufügen

Posted: Wed May 13, 2009 11:42 am
by mosag
Hallo zusammen,

ich habe zwar im Forum etwas gefunden mit dem man den letzten Navigationspunkt mit einer "last"-Klasse versehen kann, aber nichts um das auch in den Unterebenen zu tun.

Daher habe ich mir den Menü Manager und die darin enthaltene simple_navigation.tpl mal angesehen und etwas überarbeitet (kenne mich in smarty leider nicht ganz so gut aus, daher ist manches vielleicht etwas "überflüssig" programmiert, wer hier Spezi ist darf es gerne vereinfachen  ;D)

Ich habe also nach der Zeile

Code: Select all

{foreach from=$nodelist item=node}
folgendes eingefügt:

Code: Select all

01 {assign var="zaehler" value=$node->index}
02 {assign var="lastclass" value=""}
03 {assign var="lastclassadd" value=""}
04 {if $zaehler+1 < $count}
05 {assign var="zaehlerindex" value=$zaehler+1}
06 {if $nodelist[$zaehlerindex]->depth<$node->depth}
07 {assign var="lastclass" value=' class="last"'}
08 {assign var="lastclassadd" value=" last"}
09 {/if}
10 {/if}
Zeile 1-3: Variablen definieren bzw. zurücksetzen
Zeile 4: sicherstellen, dass wir nur im array aggieren
Zeile 5: einen, wahrscheinlich sinnlosen, Zähler definieren (leider ließ sich die Berechnung aus Zeile 5 nicht in Zeile 6 berechnen)
Zeile 6: vergleichen ob der nächste Navigationpunkt in einer höheren Ebene liegt als der aktuelle, daraus wird dann geschlossen, dass es der letzte Punkt in der Ebene ist und demnach eine "last" Klasse gesetzt werden kann.
Zeile 6: lastclass definieren für Elemente die noch keine Klasse haben
Zeile 7: lastclassadd definieren für Elemente die bereits eine Klasse haben
Zeile 9-10: if ende

Im Verlauf der Datei bei allen Listenelementen folgendermaßen vorgehen:

die Listenelemente die bereits Klassen haben, wie zB:

Code: Select all

<li class="currentpage">
müssen dann so ergänzt werden:

Code: Select all

<li class="currentpage{$lastclassadd}">
bei den Elementen die noch keine Klasse haben (nur das letzte):

Code: Select all

<li>
muss es nacher so aussehen

Code: Select all

<li{$lastclass}>
Im späteren HTML Quelltext würde es dann zB so aussehen:

Code: Select all

<li class="last"><a href="url..." ><dfn>2.11: </dfn>Eintrag 1</a>
oder wenn es zB der aktuelle Eintrag ist:

Code: Select all

<li class="currentpage last"><a href="url..." ><dfn>2.11: </dfn>Eintrag 1</a>
Ich habe es nur auf 2 Ebenen probiert, es müsste aber auch für beliebig viele Ebenen funktionieren.

Ansprechen kann man den Eintrag dann zB mit (in der Navigation CSS):

Code: Select all

div#menu_vert ul li.last a  { border-bottom:0px }
Kritik, Verbesserungvorschläge etc. gern gesehen (oder auch nen Link ins Forum wo es bereits eine Lösung gibt, die ich nur nicht gefunden habe  ???)

Re: last-Klasse für letzte Navigationselemente in Untermenüs hinzufügen

Posted: Wed May 13, 2009 2:24 pm
by Sonya
Ein bisschen zu kompliziert :)

Es geht mit smarty last und first in der foreach-Schleife viel einfacher http://forum.cmsmadesimple.org/index.ph ... #msg155438

Re: last-Klasse für letzte Navigationselemente in Untermenüs hinzufügen

Posted: Wed May 13, 2009 3:29 pm
by mosag
okay, danke für den Link/Tipp.  :)

Ich wollte nur keine Felder "missbrauchen", der Nachteil ist dann nämlich, wenn jemand eine neue "letzte Seite" einfügt, muss er die Info bei der zuletzt letzten Seite löschen und bei der neuen letzten Seite reinsetzen. Das mag für nicht-vergessliche-Alleinbefüller unkomplizierter sein, aber für mich vergesslichen Admin ;) (da ich nicht nur ein Projekt und ein CMS nutze) und auch für Kunden (die idR noch weniger an sowas denken  ;)) finde ich meine kompliziertere Methode universeller einsetzbar.
Trotzdem Danke!

Du scheinst Dich mit smarty gut auszukennen, weißt Du warum ich nicht direkt $nodelist[$zaehler+1] statt $nodelist[$zaehlerindex] verwenden kann?

Re: last-Klasse für letzte Navigationselemente in Untermenüs hinzufügen

Posted: Wed May 13, 2009 3:50 pm
by Sonya
mosag wrote: Ich wollte nur keine Felder "missbrauchen",
Habe ich auch nicht, für die smarty-Lösung sind keine zusätzlichen Felder notwendig. Smarty weiß von alleine, welches Element als letztes in der Schleife kommt und diese Eigenschaft kann auch abgefragt werden.
mosag wrote: finde ich meine kompliziertere Methode universeller einsetzbar.
Finde ich nicht :) Meine ist auch universell. So! :)
mosag wrote: Du scheinst Dich mit smarty gut auszukennen, weißt Du warum ich nicht direkt $nodelist[$zaehler+1] statt $nodelist[$zaehlerindex] verwenden kann?
Weil smarty nicht rechnen kann, um direkt in smarty zu rechnen sollte die Funktion math verwendet werden.

Re: last-Klasse für letzte Navigationselemente in Untermenüs hinzufügen

Posted: Thu May 14, 2009 11:28 am
by NaN
Sonya wrote:
mosag wrote: finde ich meine kompliziertere Methode universeller einsetzbar.
Finde ich nicht :) Meine ist auch universell. So! :)
Sie sind beide universell einsetzbar.
Denn bekanntlich führen ja viele Wege nach Rom ;)
Im Prinzip steckt die gleiche Idee dahinter.
Sonyas Vorschlag finde ich allerdings wesentlich eleganter.
Wenn ich mich vorher mal schlau gemacht hätte, dass man mit Smarty auch direkt auf die Position der Elemente in einer Schleife zugreifen kann, hätte ich das mit den Extra-Feldern erst gar nicht vorgeschlagen.

Übrigens gibt es da eine Smarty-Funktion namens {count} mit der man innerhalb einer Schleife zählen lassen kann:

Code: Select all

{foreach from=$nodelist item=node}
{count assign=count}
{if $nodelist[$count]->depth<$node->depth}
...
{/if}
{/foreach}
{count} macht nichts weiter alls immer um eins hochzuzählen.
Da braucht man dann math nicht dazu.

Re: last-Klasse für letzte Navigationselemente in Untermenüs hinzufügen

Posted: Tue May 19, 2009 12:53 pm
by mosag
@Sonya: oh, dann hab ich das irgendwie falsch verstanden, ich dachte du hättest irgendwo unter den Optionen von CMSMS ein Feld "missbraucht" um dort Start und Ende anzugeben und da dies ein statischer Eintrag gewesen wäre, wäre es mit verlaub nicht universell gewesen ;)

Aber wenn smarty von alleine weiß wann Anfang oder Ende ist, ist Deine Lösung natürlich wirklich wesentlich eleganter  ::)
Ich krieche im Staub und entschuldige mich ;)

Im Prinzip hatte ich auch gedacht das smarty sowas kann, aber ich habs leider in der Doku nicht gefunden, wahrscheinlich weil ich an der falschen Stelle gesucht habe, oder nicht weit genug nach unten gescrollt habe ...

Aber daran sieht man wieder wie sich Wissen vermehrt, wenn man es teilt ;D

Re: last-Klasse für letzte Navigationselemente in Untermenüs hinzufügen

Posted: Wed May 20, 2009 3:21 pm
by Sonya
mosag wrote: Ich krieche im Staub und entschuldige mich ;)
;D