Drupal 6 | Lösung: Freistehendes Untermenü
am 16.07.2009 - 00:32 Uhr in
Hallo,
ich befinde mich seit einigen Tagen auf dem Drupal-Way und bin doch recht begeistert. Dennoch bin ich auf ein Problem gestoßen.
Vorab: Ich hoffe, dass ich im richtigen Forum gelandet bin.
Mein Problem:
Ich wollte an einem Ort der Website das Hauptmenü einbinden - und zwar nur die erste Ebene. Das funktioniert soweit (ist ja Standard) jedoch wollte ich nun an einem anderem Ort die Untermenüs einbinden und hier kamen die Probleme, denn:
- beim Untermenü darf die erste Ebene nicht autauchen wegen der Verdoppelung.
- Das Untermenü muss auf jeder Seite angezeigt werden, die zu einem bestimmten Menüpunkt gehört
- das ganze mit Anzeige der momentanen Seite im Untermenü (Das ist nicht wirklich ein Problem, da dies ja ebenfalls im normalen Menü über CSS geht)
Die Suche:
Also ich hab echt lange gesucht und nichts wirklich gutes gefunden ausser vielleicht http://drupalmodules.com/module/menu-block , aber so, wie ich das verstanden habe, muss man für jede Kategorie Untermenüs erstellen, was ich als nicht sehr benutzerfreundlich empfand.
Die Lösung, wie sie sein soll:
Man nimmt sich das Menü-Array vor, klabustert es auseinander und schreibt eine Theming-Funktion, die man um das Attribut "Level" oder "Anfangstiefe" erweitert, um später das Menü so -und mit allen Funktionen- angezeigt zu bekommen, wie es Drupal mit einem Komplettmenü kann.
Meine Lösung (Nachteile):
Vorneweg: die Lösung ist Dirty, aber funktioniert ;-) . Dennoch will ich die Nachteile aufzeigen, weil es nichts stressigeres gibt, als etwas zu installieren, um später zu merken, dass das Installierte nicht das erfüllt, was man erwartet ;-). An dieser Stelle möchte ich auch gleich sagen, dass ich WEISS, dass es schlecht ist (Selbst das Forum hat den Codeblock verschluckt, da er zu lang war und ich keine Schleife genutzt habe). Dennoch erfüllt es meine Anforderungen. Sollten sich diese erhöhen, werde ich es verbessern.
- nur bis zur 4. Ebene (erweiterbar)
- nur die Menüpunkte, die jeweils 1 Ebene unter (tiefer) der Ebene des Dokuments sind, werden angezeigt
- und man sieht auch nicht von vornherein, dass sich unter einem Menüpunkt weitere Menüpunkte verbergen
Beispiel:
- Hauptlink A
--- Untermenüpunkt A-1
--- Untermenüpunkt A-2
----- Untermenüpunkt A-2-1
----- Untermenüpunkt A-2-2
----- Untermenüpunkt A-2-3
--- Untermenüpunkt A-3
----- Untermenüpunkt A-3-1
- Hauptlink B
- Hauptlink C
Was uns interessiert ist nur das Untermenü. Die Hauptlinks befinden sich an einer anderen Stelle:
--- Untermenüpunkt A-1
--- Untermenüpunkt A-2
----- Untermenüpunkt A-2-1
----- Untermenüpunkt A-2-2
----- Untermenüpunkt A-2-3
--- Untermenüpunkt A-3
----- Untermenüpunkt A-3-1
Das Problem ist, wenn ich auf Untermenüpunkt A-2-2 bin, wird folgende Struktur angezeigt:
--- Untermenüpunkt A-1
--- Untermenüpunkt A-2
----- Untermenüpunkt A-2-1
----- Untermenüpunkt A-2-2 <-- Aktive Seite
----- Untermenüpunkt A-2-3
--- Untermenüpunkt A-3
----- Untermenüpunkt A-3-1 fehlt quasi (weil --- Untermenüpunkt A-3 nicht offen ist).
Meine Lösung (Vorteile):
- Die "Kategorie", zum Beispiel "Hauptlink A" ist verfügbar
- Unterscheidung Externer/Interner Link und recht performant gecodet
- HTML-Ausgabe nachvollziehbar und änderbar (bei zum Beispiel custom-Klassen)
- der "Weg zur Datei" wird angezeigt (ähnlich eines Breadcrumbs). Ich vergebe zum Beispiel ID="current" für aktive Menüpunkte. Nehmen wir wieder das Beispiel mit A-2-2 als aktive Seite:
--- Untermenüpunkt A-1
--- Untermenüpunkt A-2 --> current
----- Untermenüpunkt A-2-1
----- Untermenüpunkt A-2-2 <-- Aktive Seite --> current
----- Untermenüpunkt A-2-3
--- Untermenüpunkt A-3
Ich hoffe, das hilft dem ein oder anderen und ich werde nicht gleich auseinandergenommen ;-) Konstruktive Kritik ist natürlich gerne gesehen.
Genug "geredet" - hier der Code:
AUFRUF (in der page.tpl.php), (Beispiel):
<?php
$nwShowMenu = nwShowMenu('primary-links',1, 'html');
if ($nwShowMenu) {
?><div class="rightMenu"><div class="rightTitle"><?=$nwShowMenu['activeParent'] ?></div>
<?php
print $nwShowMenu['links'];
?>
</div>
<?php } ?>Wenn die aktive Seite keine Untermenüs hat (in unserem Fall z.Bsp. bei "Hauptlink B") gibt nwShowMenu() FALSE zurück.
Parameter:
- Navigation (hier 'primary-links')
- Level oder Tiefe, wo das Menü beginnen soll (hier Eins. Null wäre ein Hauptlink)
- Ausgabe (hier 'html').
- Möglichkeiten:
- leer (nicht angeben) oder 'raw' --> Ausgabe der angegebenen Tiefe (level) als Array
- 'html' --> Formatierte Ausgabe Links. Klassen können angepasst werden
Funktionen für die template.php
http://pastebin.com/f3affec05 /bzw. siehe unten die Datei (edit[stborchert]: der Filter kann mit solch langen Code-Blöcken anscheinend nicht umgehen)
Liebe Grüße
Lars
Edit:
Vielen Dank für das Edit an [stborchert] , bin gestern beinahe verzweifelt, weil ich nicht wusste, was ich falsch gemacht habe :-) Der Beitrag wollte einfach nicht erscheinen.
| Anhang | Größe |
|---|---|
| forumbeitrag_20090_codeteil2.txt | 7.21 KB |
- Anmelden oder Registrieren um Kommentare zu schreiben

Neue Kommentare
vor 2 Wochen 14 Stunden
vor 2 Wochen 1 Tag
vor 2 Wochen 2 Tagen
vor 2 Wochen 6 Tagen
vor 2 Wochen 6 Tagen
vor 3 Wochen 3 Tagen
vor 3 Wochen 3 Tagen
vor 3 Wochen 3 Tagen
vor 6 Wochen 11 Stunden
vor 6 Wochen 1 Tag