Zwischenüberschriften im Menü |
|
a) Sollen die Unterteilungen an bestimmte Menüpunkte gebunden sein? Soll also zb. immer über "Impressum" eine Linie oder der Text "Über uns" stehen?
b) Oder soll die Überschrift/die Linie wie "normale" Menüpunkte verschiebbar und sogar frei benennbar sein – möglicherweise sogar als "Parent" mit immer offenen Unterpunkten?
Ersteres ist einfach. Zweiteres nicht so ganz – aber auch das geht.
Und dann noch die Frage: Nur mit CSS? Oder gleich mit PHP im Template?
Mit CSS sind die Möglichkeiten etwas eingeschränkt. In jedem Fall braucht der Menüpunkt eine Klasse, die ihn eindeutig definiert. Dazu kann man zb in Showmenu2 angeben:
<a href=[link] class="pid[page_id] [classes]">….
Mit den entsprechenden Angaben im CSS kann dieser Menüpunkt (hier page_id 6) jetzt angesprochen werden:
.menu a.pid6 {height:20px;}
.menu a.pid6:before{content:"Zwischenüberschrift";}
Fallstrick: <a> wird in Menüs kaum allein für die Gestaltung verwendet, aber eine derartige Klassenangabe im <li> ist bei verschachtelten Menüs nicht eindeutig! Ein <li> kann wiederum <li><a> enthalten, die die Klasse erben würden. Dadurch würde sich ein praktisch unlösbarer Konflikt ergeben.
Außerdem können mit :before keine Tags angegeben werden; nur ein Bild oder eben reiner Text.
Klarere Verhältnisse lassen sich mit PHP schaffen:
Wir geben zb in showmenu2 an:
..<li class="li[page_id]"><a href.......>
Um im Template das Menü verändern zu können, muss man es in eine Variable schreiben. Das geht so:
ob_start(); show_menu2(0, SM2_ROOT, SM2_CURR+1, SM2_TRIM|SM2_PRETTY, '<li class="li[page_id]"><a target="[target]" href="[url]" class="[class]">[menu_title]</a>', '</li>', '<ul>', '</ul>', false, false); $themenue = ob_get_contents(); ob_end_clean();
oder
$themenu = show_menu2(0, SM2_ROOT, SM2_CURR+1, SM2_TRIM|SM2_PRETTY|SM2_BUFFER, '<li class="li[page_id]"><a target="[target]" href="[url]" class="[class]">[menu_title]</a>', '</li>', '<ul>', '</ul>', false, false);
Wir wissen: Die Zeichenkette (zb) <li class="pid8" steht immer vor dem Link, der zu Seite 8 führt. Damit können wir durch einfaches Suchen/Ersetzen vorher etwas einfügen:
$themenue = str_replace('<li class="li8">', '<li class="menuheadline">Über li8</li><li class="li8">', $themenue);
echo $themenue;
Die erste Zeile ein paar mal kopiert und die page_id + Headline geändert – Fertig sind massenweises Zwischenüberschriften.
Der Nachteil: Für jede Änderung ist ein Eingriff ins Template nötig.
Mit CSS gilt das oben gesagte: Der Menüpunkt muss mit zb class="pid[page_id]" eindeutig referenziert sein.
Mit CSS .pid10 {} kann ich diesen einzelnen Menüpunkt jetzt anfassen und ihm ein anderes Aussehen zuweisen. Das Problem dabei: Es ist immer noch ein anklickbarer Link – und dieser führt zu einer Seite, da kann man mit dem cursor tricksen, was man will.
Leichte Abhilfe schafft es, für so einen Menüpunkt einen Menulink zu verwenden und auf # oder als Link zum ersten Menüpunkt darunter setzen. Knackig? Nicht wirklich.
Ich kann eine Zwischenüberschrift als Menulink anlegen und im zb das Target „_self“ (Seiteneinstellungen) verleihen. Ein besonders Gewitzter könnte sogar im Core die Liste der möglichen Targets verändern und um ein Target "headline" erweitern.
Puffern und Aufruf in Showmenu2 wie oben, ich habe das Menü jetzt komplett in der Variablen $themenue
OK – wie kriege ich jetzt den Link-Tag <a..> weg?
Holzhammer-Methode:
$themenue = str_replace('<a target="_self" ', '<axt ', $themenue);
Da es den Tag "<axt>" nicht gibt, wird er vom Browser ignoriert. Und weil der Schlusstag "</a>" damit überflüssig ist, wird auch dieser ignoriert. Bingo: Ich habe zwar 2 x soviele Fehler im Validator, wie ich Zwischenüberschriften habe ;-) aber es funktioniert.
Sauberer, aber etwas rechenintensiver ist folgende Methode:
Wie oben entweder mit einem speziellen Target oder mit target="_self".
Jetzt weiß ich: Eine Zwischenüberschrift enthält die Zeichenkette: '<a target="_self"
Hier kann ich aufknacken:
$menuenew = '';
$menueArr = explode('<a ', $themenue);
foreach($menueArr as $entry) {
if (strpos($entry, 'target="_self"') !== 0) {
if ($menuenew == '') {$menuenew .= $entry;} else {$menuenew .= '<a '.$entry;}
} else {
$pos = strpos($entry, '>'); //das Ende des <a>-Tags finden
$entry = substr($entry, $pos, strlen($entry)); //und löschen
$entry = str_replace('</a>', '</span>', $entry); //den Schlusstag ersetzen
$menuenew .= '<span class="menuheadline"'.$entry;
}
}
echo $menuenew;
Alternativ das Ganze mit preg_replace
$themenu = preg_replace('/<a[^>|.]*target.*=.*\"_self\".*>(.*)<\/a>/siU', '<span class="menuheadline">(dollar)1</span>', $themenu);
echo $themenu;
(dollar) = $
Mit [level] lassen sich in showmenu2 auch die Ebenen der einzelnen Menüpunkte ausgeben. Damit kann man Menüpunkte über <li class="lev[level]"> per CSS oder analog den oben genannten Möglichkeiten per PHP ansprechen. Auf diese Art kann zb jeder Menüpunkt der ersten Ebene (level0) zur Zwischenüberschrift werden.
Davon macht zb das Template "Blockit" gebrauch.